使用ps查看前台進程

使用ps查看前台進程

我可以使用ps看到後台進程。但是有沒有辦法查看前台進程呢?例如,

$nohup process1 &

然後

ps-ef | grep“進程1”

將顯示正在執行的進程“process1”。但上面的命令不會顯示執行的前台進程,例如,

$進程2

答案1

您可能會感到困惑,因為預設ps會顯示呼叫所在終端上的進程ps,例如從相同終端視窗啟動的進程。

ps -u $LOGNAME如果您知道終端名稱,請嘗試或ps -t $THETTYNAME1,$THETTYNAME2。 (終端名稱通常看起來像“ttyN”或“pts/N”)。

答案2

奇怪的是,ps 指令可讓您監視所有活動進程的狀態,包括前台和背景。

例如,我在第一個 shell 中啟動以下進程:

$ startNetworkServer 
Security manager installed using the Basic server security policy.
Apache Derby Network Server - 10.3.2.1 - (599110) started and ready to accept connections on port 1527 at 2010-06-18 14:14:33.277 GMT 

在另一個外殼中:

$ ps aux  | grep NetworkServer | grep -v grep
pascal    5928  0.3  1.4 661492 29216 pts/0    Sl+  16:14   0:03 /usr/lib/jvm/java-6-sun/bin/java -classpath /usr/share/javadb/lib/derby.jar:/usr/share/javadb/lib/derbynet.jar:/usr/share/javadb/lib/derbytools.jar:/usr/share/javadb/lib/derbyclient.jar org.apache.derby.drda.NetworkServerControl start

該進程按預期列出(並且+顯示它位於前台進程組中)。

答案3

問題:

“有辦法查看前台進程嗎?”然後問題繼續聲稱ps -ef不顯示在前台運行的進程。

答:

是的, 有一種方法。也:ps -ef 顯示在前台運行的進程 -但它沒有顯示狀態過程的。這在文檔 ( man ps) 中進行了解釋,並且可以透過簡單的實驗進行驗證。考慮這個例子:

在一個終端中,運作:

ping 8.8.8.8 > /dev/null

在另一個終端中:

ps -ef | grep ping | grep -v grep
seamus        1161   974  0 23:20 pts/1    00:00:00 ping 8.8.8.8

注意ps -ef不提供狀態其輸出中的信息。然而,man ps解釋說狀態資訊可用-o與關鍵字一起使用時的參數stat

ps -eo pid,stat,command | grep ping | grep -v grep
 1161 S+   ping 8.8.8.8

這告訴我們:

  • 進程PID是1161透過關鍵字pid
  • 流程狀態S+透過關鍵字stat
  • 關鍵字command顯示ping 8.8.8.8產生了該過程

狀態的值S+已解碼man ps的標題下PROCESS STATE CODE。這告訴我們:

S 可中斷睡眠(等待事件完成)
+ 處於前台進程組

量子電動力學

我們已經看到ps -ef列出了 PID 為 的進程1161,並且ps -eo pid,stat,command揭示了狀態PID1161前景過程。


註 1: 關鍵字標題下-o描述了該論點。這裡解釋了關鍵字產生兩個字元的過程man psSTANDARD FORMAT SPECIFIERSstat狀態,而關鍵字state僅產生一個字符狀態

筆記2:這適用於我的基於 Debian 的系統(報告為版本ps from procps-ng 3.3.15)和 macOS 10.15(源自 BSD 版本ps)。

相關內容