Linux
如何檢查/啟動程序 |shell腳本中的錯誤
如果要檢查程序是否正在執行,如果沒有則啟動它。我下面的腳本有問題,總是說一個程序正在執行。怎麼了?
$ ./check_n_run thisisnotrunning ./check_n_run: thisisnotrunning is already running
這是腳本:
$ cat check_n_run #!/bin/sh USAGE="usage: $0 processname" if [ $# -ne 1 ] ; then echo "$USAGE" >&2 exit 1 fi ps ax | grep -v grep | grep $1> /dev/null if [ $? -eq 1 ] then echo "$1 not running" # start here else echo "$0: $1 is already running" >&2 fi exit 0
您的腳本中的問題是(使用您正在使用的 shell)在管道中,每個命令都在單獨的子 shell 中執行,並且它們的狀態都不會傳播到父程序。所以之後
command1 | command2
,$?
始終為 0。即使您修復了它,您的腳本也非常不可靠:它會匹配名稱包含您的程序作為子字元串的程序。Linux 提供的
pidof
命令完全符合您的要求。然而這仍然不理想,因為可能有另一個同名的程序。最好使用適當的服務管理器,例如 Debian/Ubuntu 的
start-stop-daemon
,或新貴服務。lockfile
Wrikken 提到的(來自procmail)也是一種可能性。