我想检查特定进程是否已经在运行。
我引用此问答。
但我没有得到任何具体的解决方案。以下是我尝试的示例:我已经创建了abc.sh
文件并在后台运行此脚本,就像sh abc.sh &
。
现在该文件正在后台运行,我启动该ps aux | grep "abc"
命令。
以下是该命令的输出:
prakash 3594 0.0 0.0 4388 820 pts/0 S+ 16:44 0:00 grep --color=auto abc
之后我停止abc.sh
正在运行的脚本并执行相同的命令ps aux | grep "abc"
。
但我得到了相同的输出,例如:
prakash 3594 0.0 0.0 4388 820 pts/0 S+ 16:44 0:00 grep --color=auto abc
还有其他方法可以查明该进程是否正在运行吗?
答案1
每个进程都将在输出中列出ps aux
;无论是运行、休眠、僵尸还是停止。
但是,在您的情况下,由于您使用 运行了该进程sh abc.sh
,sh
因此 是正在运行的应用程序(shell)而不是abc.sh
。因此,ps aux
将不包含该进程,abc.sh
因为grep
无法产生任何结果。
因此,正确的使用方式应该是:
ps aux | grep sh
这也可能返回正在运行的其他进程,这些进程sh
在其输出的任何地方有该字符串ps aux
。
您应该注意到,当 的输出为ps aux
时,进程将处于“正在运行”状态。如果不是这样,则在您触发命令检查正在运行的进程时,它没有运行。可以在 ps 的手册页中找到不同的进程状态:STAT
R
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped, either by a job control signal or because it is being traced
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent
您也可以运行top
命令来检查进程是正在运行还是处于休眠状态以及它所消耗的 CPU 和 RAM 数量。(这将再次将您的进程列为sh
)。
但是,如果您确实希望将进程列为abc.sh
,则应将正在运行的脚本的第一行如下所示:
#!/bin/sh
这样 shell 就会知道使用哪个应用程序来运行脚本(在本例中为 sh,将其更改为#!/bin/bash
bash),然后使用以下命令为该进程提供可执行权限:
chmod +x /path/to/abc.sh
替换/path/to/
为文件的位置abc.sh
,然后运行abc.sh
使用
/path/to/abc.sh
再次替换文件/path/to/
的位置abc.sh
。
答案2
我的问题在于grep
它是一个整行解析器。在您的示例中,您正在搜索“abc”,但它却拉回了grep
(正在搜索“abc”的实例)。有点循环。您可以过滤掉它,但我发现这一切都有点不正常。
我会转向awk
寻求一点风采。
ps aux | awk '$12=="abc.sh"'
awk
根据空格将行拆分为字段(默认情况下)。字段 $11+ 是命令列,因此如果命令是“sh abc.sh ...”,$11
则将是sh
,$12
将是abc.sh
。
如果您想要控制输出或使用 Bash 的&&
和||
运算符进行链接,那么您可以这样做,但您需要更聪明一些。如果没有找到任何内容,grep
将以状态代码 1(技术失败,触发器)退出,但始终以状态代码 0 退出。我们可以更改此设置,告诉它在找到某些内容时退出,如果没有找到则抛出 1:||
awk
ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running
当然,如果您只关心将输出写入屏幕,那么您可以这样做awk
:
ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'
答案3
在当前 bash 会话中检查在后台启动的进程是否sh abc.sh &
已在运行的正确方法是使用jobs
内置命令。
例子:
$ sh abc.sh &
[1] 6917
$ jobs
[1]+ Running sh abc.sh &
这意味着sh abc.sh
后台启动的进程正在运行。如果进程已完成,您将看到类似以下内容:
[1]+ Done sh abc.sh
如果您有更多进程在后台运行,则可以使用以下命令将输出仅限于该
sh abc.sh
进程:
jobs sh
请参阅help jobs
以了解更多信息。
上述方法仅在当前 bash 会话中有效。但如果您在另一个 bash 会话中(例如在另一个终端窗口或选项卡中,或在脚本中),除了:
ps aux | grep "[s]h bin/test.sh"
您还可以使用:
pgrep -a sh
对我来说这似乎更简单。如果您在输出中看到您输入的命令(sh abc.sh
在本例中),则意味着该进程仍在运行。如果没有,则该进程已完成。