Linux

如何獲取某些程序的PID和狀態

  • January 5, 2016

我創建了一個從 1000 開始倒計時的基本 shell 腳本。這只是為了測試,但可以是任何應用程序/程序。

##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 

我得到多個條目,包括一些已終止(狀態 = T)和一個是grep test.sh. 如何將其限制為pidof我需要的一個(假設它只是一個正在執行的實例)

我也需要狀態。我嘗試執行:

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

但這沒有用。我得到了狀態,但是對於多個項目

pidof -x test.sh應該為您提供獲取 PID 所需的內容。

從手冊頁,

-x Scripts too - 這會導致程序還返回執行指定腳本的 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+

可能有很多不那麼複雜的方法可以到達那裡,但我想展示一下進展。

引用自:https://unix.stackexchange.com/questions/253395