簡體   English   中英

在另一個(已經運行)完成之后啟動腳本

[英]Start script after another one (already running) finishes

所以我有一個進程在運行,需要幾個小時才能完成。 我希望自動完成另一個過程。 請注意,我無法在第一個腳本中添加對第二個腳本的調用,也不會創建另一個順序運行它們的腳本。 在Linux中有什么辦法嗎?

編輯:一個選項是使用pgrep每x分鍾輪詢一次並檢查過程是否完成。 如果是,請啟動另一個。 但是,我不喜歡這個解決方案。

PS:兩者都是bash腳本,如果有幫助的話。

給定第一個進程的PID,循環

while ps -p $PID; do sleep 1; done ; script2

應該做的伎倆。 這比pgrep和進程名稱稍微穩定一些。

也許你可以先按ctrl + z然后輸入

fg; echo "first job finished"

輪詢可能是要走的路,但它不一定非常可怕。

pid=$(ps -opid= -C your_script_name)
while [ -d /proc/$pid ] ; do
    sleep 1
done && ./your_other_script

您可以使用bash內置命令wait wait已經在運行的進程。 男人打擊

wait [n ...]等待每個指定的進程並返回其終止狀態。 每個n可以是進程ID或作業規范; 如果給出了作業規范,則等待該作業管道中的所有進程。 如果未給出n,則等待所有當前活動的子進程,並且返回狀態為零。 如果n指定不存在的進程或作業,則返回狀態為127.否則,返回狀態是最后一個進程或作業等待的退出狀態。

通常情況下,你的程序運行了幾個惡魔。 在這種情況下,你的pid將是一個數組。 只需使用:

PID =($(pidof -x process_name)) #這樣可以保存$ pid數組中給定進程的所有PID

現在,只需修改thiton的代碼:

while ps -p ${PID[*]}; do sleep 1; done ; script2

我遇到了類似的問題並以這種方式解決了它:

nohup bash script1.sh&

等待

nohup bash script2.sh&

我有相同的要求,並通過以下方式解決它:

while [[ "$exp" != 0 ]]; do
exp=$(ps -ef |grep -i "SCRIPT_1" |grep -v grep |wc -l)
sleep 5;
done

致電SCRIPT_2

最簡單的方法:

./script1.sh && ./script2.sh

&&表示在繼續執行script2之前等待script1的成功完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM