999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Linux Shell在衛星定軌軟件中的應用

2014-08-22 01:00:06馬宏陽張龍平
全球定位系統 2014年6期

馬宏陽,張龍平

(1.中國測繪科學研究院,北京 100830;2.山東科技大學,山東 青島 266510)

0 引 言

Linux是一套可免費使用和自由傳播的類UNIX操作系統,經過近20年來的發展,Linux成為了一個支持多用戶、多進程、多線程,實時性較好、功能強大而穩定的操作系統,它也是目前支持硬件平臺最多的操作系統[1-3]。除了桌面領域,Linux在其他領域都取得了巨大的進步和成功。其開放、安全、穩定的特性得到越來越多用戶的認可,許多導航定位領域廣泛應用的軟件都是基于Linux開發[4],如GAMIT/GlobK、GIPS、Bernese、PANDA等。許多IGS分析中心也將Linux作為平臺操作系統。Linux自誕生以來發布了許多不同的版本,常見的有Slackware、RedHat、Debian、Fedora、S.u.s.E.等。本文的實驗環境選擇了S.u.s.E. 11,它是2008年發布的S.u.s.E.版本,是一個開放的、創新的、具有前瞻性的免費Linux系統。

Shell是一種具備特殊功能的程序,它提供了用戶與內核進行交互操作的一種接口,它接受用戶輸入的命令,并把它送入內核去執行[5-6]。內核是Linux系統的心臟,當用戶登錄Linux系統時,Shell就會被調入內存執行。Shell獨立于內核,它是連接內核和應用程序的橋梁,并由輸入設備讀取命令,再將其轉為計算機可以理解的機械碼,Linux才能執行該命令。本文根據實際工作經驗,詳細介紹了C Shell語言在Linux系統下輔助衛星定軌軟件起到的作用。

1 數據下載

數據解算的第一步是下載所需的數據,如觀測文件、廣播星歷和頻間偏差等文件,對于衛星定軌而言,需要下載幾十甚至上百個觀測站的數據,如果手動下載會非常繁瑣,本節介紹兩個常用的數據下載命令。

1.1 wget命令

以下載MGEX觀測站的多模觀測文件的小時文件為例,其命令為

set pth=/cddis.gsfc.nasa.gov/pub/gnss/data

set site-list=site-list-mgex

set chour=(a b c d e f g h i j k l m n o p q r s t u v w x)

set ihour=$hour+1

foreach s (`cat $site-list`)

wget ftp://$pth/hourly/$yyyy/$doy/$hour/$s$doy$chour[$ihour].$yy"o.Z"

end

其中,$pth為MGEX數據下載路徑;$yyyy、$doy、$hour分別為年、年積日、小時,均可以作為變量輸入;$site-list為需要下載的站列表文件;$yy 為兩位數的年;foreach為循環站列表文件,并將站名賦給$s;$s$doy$chour[$ihour].$yy"o.Z"即為需要下載的某個測站小時觀測文件名稱,全部使用變量表示,因此利用該腳本,可以下載任意時段的指定站列表小時數據。

該網站的數據可以免費下載,若下載數據的ftp地址設置了用戶名和密碼,可以將命令改寫為

wget-ftp-user=user_name-ftp-password

=secret

值得注意的是,wget會不斷的嘗試下載沒有下載成功的數據,因此有必要介紹兩個常用的參數,-t為設置下載嘗試次數,-w為設置下載最大時長,均可以避免在一個站上消耗大量時間。

一般IGS站的小時觀測文件延遲半小時之內上傳,而MGEX站會延遲更長時間,因此有可能出現在下載時刻數據還沒有上傳的情況,因此最好是下載完成一個小時的數據后,再補下前一個小時的數據,命令為

while (0 < 1)

@ hour=$hour-1

if($hour < 0)then

@doy=$doy-1

if($doy==0)then

@yyyy=$yyyy-1

@doy=`dpy $yyyy`

endif

@ hour=23

endif

set hour=`echo $hour | awk '{printf("%2.2d",$1)}'`

set doy=`echo $doy | awk '{printf("%3.3d",$1)}'`

……

end

該腳本實現將時間調至前一個小時,while (0 < 1)給出一個死循環,只要不結束該腳本,它就會一直循環補充下載前一個小時的觀測文件;若是出現跨天的情況,則年積日減1,$hour變為23,若是出現跨年的情況,則年減1,年積日為該年的最后一天,@ doy=`dpy $yyyy`為調用“dyp”命令,計算該年有多少天;awk '{printf("%2.2d",$1)}為將$hour寫成兩位數的小時,同樣,$doy也寫成三位數的年積日,這是為了和下載目錄向對應。

既然給出了while (0 < 1)的死循環,肯定有一個時刻要將該腳本關閉。可以首先使用“ps-ef”查看該腳本運行的ID,再使用“kill-9 %ID”強制關閉腳本的進程。使用這種方法每次都需要人工查看腳本ID,不適合自動化運行,因此可以使用如下結束進程的腳本:

set name="get_hourly"

set id=`ps-ef | grep "$name" | grep-v"$0" | grep-v"grep" | awk’{print $2}’

kill-9 $id

這樣,僅給出需要結束的進程名稱(get_hourly),腳本就可以自動獲取其進程ID,結束該進程。

1.2 mget命令

該命令與wget命令的區別是,wget每下載一個數據都要登入和登出一次,而mget登入后,會將所需文件全部下載完畢才登出,從理論上講,mget會比wget的效率更高。由于使用mget命令需要登錄對方服務器,因此必須設置用戶名和密碼,其命令為

if(!-d./$yyyy)then

mkdir $yyyy

cd./$yyyy/

mkdir $doy

cd $pth-pwd

endif

set file-name=""

foreach s (`cat $site-list`)

set file-name=($file-name $s$doy$chour[$ihour].$yy"o.Z")

end

set HOST="cddis.gsfc.nasa.gov"

set USER="anonymous"

set PASS='^M'

ftp -inv $HOST ?EOF

user $USER $PASS

cd/gnss/data/campaign/mgex/hourly/rinex3/$yyyy/$doy/$hour/

mget $file-name

bye

EOF

該腳本首先判斷有沒有存放數據的文件夾,若沒有,建立年和年積日的文件夾;由于登入對方服務器有許多操作限制,因此需要事先定義好需要下載的文件名$file-name;該網站的數據可以免費下載,可以使用"anonymous"匿名登錄,登錄密碼'^M'相當于“回車”的作用;語句“ftp-inv”相當于登入對方服務器,許多Cshell命令在該狀態下無法使用。

以下載小時觀測文件為例,下載小時廣播星歷文件也類似。

2 文件合并

為保證超快速軌道解算的實時性,國際IGS分析中心一般使用小時文件合并成天文件進行解算。另外,最終產品可能需要一個周或更長的時間進行解算,這需要將多天的文件合并成一個文件。這一節介紹小時文件合并和天文件合并。

合并文件之前,需要將準備合并的小時文件放到一個文件夾中,然后使用命令:

set f-day=$s$doy"0."$yy"o"

foreach s ('ls $s$doy*.$yy"o"')

if(-e $f-day)then

cat $s | awk ’/BEIN/{i=0}/END OF HEADER/{i=NR} {if(NR> i && i!=0)print $0}’? $f_day

else

cat $s? $f-day

endif

end

其中,$f-day為該站合并后天文件文件名;$s$doy*.$yy"o"為該站的小時文件名,“*”為通配符,代表小時文件的標識a~z;“if(-e $f-day)”為判斷是否已經存在合成的天文件,若不存在,則將頭文件和數據記錄一起寫入天文件中,若存在,則將標識符“END OF HEADER”之后的數據記錄寫入天文件中,由于每個小時文件都有頭文件,使用這種判斷可以避免天文件中有多個頭文件。

天文件合并的方法與小時文件合并類似,僅需要將$s$doy*.$yy"o"改為$s*"0."$yy"o"即可。

值得注意的是,MGEX使用3.xx格式的多模觀測數據,其數據格式與2.xx有較大區別:其一是在頭文件中加入了更多的觀測類型,如圖1所示;其二是數據記錄方式也隨頭文件做了修改。

圖1 RINEX3.02格式文件(部分)

在該頭文件中可以看出,該站觀測到了G(GPS)、S(SBSA)、R(GLONASS)、E(GALILEO)、C(BDS),由于每個小時觀測到的衛星系統不盡相同,因此在合并成天文件后會出現頭文件觀測類型和數據記錄不相符的情況,這就為后續使用該觀測文件埋下了隱患。為了避免這種情況發生,使頭文件和數據記錄統一,應該首先遍歷需要合并的小時觀測文件,找到頭文件觀測類型最多的小時文件作為天文件的頭文件。因此,上述合并文件腳本可以進一步優化為

foreach s (`ls $s$doy*.$yy"o"`)

set bb=` grep -n "SYS/#/OBS TYPES" "$s" | head-1 | cut -d ":"-f 1 '

set cc=` grep -n "SYS/#/OBS TYPES" "$s" | tail-1 | cut -d ":"-f 1'

@ aa=$cc-$bb

set aa1=0

if($aa> $aa1)then

at $s | awk '/BEIN/{i=0}/END OF HEADER/{i=NR} {if(NR < i && i!=0)print $0}'? $f_day

endif

@ aa1=$aa

end

該腳本的目的是以頭文件觀測類型最多的小時文件作為天文件的頭文件,其中$bb和$cc分別為查找"SYS/#/OBS TYPES"標識符的起始行和結束行,然后做差,取其差后$aa最大的小時文件的頭文件作為天文件的頭文件。

3 數據傳輸

3.1 數據傳輸(內網)

一般一個服務器組都是由多臺服務器構成。它們之間通過內網相互聯系,如圖1所示。內網的跨服務器數據傳輸可以用以下命令:

scp root @99.99.99.1: root/data/obs/$yy

yy/$doy/*.*o./

scp -r root @99.99.99.1: root/data/nav/$yyyy/$doy./

第一個scp是從內網地址99.99.99.1的服務器中指定目錄下的觀測文件拷貝到運行該命令的服務器的當前路徑下;第二個添加了控制“-r”,是拷貝整個文件夾。

由于命令跨服務器拷貝數據,因此需要手動輸入登入服務器的用戶名和密碼,這使數據拷貝變得不是很方便,而設置密鑰可是省略輸入密碼這一步驟。具體命令如下:

cd/.ssh

ssh-keygen-t rsa

將id_rsa文件中的密鑰拷貝到另一臺服務器的相應位置,就可以實現兩臺服務器數據自由傳輸。

圖2 內網與外網

3.2 數據傳輸(外網)

設置密鑰傳輸數據僅限于內網的服務器和臺式機之間而外網傳輸可以向任意一臺聯網的計算機傳輸數據,傳輸數據的命令為

set file_name=igs$week$dow.sp3

set HOST="999.999.0.1"

set USER="user_name"

set PASS='secret'

ftp -inv $HOST ?EOF

user $USER $PASS

put $file_name

bye

EOF

該命令與mget命令相似,首先登入對方服務器,再使用put命令上傳。

4 自動化運行與錯誤提示

若是想要將腳本和軟件每天都定時運行,人工方法會很繁瑣,因此,可以考慮將其加載為自動化運行。將需要自動運行的腳本寫入一個新文件auto當中:

30*/1 * * */bin/csh/root/shell/get-hourly>/root/log/get.log 2>&1

該命令的時間“30 */1 * * *”為每年、每月、每天的每小時30分運行“get_hourly”腳本,由于自動運行全部在后臺,不會輸出任何顯示信息,因此將其運行中輸出的信息通過“>/root/log/get.log 2>&1”賦給一個日志文件,方便檢查運行的狀態及出現的錯誤。將需要自動運行的命令全部寫好后,執行“crontab auto”命令,將其加載到后臺中,命令到運行時間就可以自動運行。為了防止自動運行的腳本到了規定時間還沒有結束而影響其他的進程,可以用“kill”命令將其強制結束。

自動運行的情況只能在輸出的log文件中查看,不能實時的發現錯誤并進行改正。可以在關鍵步驟使用飛信進行報錯提醒,若是運行出現問題,飛信就會發送短信到指定的手機上。先安裝Linux系統版的飛信,再利用以下腳本進行短信錯誤預警:

set file_name=check_file

set lstop='cat $file_name | grep ’ERROR’

if("$lstop"=="")then

echo $file_name is Normal End>/root/log/file.log 2>&1

else

echo $file_name’ is not Normal End>/root/log/file.log 2>&1

/opt/fx/fetion -mobile=188****3047 -pwd=billgis3d -to=188****3048 -msg-utf8=$file_name’ is error’-debug

echo $?

endif

其中,需要檢查名為“check_file”的文件中是否有“ERROR”提示,若是沒有則表示運行正常,若有,則一方面向log文件輸出文件不正常,一方面登錄飛信,向負責該文件生成的負責人發送短信。

5 結束語

本文根據作者的實際工作經驗,總結了Linux Shell在衛星定軌軟件設計中的應用,主要有數據下載與合并、文件傳輸、自動運行與報錯等,可以為從事衛星導航定位領域的科研人員或工作人員提供參考。但本文介紹的只是利用Cshell語言作為工具,本文提到的功能也可以用其他的語言實現,這里僅是提供一種思路和手段。

[1]劉文峰,李程遠,李善平.嵌入式Linux操作系統的研究[J].浙江大學學報·工學版,2004,38(4): 447-452.

[2]鄒 勇,王 青,李明樹.Linux內核的實施支持的研究與實現[J].計算機研究與發展,2002,39(4): 466-472.

[3]劉善平,劉文峰,王煥龍,等.Linux與嵌入式系統[M].北京:清華大學出版社,2003.

[4]景月娥.衛星定軌可視化軟件的實現與應用研究[D].西安: 國家授時中心,2011.

[5]閆生超.基于BASH腳本的Unix環境下多組件部署管理框架[J].計算機系統應用,2012,21(10): 61-65.

[6]白 云,喻 莉,謝長生.一個基于Bash的輕量級構建系統的設計與實現[J].計算機科學,2013,40(11): 8-12.

主站蜘蛛池模板: 人妻精品全国免费视频| 午夜福利无码一区二区| 天天综合网色中文字幕| 国产欧美中文字幕| 欧美一区二区福利视频| 97国产在线播放| 九色视频在线免费观看| 日韩欧美视频第一区在线观看| 国产在线麻豆波多野结衣| 久久公开视频| 亚洲人网站| 91精品国产麻豆国产自产在线| 乱码国产乱码精品精在线播放 | 看av免费毛片手机播放| 日韩成人午夜| 亚洲综合片| 在线国产欧美| 欧美日韩国产成人高清视频| 国产亚洲精久久久久久无码AV| 免费人成视网站在线不卡| 99久久精品国产麻豆婷婷| 亚亚洲乱码一二三四区| 国产成人区在线观看视频| 四虎成人精品| 日韩精品无码免费一区二区三区| 天堂岛国av无码免费无禁网站| 91 九色视频丝袜| 黄色网址免费在线| 在线观看精品国产入口| 乱人伦视频中文字幕在线| 无码丝袜人妻| 国产高清色视频免费看的网址| 亚洲三级色| 国产麻豆永久视频| 幺女国产一级毛片| 国产一级视频在线观看网站| 精品视频一区在线观看| 亚洲男人的天堂网| av在线人妻熟妇| 2021国产v亚洲v天堂无码| 青青国产在线| 国内精自线i品一区202| 中国特黄美女一级视频| 三级国产在线观看| 成人精品区| 国产区成人精品视频| 青青青亚洲精品国产| 精品国产自在现线看久久| 欧美成人第一页| 中文一区二区视频| 久综合日韩| 亚洲黄色成人| 黄色网址免费在线| 国产AV无码专区亚洲A∨毛片| 国产成人精品男人的天堂下载| 色婷婷在线播放| AV天堂资源福利在线观看| 国产免费福利网站| 欧美福利在线| 欧美日韩精品一区二区在线线| 亚洲精品桃花岛av在线| 成人福利在线免费观看| 91网红精品在线观看| 亚洲乱码精品久久久久..| 国产在线拍偷自揄拍精品| 国产欧美精品一区二区| 精品国产福利在线| 国产男女免费视频| 91精品国产综合久久不国产大片| 色综合网址| 亚洲天堂成人| 91精品啪在线观看国产91| 天天色天天综合| a在线亚洲男人的天堂试看| 最新国产麻豆aⅴ精品无| jizz国产视频| 国产精品久久精品| 99热这里只有精品久久免费| 最新国产高清在线| 国产亚洲欧美日韩在线一区二区三区| 免费人成视频在线观看网站| 亚洲色图综合在线|