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


32

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

我参考了此问答

但是我没有任何具体的解决方案。以下是我尝试的示例:我创建了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

还有其他方法可以找到该进程正在运行吗?

Answers:


41

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

但是,在您的情况下,由于您使用来运行进程sh abc.shsh因此正在运行的application(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

这样外壳程序将知道要使用哪个应用程序来运行脚本(在本例中#!/bin/bash为sh,将其更改为bash),然后使用以下命令为进程提供可执行权限:

chmod +x /path/to/abc.sh

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

/path/to/abc.sh

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


2
一个简单的问题。stat的S+意思是什么
Prakash V Holkar

但是您可以通过ps aux | grep filename命令的输出找到正在运行的进程与未运行的进程之间的区别。
2014年

@TechGuru:这意味着该进程正在前台休眠,有关更多信息,请参考ps的手册页。
Jobin 2014年

@AvinashRaj:是的,当然可以。
Jobin 2014年

我收到错误消息:错误,请执行以下操作:mount -t proc proc / proc
IgorGanapolsky

7

我的问题grep是它是一个全行解析器。在您的示例中,您正在搜索“ abc”,但它正在拉回的实例grep(正在查找“ abc”的)。有点循环。您可以将其过滤掉,但我发现所有这些都有些反常。

我会awk有点痛苦。

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

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

如果要使用Bash &&||运算符控制输出或链接,可以,但是需要更加聪明。如果什么都没找到,将以grep状态代码1退出(技术故障,triggers ||),但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"}'

4

检查当前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在这种情况下),则意味着该进程仍在运行。如果不是,则该过程已完成。


3

如果您的脚本当前正在运行,则必须通过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命令,它将显示在输出中。因为脚本当前正在运行。


-2
  • 如果要检查所有进程,请使用“顶部”

  • 如果您想知道由Java运行的进程,请使用 ps -ef | grep java

  • 如果是其他过程,则只需使用ps -ef | grep xyz或简单地/etc/init.d xyz status

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


1
-1尽管这些命令在某些情况下很有用,但对于不了解这些情况的人仍然没有用。在每种情况下,您要么解释不够,要么解释错误。
David Foerster

-2

如果你只是想检查是否有任何根据的过程,然后进入该目录,然后键入ll -tr如果你看到.csv或者.work在文件的结尾等那么就意味着其他人不能下的过程。


这个答案没有道理。列出目录的内容不会告诉您进程是否正在运行。该文件扩展名.csv用于与逗号分隔的文件,该文件与正在运行的进程无关。
user369450
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.