我正在尝试自动检测进程是否正在运行,并根据需要执行下一步操作。我曾经编写了一个bash脚本,但似乎它不起作用。
if ps aux | grep [M]yProcessName > /dev/null
then
echo "Running"
else
echo "Not running"
fi
我的if
语句用错了吗?
您不想知道特定进程(已知pid)是否正在运行(可以通过测试/proc/1234/
是否存在来实现,其中1234是pid),而是要知道某个进程是否正在运行给定的命令(或给定的可执行文件)。
请注意,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
grep -v grep
过滤掉包含 "grep" 的行。这是必要的,因为 ps aux | grep foo
将捕获列出当前运行的所有包含字符串 "foo" 的进程的行,其中包括命令本身!换句话说,您将始终在结果中有一行,无论是否运行 foo
进程。使用 grep -v grep
,当没有 foo
进程运行时,您将得到 0 行,并且只会得到与实际 foo
进程相关的行,而不是您的命令。 - 6equj5[M]
已经过滤掉了 grep
进程,因此在这种情况下不需要第二个 grep
。模式 [M]yProcessName
只匹配字符串 MyProcessName
,而 grep
在进程列表中显示为 grep [M]yProcessName
,因此它不匹配也不会被包含。 - Fonic使用-z来检查字符串是否为空,类似这样的代码可以实现:
line=$(ps aux | grep [M]yProcessName)
if [ -z "$line" ]
then
echo "Not Running"
else
echo $line > /dev/null
echo "Rinnung"
fi
grep
不匹配时,返回非零值,因此不需要测试。在M周围的[]
消除了对grep -v grep
的需求。 - jordanmif [ "$(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}')
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
只是为了明确提到this answer所暗示的一种方法,pgrep
是按进程名称执行此操作的最佳方法:
pgrep [M]yProcessName
pgrep
将其PID打印到stdout并以代码0
退出。否则,它将不打印任何内容并以代码1
退出。ps aux | grep 进程名称
总是会得到一个类似于那个grep进程的行:edw4rd 9653 0.0 0.0 4388 832 pts/1 S+ 21:09 0:00 grep --color=auto ProcessName
所以,退出状态始终为0。也许这就是你的脚本无法工作的原因。
grep
使用了一个不匹配自身的正则表达式。 - tripleee返回0代表成功,而其他数字则表示失败。
kill -0 `pid`; echo $?
试一下这个
ps aux | grep [M]yProcessName | grep -v grep
[M]y
而不是My
使得grep -v grep
变得不必要,因为[M]y
不会匹配自身。 - zwol
if
看起来很好。为什么不运行它并自己找出答案呢?我花了一分钟将if
复制到文件中并启动它。 - Olaf Dietsche