【工具Github主頁】
該命令集可以非常方便地向遠(yuǎn)程主機(jī)/服務(wù)器上傳文件、運(yùn)行遠(yuǎn)程腳本、下載文件等。
目錄:
目的
交互式地輸入ssh、scp命令進(jìn)行遠(yuǎn)端主機(jī)命令/腳本的執(zhí)行、文件的上傳與下載并不是很方便,有時候頻繁地鍵入hostname@ip也是一件非常痛苦的事情。另外一方面,如果是向計算平臺提交任務(wù)腳本,在遠(yuǎn)端文本命令窗口內(nèi)修改作業(yè)參數(shù)以及調(diào)試運(yùn)行腳本也是蠻不方便。所以倉庫里腳本是為了能夠比較方便地執(zhí)行這一些任務(wù)。
命令集內(nèi)置ssh、scp、qsub、qstat命令,分別用于運(yùn)行遠(yuǎn)程腳本、命令、上傳/下載文件、提交作業(yè)和查看作業(yè)狀態(tài)。
下載與使用
或克?。?/p>
git clone https://github.com/ShixiangWang/sync-deploy.git
下載后執(zhí)行add_path.sh腳本將命令添加到環(huán)境路徑中,這樣無論你處于什么目錄都能使用。
cd sync-deploy/src
./add_path.sh
除了sync-command命令沒有選項,其他命令基本都有選項需要指定。
對應(yīng)地,除了sync-command其他命令都有-h選項,你可以獲取幫助。
sync-upload -h
sync-download -h
sync-run -h
sync-deploy -h
sync-check -h
準(zhǔn)備與配置
首先在服務(wù)器端配置本地機(jī)器的公鑰,以便于實(shí)現(xiàn)無密碼文件傳輸。
參考文章ssh-keygen基本用法或其他資料生成公鑰和私鑰(搜索引擎可以找到一大堆這樣的博文,我就不啰嗦了)。
將公鑰id_sra.pub(本地機(jī)器.ssh子目錄下)中文本內(nèi)容拷貝到服務(wù)器.ssh子目錄中的authorized_keys中,放在已有文本后面。如果該文件不存在則創(chuàng)建。
進(jìn)行測試,如果不需要密碼登錄則成功。
然后點(diǎn)擊打開當(dāng)前目錄(src/)的sync-setting文件,將遠(yuǎn)程主機(jī)的host名與ip地址改為你自己的。
如果你想要在計算平臺部署任務(wù),請點(diǎn)擊打開當(dāng)前目錄下的qsub_header文件填入PBS參數(shù),設(shè)置可以參考我整理的或者百度上的其他資源,例如1,2等。
接著在當(dāng)前目錄的commands文件夾填入你要運(yùn)行的命令。如果你想要運(yùn)行其他腳本,請在該文件中調(diào)用執(zhí)行。
命令說明
sync-command
這個命令最簡單粗暴,直接在sync-command后接你想要在遠(yuǎn)端執(zhí)行的命令。
$ sync-command ls -l '~/test'
總用量 0
-rw-rw-r-- 1 liuxs liuxs 12 1月 30 19:20 job_id
-rw-rw-r-- 1 liuxs liuxs 34 1月 30 19:20 result.txt
-rw-rw-r-- 1 liuxs liuxs 110 1月 29 11:40 test.R
-rwxrw-r-- 1 liuxs liuxs 240 1月 30 19:20 work.sh
需要注意的是如果是想使用類似~這種映射到某個路徑的符號,需要添加引號,不然它會被解析為本地地址,那當(dāng)然會出問題的
sync-upload
上傳文件到遠(yuǎn)程主機(jī)。
用法:
Usage: sync-upload -n local_files -d 'destdir'
-n選項后接你要上傳的(本地機(jī)器)文件/目錄路徑,-d選項接遠(yuǎn)程主機(jī)上的目錄路徑。
用法示例:
==> examples:
sync-upload -n work.sh -d /public/home/liuxs/test
or
sync-upload -n work.sh -d '~/test'
同樣注意使用~時需要加引號。
重點(diǎn)注意不支持-n與-d倒過來寫,也就是選項是有順序的,為什么如此的原因是為了使-n選項后能夠接大于1個的路徑參數(shù),命令腳本內(nèi)部利用了-n和-d的位置特點(diǎn)運(yùn)用正則表達(dá)式抓取所有路徑名,你可以利用該命令同時上傳不止一個文件/目錄(也算是有得有失吧)。
sync-download
從遠(yuǎn)程主機(jī)下載文件到本地機(jī)器。
用法:
Usage: sync-download -n 'remote_files' -d localdir
這個命令的使用基本和sync-upload一致。
用法示例:
==> examples:
sync-download -n '~/test/*' -d ./test
or
sync-download -n /public/home/liuxs/test/* -d ./test
同樣地,不支持-n與-d選項順序反著寫。
sync-run
提交遠(yuǎn)程主機(jī)的作業(yè),內(nèi)置qsub命令向計算平臺提交任務(wù)腳本。如果只是想要運(yùn)行遠(yuǎn)程腳本或命令,請查看sync-command命令。
用法:
sync-run -f work_script
-f選項后接你要運(yùn)行的一個腳本(需要指定腳本的路徑哈)。
用法示例:
sync-run -f /home/wsx/work.sh
sync-deploy
上傳文件、提交作業(yè)一氣呵成。
該命令內(nèi)置調(diào)用sync-upload和sync-run這兩個命令,以及其他幾個腳本。在進(jìn)行相關(guān)配置后,它可以根據(jù)qsub_header和commands兩個文本自動生成作業(yè)腳本work.sh,上傳指定文檔(work.sh不指定也會上傳),然后提交到任務(wù)節(jié)點(diǎn)進(jìn)行運(yùn)算。
用法:
Usage: sync-deploy -n local_files -d 'destdir'
同樣注意~的使用問題,另外,如果你只部署運(yùn)行work.sh文檔,那么請在-n選項后加work.sh,(因為-n選項后不加內(nèi)容會報錯)雖然該文本會被上傳兩次,但不會影響使用。
一個實(shí)例如下:
$ sync-deploy -n work.sh -d '~/test'
==> command used: scp -pr -P 22 work.sh /home/wsx/working/sync-deploy/src/work.sh liuxs@10.15.22.110:~/test
==>
work.sh 100% 240 0.2KB/s 00:00
work.sh 100% 240 0.2KB/s 00:00
==> Files upload successfully.
==> run as batch mode.......
job_id file locate at ~/test/job_id , id is
87728.node1
==>
==> The work deploy successfully.
sync-check
用來查看作業(yè)狀態(tài)。
用法:
Usage: sync-deploy -n id
如果指定-n選項加上作業(yè)號,會查詢指定的作業(yè)狀態(tài),如果不指定,會查看所有的作業(yè)狀態(tài)。
任務(wù)部署后會返回作業(yè)號,剛提交了兩個作業(yè),我們來查一查。
$ sync-check -n 87730
Job ID Name User Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
87730.node1 work.sh liuxs 00:00:00 C normal_3
$ sync-check -n 87730.node1
Job ID Name User Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
87730.node1 work.sh liuxs 00:00:00 C normal_3
$ sync-check
Job ID Name User Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
87729.node1 work.sh liuxs 00:00:00 C normal_3
87730.node1 work.sh liuxs 00:00:00 C normal_3
計算操作實(shí)例
我們來通過一個完整的實(shí)例來了解這些命令。
我們的任務(wù)是利用遠(yuǎn)程的計算平臺運(yùn)行一些shell命令,執(zhí)行一個R腳本。
該R腳本位于src/的test目錄下,這個腳本我們可以看做我們?nèi)粘9ぷ鬟\(yùn)行的主腳本。
我們需要準(zhǔn)備什么呢?
只需要正確填寫qsub_header與commands文檔即可。
我們先看看qsub_header的內(nèi)容:
#PBS -l nodes=1:ppn=10
#PBS -S /bin/bash
#PBS -j oe
#PBS -q normal_3
# Please set PBS arguments above
上述就是一些PBS選項和參數(shù),按你自己的需求和正確寫法填寫即可。這里測試我就簡單地設(shè)定了節(jié)點(diǎn)與隊列。具體參數(shù)你可以百度或者參考說明文檔前面提供的信息。
再瞧瞧commands文檔:
# This job's working directory
cd ~/test
# Following are commands
sleep 20
echo "Thi mission is run successfully!!" > ~/test/result.txt
# call Rscripts
Rscript ~/test/test.R > ~/test/result2.txt
這個文檔可能是我們工作主要需要修改的地方,這里我們用cd命令設(shè)定(作業(yè)的)工作目錄,為避免任務(wù)結(jié)束太快,調(diào)用sleep命令讓機(jī)器睡幾秒,然后調(diào)用echo將一些文字結(jié)果傳入一個結(jié)果文件,最后調(diào)用一個R腳本,并將結(jié)果傳入另一個文件。
R腳本的內(nèi)容也非常簡單,就是輸入幾行文本:
print("==>")
print("==> Hello world!!!!!!!!")
print("==> ")
為避免程序找不到或者找錯文件,我們最好指定文件所在的全部路徑。
讓我們開始跑命令吧~
任務(wù)方案很簡單,我們將test.R上傳到遠(yuǎn)程主機(jī)的工作目錄下,注意,work.sh也會自動生成并上傳,它的內(nèi)容就是qsub_header與commands的結(jié)合體。然后執(zhí)行work.sh文本,然后將輸出結(jié)果傳回來。
上傳與運(yùn)行可以利用sync-deploy命令一步搞定:
# 利用add_path.sh將命令加入環(huán)境路徑后,我們可以利用tab補(bǔ)全查找命令
wsx@Desktop-berry:~$ sync-
sync-check sync-command sync-deploy sync-download sync-run sync-upload
# 利用sync-command查看目標(biāo)路徑情況
wsx@Desktop-berry:~$ sync-command "ls -al ~/test"
總用量 8
drwxrwxr-x 2 liuxs liuxs 4096 1月 30 23:52 .
drwx------ 10 liuxs liuxs 4096 1月 30 22:51 ..
# 部署任務(wù)到遠(yuǎn)程
wsx@Desktop-berry:~$ sync-deploy -n ~/working/sync-deploy/src/test/test.R -d '~/test/'
==> command used: scp -pr -P 22 /home/wsx/working/sync-deploy/src/test/test.R /home/wsx/working/sync-deploy/src/work.sh liuxs@10.15.22.110:~/test/
==>
test.R 100% 60 0.1KB/s 00:00
work.sh 100% 300 0.3KB/s 00:00
==> Files upload successfully.
==> run as batch mode.......
job_id file locate at ~/test/job_id , id is
87732.node1
==>
==> The work deploy successfully.
可以看到任務(wù)成功部署并返回了job id,利用sync-check命令查詢
wsx@Desktop-berry:~$ sync-check 87732
Job ID Name User Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
87732.node1 work.sh liuxs 00:00:00 C normal_3
因為任務(wù)時間不長,很快就搞定了,已經(jīng)出現(xiàn)了C標(biāo)志(完成)。
我們查看一下遠(yuǎn)程目錄情況:
wsx@Desktop-berry:~$ sync-command ls '~/test'
job_id
result2.txt
result.txt
test.R
work.sh
job_id文件是用來保存作業(yè)號信息的,就是前面輸出的87732.node1。其他不用解釋了。
最后一步,將需要的結(jié)果下載回本地。
我們創(chuàng)建一個臨時目錄單獨(dú)存儲,然后查看文件內(nèi)容:
wsx@Desktop-berry:~$ mkdir test
wsx@Desktop-berry:~$ sync-download -n "~/test/*" -d ~/test
==> command used: scp -pr -P 22 liuxs@10.15.22.110:~/test/* /home/wsx/test
==>
job_id 100% 12 0.0KB/s 00:00
result2.txt 100% 51 0.1KB/s 00:00
result.txt 100% 34 0.0KB/s 00:00
test.R 100% 60 0.1KB/s 00:00
work.sh 100% 300 0.3KB/s 00:00
==> Files download successfully.
wsx@Desktop-berry:~$ cd test/
wsx@Desktop-berry:~/test$ ls
job_id result2.txt result.txt test.R work.sh
wsx@Desktop-berry:~/test$ cat result.txt
Thi mission is run successfully!!
wsx@Desktop-berry:~/test$ cat result2.txt
[1] "==>"
[1] "==> Hello world!!!!!!!!"
[1] "==> "
任務(wù)完成!
問題
有問題歡迎提交issue進(jìn)行討論。