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

我想检查已经运行的特定进程。

我对这个问答进行了评论。

但我没有得到任何具体的解决方案。 以下是我尝试的示例:我创建了abc.sh文件并在后台运行此脚本,如sh abc.sh &

现在这个文件在后台运行,我启动了ps aux | grep "abc" 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脚本并abc.sh相同的命令ps aux | grep "abc" ps aux | grep "abc"命令。

但我得到相同的输出像:

 prakash 3594 0.0 0.0 4388 820 pts/0 S+ 16:44 0:00 grep --color=auto abc 

有没有其他方法可以找到进程运行与否?

每个进程都会在ps aux的输出中列出; 无论是跑步,睡觉,僵尸还是停止。

但是,在您的情况下,由于您使用sh abc.sh运行该进程,因此sh是正在运行的应用程序(shell)而不是abc.sh 因此, ps aux将不包含进程abc.sh因为grep无法产生任何结果。

所以,你应该使用它的正确方法如下:

 ps aux | grep sh 

这也可能会返回正在运行的其他进程,其字符串sh在其输出ps aux任何位置。

您应该注意,当ps aux的输出将其STAT作为R时,该过程将“正在运行”。 如果它不是那个,它不会在您触发命令的实例上运行以检查正在运行的进程。 可以在ps的手册页中找到不同的进程状态:

 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就会知道用什么应用程序来运行脚本(在这种情况下,将其更改为#!/bin/bash for bash),然后使用以下命令为进程提供可执行权限:

 chmod +x /path/to/abc.sh 

/path/to/替换为abc.sh文件的位置,然后使用运行abc.sh

 /path/to/abc.sh 

再次将/path/to/替换为abc.sh文件的位置。

我对grep问题是它是一个整行解析器。 在您的示例中,您正在搜索“abc”,但它正在撤回grep的实例(即正在寻找“abc”)。 有点循环。 你可以过滤掉它,但我觉得有点不正常。

我会转向awk有点夸张。

 ps aux | awk '$12=="abc.sh"' 

awk基于空格将行拆分为字段(默认情况下)。 字段$ 11 +是命令列,因此如果命令是“sh abc.sh …”,则$11将为sh$12将为abc.sh

如果你想用Bash的&&||来控制输出或链 运营商,你可以,但你需要更聪明一点。 如果没有找到任何内容, grep将以状态码1(技术失败,触发|| )退出但是awk将始终退出代码0.我们可以通过告诉它在找到某些东西时退出并且如果不找到则抛出1来改变它:

 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"}' 

如果进程在后台启动(如sh abc.sh & )已经运行,则检查当前bash会话的正确方法是使用jobs builtin命令。

例:

 $ sh abc.sh & [1] 6917 $ jobs [1]+ Running sh abc.sh & 

这意味着在后台启动的sh abc.sh进程正在运行。 如果该过程已完成,您将看到如下内容:

 [1]+ Done sh abc.sh 

如果有更多进程在后台运行,则可以使用以下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 ),则表示该进程仍在运行。 如果没有,则该过程已完成。

如果您的脚本当前正在运行,则必须通过ps aux命令显示它。 如果没有ps ,则可能是您的脚本执行当前已终止。

像这样输出ps意味着你的脚本当前没有运行,

 $ ps aux | grep hm.sh avinash 6386 0.0 0.0 15940 932 pts/16 S+ 17:34 0:00 grep --color=auto hm.sh 

如果它显示如下,这意味着您的脚本当前正在运行。

 $ ps aux | grep hm.sh avinash 6454 0.0 0.0 16616 1384 pts/16 S+ 17:35 0:00 /bin/bash ./hm.sh avinash 6535 0.0 0.0 15940 932 pts/27 R+ 17:35 0:00 grep --color=auto hm.sh 

这都是基于脚本的内容。

例如,如果您创建这样的脚本。 它会在执行时显示HI消息。 显示输出需要几秒钟,并在产生最终结果后终止。

 #!/bin/bash echo "HI" 

但如果你的脚本是这样的,

 #!/bin/bash sudo apt-get update 

终止进程需要几分钟的时间。 在此期间,如果你运行ps aux | grep filename ps aux | grep filename命令,它将显示在输出中。 因为脚本当前正在运行。

如果你只是想检查是否有正在进行的进程然后转到该目录并输入ll -tr如果你在文件的末尾看到.csv.work等,那么它意味着在进程中没有。

  • 如果你想检查所有进程,那么使用’top’

  • 如果你想知道java运行的进程,那么使用ps -ef | grep java ps -ef | grep java

  • 如果其他进程然后只使用ps -ef | grep xyz ps -ef | grep xyz或简单的/etc/init.d xyz status

  • 如果通过任何代码,如.sh然后./xyz.sh status