我正在尝试自动检查进程是否正在运行,并且必须相应地执行后续步骤。我写了一个bash脚本,但似乎没有用。
if ps aux | grep [M]yProcessName > /dev/null
then
echo "Running"
else
echo "Not running"
fi
我的if
声明是否被错误使用?
答案 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