如何在“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)。

相关内容