如何检查进程是否在linux中运行

时间:2012-11-06 23:17:46

标签: linux bash

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

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

我的if声明是否被错误使用?

10 个答案:

答案 0 :(得分:10)

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

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

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

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

答案 1 :(得分:6)

ps aux | grep [M]yProcessName | grep -v grep

答案 2 :(得分:2)

有一个解决方案:

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

这在Debian 6中运行良好。' {print $ 11}'是必要的,因为系统也将grep视为一个过程

答案 3 :(得分: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

答案 4 :(得分:1)

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

line=$(ps aux | grep [M]yProcessName)
if [ -z "$line" ]
then
    echo "Not Running"
else
    echo $line > /dev/null
    echo "Rinnung"
fi

答案 5 :(得分: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.也许这就是您的脚本不起作用的原因。

答案 6 :(得分:0)

SMBD=$(pidof smbd)
if [ "$SMBD" == "" ];
then
   /etc/init.d/samba start;
else
   /etc/init.d/samba restart;
fi

答案 7 :(得分:0)

返回0表示成功而其他人表示失败

kill -0 `pid`; echo $?

答案 8 :(得分:0)

只是明确提及 this answer 所暗示的一种方式,pgrep 是通过进程名称执行此操作的最佳方式:

pgrep [M]yProcessName

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

答案 9 :(得分:-1)

试试这个

ps aux | grep [M]yProcessName | grep -v grep