如何在“ps”或“ps -ef”命令輸出中知道進程是在後台運行還是在前台運行?

如何在“ps”或“ps -ef”命令輸出中知道進程是在後台運行還是在前台運行?

我如何知道進程在命令或中是在後台運行還是在前台ps運行ps -ef

我首先想到的是,當我輸入 時ps -ef,有一個名為 TTY 的部分。當我查看 TTY 列表時,大多數都是?.我想知道這個問號是否意味著進程運行後台。

我想驗證一下我的想法是否正確!如果不是,我想知道如何知道進程是在背景運行還是在前台運行?

附:jobs這裡沒有使用命令。

答案1

stat有一個額外的+前台進程:

ps -e -o pid,tty,stat,cmd

前台進程是那些進程組 id ( pgid) 是終端機 ( tpgid) 上的前台進程的進程:

ps -e -o pid,pgid,tpgid,tty,cmd | awk '$2==$3'

當我查看 TTY 列表時,大多數都是“?” (問號)我想知道問號是否意味著進程運行後台

不,這意味著它們沒有控制 tty(守護進程或核心線程,無論是前台還是後台)。欲了解以下列表背景流程:

ps -e -o pid,pgid,tpgid,tty,cmd | awk '$3!=-1 && $2!=$3'

答案2

OP 問道:“…我如何知道進程是在後台運行還是在前台運行?”

a的前台和後台狀態過程報告ps狀態的過程。man ps列出這些行程狀態在 的標題下PROCESS STATE CODE

ps -ef不報告進程狀態,但參考man ps我們在一OUTPUT FORMAT CONTROL節中發現的-o參數可用於指定ps通過一個或多個的輸出關鍵字。這些關鍵字列在STANDARD FORMAT SPECIFIERS部分中,只要有非凡的毅力,人們最終會找到列出的sstatstate關鍵字。但請注意,雖然這三個關鍵字會提供狀態在輸出中,只有stat 關鍵字會給multi-character process state!要點:ps有利於勤奮的用戶

例如,以下ps命令將輸出PID, 這狀態,以及命令使用以下命令啟動該過程關鍵字 pidstatcommand

ps -eo pid,stat,command

要了解其工作原理,請考慮以下範例:

在一個終端機中,執行以下命令:

ping 8.8.8.8 > /dev/null

在另一個終端中:

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

這告訴我們:

  • PID 是12518
  • 過程狀態S+(透過關鍵字stat
  • 產生command該過程的是ping 8.8.8.8

還需要執行一個步驟來了解此進程是前台還是後台:狀態的值S+必須是已解碼在-man ps標題下,PROCESS STATE CODE它告訴我們:

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

因此,我們從+第二個字元位置看到該進程正在運行前景。後台進程可能會S在第一個字元位置列出,而在第二個位置則沒有任何內容。還有其他幾種字元組合表示後台進程;看用於列表。


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

相關內容