Shell-Script
如何正確輪詢後台腳本的存在
我對以下類型的腳本有疑問:
#!/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
,但這會找到anylong_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