Shell-Script

如何正確輪詢後台腳本的存在

  • October 25, 2014

我對以下類型的腳本有疑問:

 #!/bin/sh

 long_running_script.sh &  

 while [ `pidof long_running_script.sh` ]
 do
   echo "."
   sleep 1
 done

sript 將在後台啟動一個新腳本,並且它應該列印點,直到背景腳本退出。它在 CPU 負載不高時工作。

但是,當 CPU 負載很高時,它將不起作用:long_running_script.sh 將啟動,但“父”腳本將在 long_running_script.sh 退出之前退出 while 循環。

似乎pidof在 long_running_script.sh 真正啟動(執行)之前執行。

解決此問題的最佳方法是什麼?

在 while 語句之前睡眠 1 秒沒有幫助。所以我不想使用任何魔法延遲,因為它可能不可靠。

pidof不會找到腳本,因為它只查看程序名稱的第一部分 ( argv[0])。

您可以使用pidof -m,但這會找到any long_running_script.sh,而不僅僅是此腳本啟動的那個。

更好的方法是使用$!變數,它保存最近後台作業的 PID。

#!/bin/bash

long_running_script.sh &  
pid=$!

while ps -p $pid >/dev/null
do
   echo "."
   sleep 1
done

如果您不想阻塞wait,我會使用 bash 的內置作業控制功能來解決這個問題。對於只有一個分叉和執行的過程,它真的很簡單,我的方法看起來像這樣

#!/bin/sh

sleep 1 &

while jobs | grep -q "Running" ; do
   echo -n "."     # no trailing newline
   sleep 0.1
done

echo 

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