我如何知道进程在命令或中是在后台运行还是在前台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
部分中,只要有非凡的毅力,人们最终会找到列出的s
、stat
和state
关键字。但请注意,虽然这三个关键词会提供状态在输出中,只有stat
关键词会给multi-character process state
!要点:ps
有利于勤奋的用户。
例如,以下ps
命令将输出PID, 这状态,以及命令使用以下命令启动该过程关键词 pid
,stat
和command
:
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
)。