我想要做的是啓動一個過程,如果沒有開始。以下是我嘗試啓動過程如果死了
#!/bin/bash
pid=`ps ax | grep app | grep -v grep | wc -l`
if [ $pid = 0 ]
then
/etc/init.d/app start
fi
的問題是該行
/etc/init.d/app start
不執行。這裏有什麼問題? 我知道我可以守護神工具,但我喜歡「bash」方法。
我想要做的是啓動一個過程,如果沒有開始。以下是我嘗試啓動過程如果死了
#!/bin/bash
pid=`ps ax | grep app | grep -v grep | wc -l`
if [ $pid = 0 ]
then
/etc/init.d/app start
fi
的問題是該行
/etc/init.d/app start
不執行。這裏有什麼問題? 我知道我可以守護神工具,但我喜歡「bash」方法。
查看==
運營商。
最佳可能類似於
pid=`ps ax | grep app | grep -v grep`
test -z "$pid" && /etc/init.d/app start
您可以把你的關鍵字爲正則表達式不匹配本身避免雙重grep的。你可以使用grep -c
而不是用wc
來計算。在腳本中,你可以嘗試:
pcount=`ps ax | grep -c "[a]pp"`
或者,而不是使用過程中計數的實際PID:
#!/bin/bash
pid=`ps ax | awk '/[a]pp/{print $1}'`
if ! ps "$pid" >/dev/null; then
/etc/init.d/app start
fi
注意,這仍然是一個非常糟糕的方式來處理服務的重新啓動。你應該看看應用程序是否維護自己的pid文件,也許在/ var/run /中的某處,然後測試它的內容。
#!/bin/sh
if [ -f /var/run/app.pid ]; then
if ps `cat /var/run/app.pid` >/dev/null; then
/etc/init.d/app start
fi
else
/etc/init.d/app start
fi
甚至更好,推出應用使用daemontoolsrunit或upstart或等價的東西是會照顧這些東西給你。
你瘋狂地解析'ps ax'中的pid,但你說的其餘部分是非常好的建議。 (提示:'ps ax -o pid =',或者至少'cut -f1 -d'''。 – Sorpigal 2012-04-03 12:21:34
heh。我不喜歡從'ps ax'獲取內容,但是你去了。 ,'cut -f1 -d'''將不起作用,因爲* space *與* whitespace *不一樣。如果包含pid =之外的任何內容,則ps列是右對齊的。 5,在字段4中有一個2位數的pid等 – ghoti 2012-04-03 14:47:00
對不起,我應該更具體一些。解決方法是請求'pid'列的最小大小,如下所示:'ps ax -o pid:1 =, comm ='。 – Sorpigal 2012-04-03 16:03:42
如果你有GNU ps
這很容易,不需要任何瘋狂。
if ! ps -C app >/dev/null ; then
/etc/init.d/app start
fi
你只需要小心你傳遞給ps
的app
是實際的進程名。
我現在無法檢查我的服務器,但Debian使用start-stop-daemon加載服務,它似乎是您的任務使用的正確工具,因爲它通過PID跟蹤您的後臺進程,而不僅僅匹配名稱在進程列表中(也可以這樣做)。
您是否嘗試過運行'ps ax ...'行來查看它返回的內容? – 2012-04-03 12:05:02
請'echo $ pid' – kev 2012-04-03 12:05:45
'pid'通常是一個進程ID。在這種情況下,這是一個計數。這很危險,因爲任何東西都可以將名稱放入進程表中。 – ghoti 2012-04-03 12:09:09