Bash

在遠端機器上執行程式碼並將結果複製回來

  • February 17, 2020

我正在使用一些使用一些特殊記憶體處理的舊 Fortran 程式碼。長話短說,它在我的本地機器上執行,但在遠端機器上失敗。這就是為什麼我想ssh在我的本地電腦上執行程式碼並將結果複製回我正在執行我的計算的集群。

我已經在這個論壇上找到了完全相同的問題:

編輯#1

在@Anthon 發表評論後,我更正了我的腳本,不幸的是出現了新錯誤。**注意:**我使用的是 ssh 密鑰,因此不需要密碼。

我的新腳本:

#! /bin/bash
# start form the machine_where_the_resutlst_are_needed

ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/run.sh inp 8

# do the work by running a script. 8 jobs are run by sending them 
# to the background, 

scp -p usr@machene_wehere_i_run_the_code:/home/run_dir_script/results \
 user@machine_where_the_resutlst_are_needed:~/

echo "I am back"

我的問題是run.sh一個主腳本呼叫其他 shell 腳本,它們執行不正常。我收到以下消息:

/home/run_dir_script/run.sh:第 59 行:/home/run_dir_script/merge_tabs.sh:沒有這樣的文件或目錄

最小的例子:

這是我正在做的一個簡明範例

例子run.sh

#! /usr/bin/bash

pwd
echo "Run the code"
./HELLO_WORLD

上面的腳本由

ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/run.sh    

為了完整起見,fortran 程式碼 ./HELLO_WORLD

program main
write(*,*) 'Hello World'
stop
end

使用 gfortran -o HELLO_WORLD hello_world.F90 編譯

這是輸出

/home/run_dir_script/
Run the code
/home/run_dir_script/test.sh: line 5: ./home/HELLO_WORLD: No such file or directory

評論:

The following will run `HELLO_WORLD` on the remote machine
ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/HELLO_WORLD

所以直接呼叫程式碼就可以了。通過腳本呼叫它失敗。

可能的解決方案:

失敗的原因是在 ssh 之後我登陸我的遠端機器的$HOME.

因此,在執行腳本之前,我必須cd在正確的目錄中。除了給出絕對路徑外,正確的方法是:

另一個有用的評論是,我 .bashrc 中的所有變數都是未定義的。因此,必須小心。

usr@machene_wehere_i_run_the_code "cd /home/run_dir_script ; run.sh"

所以這以某種方式有效

ssh -X usr@machene_wehere_i_run_the_code在您的程式碼之後的行之後沒有任何內容。所以該命令登錄machene_wehere_i_run_the_code並且什麼都不做。

在您引用的問題的已接受答案中的範例 ssh 呼叫中,有一個額外的參數:

ssh user@host path_to_script

path_to_script你的缺少。

我會嘗試將參數ssh放在雙引號中。

ssh usr@machene_wehere_i_run_the_code "/home/run_dir_script/run.sh inp 8"

同樣基於該錯誤消息,聽起來腳本找不到此腳本:

/home/run_dir_script/run.sh:第 59 行:/home/run_dir_script/merge_tabs.sh:沒有這樣的文件或目錄

scp如果ssh沒有返回成功狀態,我也會阻止這種情況的發生:

ssh usr@machene_wehere_i_run_the_code "/home/run_dir_script/run.sh inp 8"
status=$?

if $status; then
 scp -p usr@machene_wehere_i_run_the_code:/home/run_dir_script/results \
   user@machine_where_the_resutlst_are_needed:~/
fi

底線問題是您的腳本在遠端系統上定位從屬腳本存在問題。當您登錄並執行腳本時,可能會設置變數,而不是通過登錄並執行腳本時設置的變數ssh

對於這些,我將比較env使用這兩種方法的輸出。

引用自:https://unix.stackexchange.com/questions/168260