如何检查进程是否已在运行

如何检查进程是否已在运行

我想检查特定进程是否已经在运行。

我引用此问答

但我没有得到任何具体的解决方案。以下是我尝试的示例:我已经创建了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.shsh因此 是正在运行的应用程序(shell)而不是abc.sh。因此,ps aux将不包含该进程,abc.sh因为grep无法产生任何结果。

因此,正确的使用方式应该是:

ps aux | grep sh

这也可能返回正在运行的其他进程,这些进程sh在其输出的任何地方有该字符串ps aux

您应该注意到,当 的输出为ps aux时,进程将处于“正在运行”状态。如果不是这样,则在您触发命令检查正在运行的进程时,它没有运行。可以在 ps 的手册页中找到不同的进程状态:STATR

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/bashbash),然后使用以下命令为该进程提供可执行权限:

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在本例中),则意味着该进程仍在运行。如果没有,则该进程已完成。

答案4

你可以随时使用程序包检查进程是否正在运行

pgrep -c "process name"

此命令的作用是计算找到的名称为“进程名称”的进程数,并返回其数量[0 表示未找到进程]

相关内容