我有一个监视器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
答案 0 :(得分:2)
尝试:
pgrep -n -f "$1" && return 1 || return 0
如果您使用[],您将尝试检查grep stdout数据,并且您的脚本没有将它与空格或sth进行比较,没有[],将使用grep退出代码。
答案 1 :(得分:0)
关于你的剧本的两个奇怪的事情:
[ `pgrep -n -f $1` ] && return 1 || return 0
通过副作用起作用。 ``` part evaluates to either the pid of the process if found, or nothing if no process is found. The single
[notation is a synonym for the
测试builtin (or command on earlier systems) which happens to return
true if its argument is a nonempty string and
false if it is given no argument. So when a pid is found, the test becomes something like
[1234] which evaluates to true and
[]`否则,评估为false。这确实是你想要的,但写起来会更清晰:
pgrep -n -f "$1" &>/dev/null && return 1 || return 0
另一件事是
`php /var/www/wx_nanoserver.php > /var/www/logs/wx_output_$NOW.log 2> /var/www/logs/wx_error_$NOW.log &`
你没有明显原因使用命令替换。您要求bash评估命令的输出而不是简单地运行它。由于其输出被重定向,它总是计算为空字符串,因此它没有进一步的效果。副作用是命令在子shell中运行,这是对它进行deamonize的好事。虽然,写作会更清晰:
( php /var/www/wx_nanoserver.php > /var/www/logs/wx_output_$NOW.log 2> /var/www/logs/wx_error_$NOW.log & )
不确定实际问题是什么。无论如何似乎都是这样工作。
最后的注释,后面勾选`` notation has been deprecated in favour of the
$()`符号。