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:
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.