如何获取某些进程的PID和状态

如何获取某些进程的PID和状态

我创建了一个基本的 shell 脚本,它只是从 1000 开始倒数。这只是为了测试,但可以是任何应用程序/进程。

##filename:test.sh##

#!/bin/bash
i=1000; while [ $i -gt 0 ]; do echo $i; i=`expr $i - 1`; sleep 1; done

我开始运行:

sh test.sh

我现在需要获取:a)该脚本的 pid,b)该脚本的状态

如果我做

pidof sh test.sh 

不过我得到了多个结果。

跑步

ps aux | grep test.sh 

我收到多个条目,包括一些已终止 (state=T) 和一个grep test.sh.我怎样才能将其限制pidof为我需要的(假设它只是正在运行的一个实例)

我也需要国家。我尝试运行:

ps aux | grep test.sh | ps -o stat --no-headers

但这没有用。我得到了状态,但是对于多个项目

答案1

pidof -x test.sh应该给你获取 PID 所需的信息。

从手册页来看,

-x 脚本 - 这会导致程序还返回运行指定脚本的 shell 的进程 ID。

这是我的测试,

tony@trinity:~$ ls -l testit.sh
-rwxr-xr-x 1 tony tony 83 Jan  5 14:53 testit.sh
tony@trinity:~$ ./testit.sh
1000
999
998
997

同时

tony@trinity:~$ ps -ef | grep testit.sh
tony      4233 20244  0 14:58 pts/5    00:00:00 /bin/bash ./testit.sh
tony      4295  3215  0 14:58 pts/6    00:00:00 grep --color=auto testit.sh

进而

tony@trinity:~$ pidof -x testit.sh
4233

您后来的查询是一个常见问题,一种解决方案是,

ps aux | grep test.sh | grep -v grep

这应该只给你一行(假设test.sh是唯一的)。

最后,在你的最终命令中,你不只是传递一个 PID,你传递的是一整行文本,而且这也不是ps期望获得 PID 的方式(它期望 PID 之后-p)。

例如,

tony@trinity:~$ ps aux | grep testit.sh
tony      4233  0.1  0.0   4288  1276 pts/5    S+   14:58   0:00 /bin/bash ./testit.sh
tony      5728  0.0  0.0   3476   760 pts/6    S+   15:04   0:00 grep --color=auto testit.sh

所以我们需要grep出grep,然后只返回pid。

tony@trinity:~$ ps aux | grep testit.sh | grep -v grep | awk '{print $2}'
4233

然后,

tony@trinity:~$ ps -o stat --no-headers -p $(ps aux | grep testit.sh | grep -v grep | awk '{print $2}')
S+

可能有很多不太复杂的方法可以实现这一目标,但我想展示进展情况。

相关内容