我有一个打开的 bash 会话,我有 PID,尽管我无法控制终端(例如可能是另一个用户)。此 bash 会话已生成一些子进程。
有没有办法知道哪个(如果有)子进程当前位于该 bash 会话的前台?
答案1
您没有指定操作系统。我假设您可以访问 GNU ps
。
例如,假设 bash 会话 PID 为 1857。然后,要找出该会话中哪些进程处于前台和后台,请运行:
$ ps -O stat --ppid 1857
PID STAT S TTY TIME COMMAND
1908 S S pts/4 00:00:00 sleep 30m
2071 S+ S pts/4 00:00:00 man ps
查看 STAT 列。该+
后缀标识前台进程。其他进程是后台进程。
在上面的示例中,sleep 30m
位于该 shell 的后台(状态为 plain S
),而man ps
位于前台(状态为S+
)。
怎么运行的:
--ppid 1857
这表明
ps
将输出限制为父 PID 为 1857 的进程。-O stat
这告诉我们在输出中
ps
提供该字段。该字段中的STAT
A+
告诉我们该进程位于前台
STATps
字段详细信息
man ps
提供有关如何解释状态字段的详细信息:
进程状态代码 以下是 s、stat 和状态输出说明符(标题“STAT”或“S”)将显示的不同值,用于描述进程的状态:
D uninterruptible sleep (usually IO) R running or runnable (on run queue) S interruptible sleep (waiting for an event to complete) T stopped, either by a job control signal or because it is being traced W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z defunct ("zombie") process, terminated but not reaped by its parent For BSD formats and when the stat keyword is used, additional characters may be displayed: < high-priority (not nice to other users) N low-priority (nice to other users) L has pages locked into memory (for real-time and custom IO) s is a session leader l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) + is in the foreground process group
您感兴趣的是进程是否是前台,最后一项是关键:+
表示前台进程。
答案2
从这个很好的答案由 @KamilMaciorowski 提出的一个有点相关的 Tmux 问题,提供了一种获取前台进程组的更新方法,假设您的ps
版本支持tpgid
(procps-ng
以及可能的其他版本)。
与 @John1024 的答案一样,我们假设 Bash 进程的 pid 为 1857,那么:
ps -o tpgid:1= -p 1857
答案3
Ctrl+Z可能会告诉你...然后你可以用来ps
查看进程并查看它是否有任何子进程。
当然,如果程序不打算在后台运行,那么这种方法就行不通。
您也可以登录并尝试w
然后使用ps
或top
来查看他们在做什么。