我正在尝试自动检查进程是否正在运行,并且必须相应地执行后续步骤。我写了一个 bash 脚本,但它似乎不起作用。
if ps aux | grep [M]yProcessName > /dev/null
then
echo "Running"
else
echo "Not running"
fi
我的if
陈述是否被错误地使用了?
您不想知道特定进程(已知 pid)是否正在运行(这可以通过测试/proc/1234/
pid 1234 是否存在来完成),但是否某个进程正在运行给定命令(或给定可执行文件)。
请注意,kill(2)系统调用可移植地用于检查给定进程是否正在运行(使用 0 信号,例如kill(pid,0)
)。从程序内部,这是检查已知 pid 的进程是否仍然存在并运行(或等待)的常用方法。
您可以使用该pidof
命令查找运行某些可执行文件的进程,例如pidof zsh
查找所有zsh
进程。你也可以使用killall -s 0 zsh
您可能会对pgrep
实用程序和/proc
文件系统感兴趣。
ps aux | grep [M]yProcessName | grep -v grep
有一个解决方案:
if [ "$(ps aux | grep "what you need" | awk '{print $11}')" == "grep" ]; then ... elif [ ... ]; then ... else ... fi
这在 Debian 6 中运行良好。需要“{print $11}”,因为系统也将 grep 视为一个进程
processid =$(ps aux | grep 'ProcessName' | grep -v grep| awk '{print $2}')
上面的命令将为您提供进程 ID。将该进程 ID 分配给一个变量并执行此操作 -->
if cat /proc/$processid/status | grep "State: R (running)" > /dev/null
then
echo "Running"
else
echo "Not running"
fi
使用 -z 检查字符串是否为空,这样的事情可能会起作用:
line=$(ps aux | grep [M]yProcessName)
if [ -z "$line" ]
then
echo "Not Running"
else
echo $line > /dev/null
echo "Rinnung"
fi
SMBD=$(pidof smbd)
if [ "$SMBD" == "" ];
then
/etc/init.d/samba start;
else
/etc/init.d/samba restart;
fi
在我的系统上,ps aux | grep ProcessName
总是得到一行 grep 进程,例如:
edw4rd 9653 0.0 0.0 4388 832 pts/1 S+ 21:09 0:00 grep --color=auto ProcessName
因此,退出状态始终为 0。也许这就是您的脚本不起作用的原因。
return 0 表示成功,其他则失败
kill -0 `pid`; echo $?
只是明确提到这个答案所暗示的一种方式,pgrep
是通过进程名称执行此操作的最佳方式:
pgrep [M]yProcessName
如果名称与“[M]yProcessName”匹配的进程正在运行,pgrep
则将其 PID 打印到 stdout 并以 code 退出0
。否则,它将不打印任何内容并以 code 退出1
。
试试这个
ps aux | grep [M]yProcessName | grep -v grep