2012-06-03 160 views

回答

5

的標準方法是使用PID文件來存儲服務的PID。然後,您可以使用存儲在PID文件中的PID來查看服務是否已在運行。

看看/etc/init.d目錄下的各種腳本,看看它們如何使用PID文件。在大多數Linux系統中,還可以看看/var/run,以查看PID文件的存儲位置。

你可以做這樣的事情是處理這個對所有的Bourne shell類型殼的一般方法:

# Does the PID file exist? 

if [ -f "$PID_FILE" ] 
then 
    # PID File does exist. Is that process still running? 
    if ps -p `cat $PID_FILE` > /dev/null 2&1 
    then 

     # Process is running. Do a restart 
     /etc/init.d/myService restart 
     cat $! > $PID_FILE 
    else 
     # Process isn't' running. Do a start 
     /etc/init.d/myService start 
     cat $! > $PID_FILE 
else 
    # No PID file to begin with, do a restart 
    /etc/init.d/myService restart 
    cat $! > $PID_FILE 
fi 

然而,在Linux上,你可以採取的pgrep優勢:

if pgrep myService > /dev/null 2>&1 
then 
    restart service 
else 
    start service 
fi 

注意你如何不使用任何大括號。 if語句對pgrep命令的退出狀態進行操作。我將STDOUT和STDERR都輸出到/ dev/null,因爲我不想打印它們。我只想要pgrep命令本身的退出狀態。

閱讀,MANPAGE ON pgrep命令

有相當多的選擇。例如,您可能希望使用-x來防止意外匹配,或者您可能必須使用-f來匹配用於啓動服務的完整命令行。

0

如果你看到爲myService當您運行的ps aux,那麼你可以簡單地做這在bash(編輯使用p纖ep,爲jordanm建議):

if [ $(pgrep myService) ]; then 
    restart myService; 
else 
    start myService; 
fi 
+0

[]和$()是不必要的。 'pgrep'也更適合。 – jordanm

+0

謝謝,我編輯過使用pgrep。我只能不能刪除$()。 –

+1

'if pgrep myService>/dev/null;那麼...'。 'if'測試命令的退出狀態。 '['是'test'的別名,它是一個命令,不是if語法的一部分。 – jordanm

相關問題