
我可以使用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 ps
STANDARD FORMAT SPECIFIERS
stat
狀態,而關鍵字state
僅產生一個字符狀態。
筆記2:這適用於我的基於 Debian 的系統(報告為版本ps from procps-ng 3.3.15
)和 macOS 10.15(源自 BSD 版本ps
)。