Linux
如何獲取某些程序的PID和狀態
我創建了一個從 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+
可能有很多不那麼複雜的方法可以到達那裡,但我想展示一下進展。