【发布时间】:2013-11-15 22:55:01
【问题描述】:
我有一个监视 shell 脚本,它可以有效地监视和保持进程运行。但它通常会失败,因为它启动了该过程的第二个、第三个或更多实例。我还看到 pgrep 命令(pgrep -n -f wx_nanoserver)在命令行返回错误的 pid...
这是我的脚本:
#!/bin/bash
check_process() {
# echo "$ts: checking $1"
[ "$1" = "" ] && return 0
[ `pgrep -n -f $1` ] && return 1 || return 0
}
while [ 1 ]; do
# timestamp
ts=`date +%T`
NOW=`date +"%Y%m%d-%H%M%S"`
# echo "$ts: begin checking..."
check_process "wx_nanoserver"
[ $? -eq 0 ] && echo "$ts: not running, restarting..." && `php /var/www/wx_nanoserver.php > /var/www/logs/wx_output_$NOW.log 2> /var/www/logs/wx_error_$NOW.log &`
sleep 5
done
【问题讨论】:
-
完全不用支票怎么样?每当您的命令退出时,它将重新开始。
while true; yourcommand ; done你总是可以把那个循环放到后台。 -
我已经根据这里的优秀建议更新了 shell 脚本。但它并没有解决问题。几天后,php 脚本仍然会运行许多实例。对此有什么想法吗?在命令行中,您不能启动多个实例,因为它侦听一个端口,并且您会收到该端口上已经有一个侦听器的错误。 ... 可能除了一个以外的所有进程都崩溃了,但仍然是个谜:pgrep 仍然看到一个进程,不应该启动另一个进程。