我的系统上有一个进程,该进程因崩溃而臭名昭著,并且是我的网络管理员的关键任务。无论如何,我需要编写一个循环来测试它是否正在运行,如果没有则启动它。这是我到目前为止想出的:
#!/bin/bash
while [ true ]; do
if [ -z $(ps aux | grep "[n]m-applet") ]; then
echo "Bugger died, resurrecting..."
nm-applet >/dev/null 2>/dev/null &
disown $!
fi
sleep 3
done
Run Code Online (Sandbox Code Playgroud)
不幸的是,这并没有完全奏效,因为即使没有必要,它似乎也在启动该过程,并且在第一次运行后,我得到以下错误输出:
line 4: [: too many arguments
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?
尝试$(...)用双引号括起来:
if [ -z "$(ps aux | grep '[n]m-applet')" ]; then
Run Code Online (Sandbox Code Playgroud)
但您可能想尝试使用pgrep或ps axo cmd | grep '[n]m-applet'代替。
该错误来自为 -z 提供多个参数。它是一个一元运算符,如果$()扩展为包含 $IFS 的内容,它将看到多个参数。为了解决这个问题,你可以把引号它像这样:[ -z "$(ps...)" ]。
在这种情况下,您实际上不需要测试 ( []),因为如果 grep 没有找到任何内容,它将返回非零值。你可以做:
if ps aux | grep '[n]m-applet' > /dev/null; then
您可能想查看您计划部署的系统是否具有pgrep. 它用于寻找与模式匹配的进程。
此外,您可能希望脚本不为 nm-applet 设置背景。这样,脚本将一直阻塞,直到 nm-applet 死掉。
最后,您可能想看看Monit,它是为执行您的脚本所做的工作而制作的。