11

我正在尝试自动检查进程是否正在运行,并且必须相应地执行后续步骤。我写了一个 bash 脚本,但它似乎不起作用。

if ps aux | grep [M]yProcessName > /dev/null
then
  echo "Running"
else
  echo "Not running"
fi

我的if陈述是否被错误地使用了?

4

10 回答 10

11

您不想知道特定进程(已知 pid)是否正在运行(这可以通过测试/proc/1234/pid 1234 是否存在来完成),但是否某个进程正在运行给定命令(或给定可执行文件)。

请注意,kill(2)系统调用可移植地用于检查给定进程是否正在运行(使用 0 信号,例如kill(pid,0))。从程序内部,这是检查已知 pid 的进程是否仍然存在并运行(或等待)的常用方法。

您可以使用该pidof命令查找运行某些可执行文件的进程,例如pidof zsh查找所有zsh进程。你也可以使用killall -s 0 zsh

您可能会对pgrep实用程序和/proc文件系统感兴趣。

于 2012-11-07T06:51:58.037 回答
6
ps aux | grep [M]yProcessName | grep -v grep
于 2014-05-04T14:15:50.413 回答
2

有一个解决方案:

if [ "$(ps aux | grep "what you need" | awk '{print $11}')" == "grep" ]; then ... elif [ ... ]; then ... else ... fi

这在 Debian 6 中运行良好。需要“{print $11}”,因为系统也将 grep 视为一个进程

于 2013-06-14T15:46:06.847 回答
2
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
于 2014-03-10T07:43:25.697 回答
1

使用 -z 检查字符串是否为空,这样的事情可能会起作用:

line=$(ps aux | grep [M]yProcessName)
if [ -z "$line" ]
then
    echo "Not Running"
else
    echo $line > /dev/null
    echo "Rinnung"
fi
于 2012-11-06T23:36:33.323 回答
1
SMBD=$(pidof smbd)
if [ "$SMBD" == "" ];
then
   /etc/init.d/samba start;
else
   /etc/init.d/samba restart;
fi
于 2015-05-06T19:22:24.823 回答
0

在我的系统上,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。也许这就是您的脚本不起作用的原因。

于 2012-11-07T13:16:17.800 回答
0

return 0 表示成功,其他则失败

kill -0 `pid`; echo $?
于 2016-09-09T06:55:21.500 回答
0

只是明确提到这个答案所暗示的一种方式,pgrep是通过进程名称执行此操作的最佳方式:

pgrep [M]yProcessName

如果名称与“[M]yProcessName”匹配的进程正在运行,pgrep则将其 PID 打印到 stdout 并以 code 退出0。否则,它将不打印任何内容并以 code 退出1

于 2021-08-02T16:00:33.063 回答
-1

试试这个

ps aux | grep [M]yProcessName | grep -v grep
于 2012-11-07T01:35:45.277 回答