Bash
如何使用遠端linux獲取在bash腳本中執行的程序的PID
我在通過 ssh 訪問 linux 機器以執行模擬的 Mac 電腦上。我目前正在並行執行多個命令(我用 & 將它們放在後台),當它們完成時,我提取感興趣的文件,然後刪除所有命令輸出並重做。
我想知道是否可以使用 PID 檢查這些任務是否已完成,以便自動提取所需文件並再次啟動完全相同的命令。我在這裡發布一條消息,以了解獲取通過 ssh -c 執行的命令的 PID,這不是我做的(因為我在遠端 linux 中)。
為了獲取 PID,我嘗試了how-to-get-pid-of-just-started-process中顯示的解決方案,但都沒有 $! ssh -c 也沒有 jobs -p 給我正確的 PID。我想知道它是否不起作用,因為我正在遠端訪問(出現在 htop 中的命令是 ssh -c …),或者我只是做得不好。
這是我的第一個 bash 腳本:
#!/bin/bash ./createFiles.sh $1 # create the needed $1 folders for i in $(seq 1 $1) do cd $i myCommand & cd .. done
當這個完成後,我使用:
#!/bin/bash for i in $(seq 1 $1) do cd $i cp output/file.txt ../file_$2_$i.txt # $2 is the number of the run cd .. done ./deleteFiles.sh $2 # delete the needed $1 folders to start anew
然後我循環 5 次這兩個。而且我想知道是否可以自動循環 5 次而不讓我站在電腦前。
如果你們中的任何人有任何想法,那就太好了:)
PS:我希望很清楚,英語不是我的母語 hihi
您正在建構 GNU Parallel :)
–transfer –return –cleanup 正在做你想做的事。
感謝@mashuptwice 的回答,我設法做到了(即:您可以使用
$$
從腳本內部獲取 PID。您還可以使用pgrep
從腳本外部查找給定程序名稱的 PID。– mashuptwice 3 月 18 日 14 點: 07)然後使用 bash
while
,我到達了我想要的地方:D-s``sleep
為了透明起見:
#!/bin/bash for j in $(seq 1 $2) do ./createFiles.sh $1 # create the needed $1 folders for i in $(seq 1 $1) do cd $i myCommand & cd .. done sleep 5 # Wait to be sure that the commands were started pgrep -u myUser myCommand > PIDs.txt while [ -s PIDs.txt ] do echo not finished yet pgrep -u myUser myCommand > PIDs.txt sleep 10 done cat PIDs.txt # Debug print ./mvFiles.sh $1 $j # extract the needed files and remove the now useless outputs rm PIDs.txt done