如何检查进程是否已经运行
我想检查已经运行的特定进程。
我对这个问答进行了评论。
但我没有得到任何具体的解决方案。 以下是我尝试的示例:我创建了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