2012-04-03 89 views
0

我想要做的是啓動一個過程,如果沒有開始。以下是我嘗試啓動過程如果死了

#!/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」方法。

+0

您是否嘗試過運行'ps ax ...'行來查看它返回的內容? – 2012-04-03 12:05:02

+0

請'echo $ pid' – kev 2012-04-03 12:05:45

+0

'pid'通常是一個進程ID。在這種情況下,這是一個計數。這很危險,因爲任何東西都可以將名稱放入進程表中。 – ghoti 2012-04-03 12:09:09

回答

3

查看==運營商。

最佳可能類似於

pid=`ps ax | grep app | grep -v grep` 
test -z "$pid" && /etc/init.d/app start 
2

您可以把你的關鍵字爲正則表達式不匹配本身避免雙重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 

甚至更​​好,推出應用使用daemontoolsrunitupstart或等價的東西是會照顧這些東西給你。

+0

你瘋狂地解析'ps ax'中的pid,但你說的其餘部分是非常好的建議。 (提示:'ps ax -o pid =',或者至少'cut -f1 -d'''。 – Sorpigal 2012-04-03 12:21:34

+0

heh。我不喜歡從'ps ax'獲取內容,但是你去了。 ,'cut -f1 -d'''將不起作用,因爲* space *與* whitespace *不一樣。如果包含pid =之外的任何內容,則ps列是右對齊的。 5,在字段4中有一個2位數的pid等 – ghoti 2012-04-03 14:47:00

+0

對不起,我應該更具體一些。解決方法是請求'pid'列的最小大小,如下所示:'ps ax -o pid:1 =, comm ='。 – Sorpigal 2012-04-03 16:03:42

0

如果你有GNU ps這很容易,不需要任何瘋狂。

if ! ps -C app >/dev/null ; then 
    /etc/init.d/app start 
fi 

你只需要小心你傳遞給psapp是實際的進程名。

0

我現在無法檢查我的服務器,但Debian使用start-stop-daemon加載服務,它似乎是您的任務使用的正確工具,因爲它通過PID跟蹤您的後臺進程,而不僅僅匹配名稱在進程列表中(也可以這樣做)。

相關問題