Try this:
ps -o stat= -p $PPID
If the result contains "s" (lowercase) it was either run from the command line or backgrounded from within a script. To tell those two apart:
ps -o stat= -p $$
will contain a "+" if it was not backgrounded.
Here's a table:
Run $$ $PPID
CL S+ Ss
CL& S Ss+
Script S+ S+
Script& S S
Script(&) S Ss
Script&(&) S NULL
Where (&) means the child script was backgrounded and & means the parent script (which is what "Script" refers to) that ran it was backgrounded. CL means command line. NULL means that ps output a null and that $PPID
is "1".
From man ps
:
s is a session leader
+ is in the foreground process group
It should be noted that this answer is based on GNU ps
, but the man pages for BSD (including OS X) indicate similar functionality. And GNU ps
is a hybrid that includes BSD functionality, among others.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…