由於有幾個人已經指出,因爲ps | grep
檢測到(1)腳本本身和(2)反引號創建的子進程,它繼承了主腳本的名稱,所以您的進程數量被誇大了。所以一個簡單的解決方案是將腳本的名稱更改爲不包含您要查找的名稱的名稱。但你可以做得更好。
我建議的「最佳實踐」解決方案是使用操作系統提供的工具。初始化腳本創建一個PID文件作爲啓動守護進程的一部分並不罕見;換句話說,不是隻運行守護進程本身,而是使用啓動守護進程的包裝腳本,然後將進程ID寫入某個文件中。如果不存在您的系統上start-stop-daemon
(我認爲這是這些天很常見),你可以使用像這樣:
start-stop-daemon --start --quiet --background \
--make-pidfile --pidfile /var/run/fsdaemon.pid -- /usr/bin/fsdaemon
(顯然取代路徑/usr/bin/fsdaemon
如適用)來啓動它,然後
start-stop-daemon --stop --quiet --pidfile /var/run/fsdaemon.pid
停止它。 start-stop-daemon
還有其他可能對您有用的選項,您可以通過閱讀手冊頁進行調查。
如果您沒有訪問start-stop-daemon
,你可以寫一個包裝腳本來執行基本相同的事情,像這樣開始:
echo "$$" > /var/run/fsdaemon.pid
exec /usr/bin/fsdaemon
,這阻止:
kill $(< /var/run/fsdaemon/pid)
rm /var/run/fsdaemon.pid
(當然這很粗糙,但它通常應該可以正常工作)。
無論如何,一旦你的設置來生成一個PID文件,是否使用start-stop-daemon
與否,你可以更新你的check腳本來此:
daemon_pid=`ps --no-headers --pid $(< /var/run/fsdaemon.pid) | wc -l`
if [ $daemon_pid -eq 0 ]; then
echo "restarting fsdaemon"
/etc/init.d/fsdaemon restart
fi
(人會想到會有簡短的命令檢查給定的PID是否正在運行,但我不知道它)。
如果你不想(或不能)創建一個PID文件,我至少會建議pgrep
代替ps | grep
,因爲pgrep
將名義直接搜索的過程,並不會發現任何東西,只是恰好包含相同的字符串。
daemon_pid=`pgrep -x -c fsdaemon`
if [ $daemon_pid -eq 0 ]; then
echo "restarting fsdaemon"
/etc/init.d/fsdaemon restart
fi
的-x
手段 「嚴絲合縫」,並-c
作品與grep
。
順便說一下,當它實際上是一個計數時,命名變量daemon_pid
似乎有點誤導。
只是爲了檢查顯而易見的:腳本文件的名稱不包含'fsdaemon',是嗎? –
事實上,腳本文件的名稱是「check-fsdaemon」。這也許是一個重要的原因(我看到兩個)。另一個來自命令行的grep? –
另外,'grep'進程的參數列表中有'fsdaemon'。你可以不用'-c'來驗證它。 –