5

I have a bash session open for which I have the PID, although I am not in control of the terminal (e.g. could be another user). This bash session has spawned some child processes.

Is there any way to tell which (if any) of the child processes is currently in the foreground for that bash session?

Cheetah
  • 603

3 Answers3

8

You didn't specify an operating system. I am going to assume that you have access to GNU ps.

Suppose the bash session PID is, for example, 1857. Then, to find out which processes are in foreground and background in that session, run:

$ 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

Look at the STAT column. The + suffix identifies foreground processes. The other processes are background.

In the example above, sleep 30m is in the background in that shell (status is plain S) while man ps is in the foreground (status is S+).

How it works:

  • --ppid 1857

    This tells ps to limit output to those processes whose parent PID is 1857.

  • -O stat

    This tells ps to provide the STAT field in the output. A + in this field tells us the process is in forground

The ps STAT field in detail

man ps provides details on how to interpret the status field:

PROCESS STATE CODES Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process:

           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

You are interested in whether a process is foreground, the last item is key: + signifies a foreground process.

John1024
  • 74,655
1

From this great answer by @KamilMaciorowski to a somewhat related Tmux question, comes an updated way of getting the foreground process group, assuming your ps version supports tpgid (procps-ng and potentially others).

As with @John1024's answer, we'll assume the Bash process is pid 1857, then:

ps -o tpgid:1= -p 1857
NotTheDr01ds
  • 3,547
0

Ctrl+Z might tell you... you could then use ps to view the process and see if it has any children.

Of course, if the program isn't meant to be backgrounded then that approach won't work.

You could also log in and try w and then use ps or top to see what they are doing.

SailorCire
  • 2,503