找出 bash 上哪个进程处于前台

找出 bash 上哪个进程处于前台

我有一个打开的 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提供该字段。该字段中的STATA+告诉我们该进程位于前台

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版本支持tpgidprocps-ng以及可能的其他版本)。

与 @John1024 的答案一样,我们假设 Bash 进程的 pid 为 1857,那么:

ps -o tpgid:1= -p 1857

答案3

Ctrl+Z可能会告诉你...然后你可以用来ps查看进程并查看它是否有任何子进程。

当然,如果程序不打算在后台运行,那么这种方法就行不通。

您也可以登录并尝试w然后使用pstop来查看他们在做什么。

相关内容