我创建了一个基本的 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+
可能有很多不太复杂的方法可以实现这一目标,但我想展示进展情况。