我正在尝试自动检查过程是否正在运行,并且必须相应地执行下一步。我写了一个bash脚本,但似乎不起作用。
if ps aux | grep [M]yProcessName > /dev/null
then
echo "Running"
else
echo "Not running"
fi
我的if
语句错误使用了吗?
您不想知道(已知PID的特定过程)是否正在运行(可以通过测试/proc/1234/
是否存在PID 1234),但是如果某些过程正在运行一个给定命令(或给定的可执行文件)。
请注意,杀死(2)SYSCALL可用于检查给定的过程是否正在运行(例如0信号,例如kill(pid,0)
)。从程序内部,这是检查已知PID过程是否仍然存在并运行(或等待)的一种常见方法。
您可以使用pidof
命令来查找运行某些可执行文件的过程,例如pidof zsh
查找所有zsh
进程。您也可以使用killall -s 0 zsh
您可能对pgrep
实用程序和/proc
文件系统感兴趣。
ps aux | grep [M]yProcessName | grep -v grep
使用-z检查字符串是否为空,类似的东西可以起作用:
line=$(ps aux | grep [M]yProcessName)
if [ -z "$line" ]
then
echo "Not Running"
else
echo $line > /dev/null
echo "Rinnung"
fi
有一个解决方案:
if [ "$(ps aux | grep "what you need" | awk '{print $11}')" == "grep" ]; then ... elif [ ... ]; then ... else ... fi
这在Debian 6中正常工作。
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
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。也许这就是您的脚本不起作用的原因。
返回0表示成功,而其他人失败
kill -0 `pid`; echo $?
只是为了明确提及该答案的一种方法, pgrep
是按进程名称进行此操作的最佳方法:
pgrep [M]yProcessName
如果其名称匹配" yprocessname"的过程正在运行,pgrep
将打印其PID到STDOUT,并使用代码0
退出。否则,它将什么都不打印并使用代码1
。
尝试此
ps aux | grep [M]yProcessName | grep -v grep