通过 if 和 -z 测试进程是否正在运行

Naf*_*Kay 2 bash

我的系统上有一个进程,该进程因崩溃而臭名昭著,并且是我的网络管理员的关键任务。无论如何,我需要编写一个循环来测试它是否正在运行,如果没有则启动它。这是我到目前为止想出的:

#!/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)

我在这里做错了什么?

Arc*_*ege 9

尝试$(...)用双引号括起来:

if [ -z "$(ps aux | grep '[n]m-applet')" ]; then
Run Code Online (Sandbox Code Playgroud)

但您可能想尝试使用pgrepps axo cmd | grep '[n]m-applet'代替。


Sha*_*off 6

该错误来自为 -z 提供多个参数。它是一个一元运算符,如果$()扩展为包含 $IFS 的内容,它将看到多个参数。为了解决这个问题,你可以把引号它像这样:[ -z "$(ps...)" ]

在这种情况下,您实际上不需要测试 ( []),因为如果 grep 没有找到任何内容,它将返回非零值。你可以做:

if ps aux | grep '[n]m-applet' > /dev/null; then

您可能想查看您计划部署的系统是否具有pgrep. 它用于寻找与模式匹配的进程。

此外,您可能希望脚本不为 nm-applet 设置背景。这样,脚本将一直阻塞,直到 nm-applet 死掉。

最后,您可能想看看Monit,它是为执行您的脚本所做的工作而制作的。

  • 可能想要将 `-s` 添加到 grep 或关闭 stdout (`>&-`) 以防止输出到达用户。 (2认同)