在僞代碼,我試圖做類似下面的如何檢測我的新貴腳本是否正在運行?
if myService is running
restart myService
else
start myService
如何翻譯到上述bash腳本或類似的?
在僞代碼,我試圖做類似下面的如何檢測我的新貴腳本是否正在運行?
if myService is running
restart myService
else
start myService
如何翻譯到上述bash腳本或類似的?
的標準方法是使用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
來匹配用於啓動服務的完整命令行。
如果你看到爲myService當您運行的ps aux,那麼你可以簡單地做這在bash(編輯使用p纖ep,爲jordanm建議):
if [ $(pgrep myService) ]; then
restart myService;
else
start myService;
fi
[]和$()是不必要的。 'pgrep'也更適合。 – jordanm
謝謝,我編輯過使用pgrep。我只能不能刪除$()。 –
'if pgrep myService>/dev/null;那麼...'。 'if'測試命令的退出狀態。 '['是'test'的別名,它是一個命令,不是if語法的一部分。 – jordanm