BASH - How to get the pid of a backgrounded process from the process

der.hans PLUGd at LuftHans.com
Thu Feb 4 21:44:19 MST 2016


Am 04. Feb, 2016 schwätzte der.hans so:

moin moin,

for completeness...

you made me reach to the Advanced Bash-Scripting Guide to remember the
variable name :).

Notice the values of $BASHPID in a COMMAND EXECUTION ENVIRONMENT vs in a
true subshell.

http://www.tldp.org/LDP/abs/html/internalvariables.html#BASHPIDREF

:) lufthans at anke:~$ cat fred.sh 
function backGround() {
          echo "Pid $1 is $$ $BASHPID $SHLVL"
          sleep 3
}
function backGround_subshell() {
          echo "echo Pid $1 is $$ $BASHPID $SHLVL"
          sleep 3
}
echo "My pid is $$ $BASHPID $SHLVL"
backGround 1 &
echo "BPid 1 is $!"
ps -ef | grep $!
(backGround_subshell 4) &
echo "BPid 4 is $!"
ps -ef | grep $!
bash -c 'echo true subshell PID $$ $BASHPID $SHLVL; ps -ef | grep $$'
wait
echo
:) lufthans at anke:~$

:) lufthans at anke:~$ bash fred.sh anke
My pid is 27811 27811 2
BPid 1 is 27812
Pid 1 is 27811 27812 2
lufthans 27812 27811  0 21:34 pts/0    00:00:00 bash fred.sh anke
lufthans 27814 27811  0 21:34 pts/0    00:00:00 grep 27812
lufthans 27815 27812  0 21:34 pts/0    00:00:00 sleep 3
BPid 4 is 27816
echo Pid 4 is 27811 27816 2
lufthans 27816 27811  0 21:34 pts/0    00:00:00 bash fred.sh anke
lufthans 27818 27811  0 21:34 pts/0    00:00:00 grep 27816
lufthans 27819 27816  0 21:34 pts/0    00:00:00 sleep 3
true subshell PID 27820 27820 3
lufthans 27820 27811  0 21:34 pts/0    00:00:00 bash -c echo true subshell
PID $$ $BASHPID $SHLVL; ps -ef | grep $$
lufthans 27821 27820  0 21:34 pts/0    00:00:00 ps -ef
lufthans 27822 27820  0 21:34 pts/0    00:00:00 grep 27820

:) lufthans at anke:~$

ciao,

der.hans

> Am 04. Feb, 2016 schwätzte Bryan O'Neal so:
>
> moin moin,
>
> $( ) is command redirection.
>
> ( ) is a subshell, sort of.
>
> Here are some excerpts from the bash man page:
>
> ###
>       (list) list is executed in a subshell environment (see  COMMAND EXECU
>              TION  ENVIRONMENT below).
>
> COMMAND EXECUTION ENVIRONMENT
>       The shell has an execution environment, which consists of  the
> follow
>       ing:
> .
> .
> .
>       ·      various  process  IDs,  including  those of background
> jobs, the
>              value of $$, and the value of PPID
> ###
>
> If you want a full subshell, invoke bash and create another process. Also,
> check the values of SHLVL.
>
> :) lufthans at fred:~$ cat fred.sh function backGround() {
>        echo "Pid $1 is $$ $SHLVL"
>        sleep 3
> }
> function backGround_subshell() {
>        echo "echo Pid $1 is $$ $SHLVL"
>        sleep 3
> }
> echo "My pid is $$ $SHLVL"
> backGround 1 &
> echo "BPid 1 is $!"
> ps -ef | grep $!
> (backGround_subshell 4) &
> echo "BPid 4 is $!"
> ps -ef | grep $!
> bash -c 'echo true subshell PID $$ $SHLVL; ps -ef | grep $$'
> wait
> echo
> :) lufthans at fred:~$
>
> :) lufthans at fred:~$ bash fred.sh anke
> My pid is 27695 2
> BPid 1 is 27696
> Pid 1 is 27695 2
> lufthans 27696 27695  0 21:26 pts/0    00:00:00 bash fred.sh anke
> lufthans 27698 27695  0 21:26 pts/0    00:00:00 grep 27696
> lufthans 27699 27696  0 21:26 pts/0    00:00:00 sleep 3
> BPid 4 is 27700
> echo Pid 4 is 27695 2
> lufthans 27700 27695  0 21:26 pts/0    00:00:00 bash fred.sh anke
> lufthans 27702 27695  0 21:26 pts/0    00:00:00 grep 27700
> true subshell PID 27704 3
> lufthans 27704 27695  0 21:26 pts/0    00:00:00 bash -c echo true subshell
> PID $$ $SHLVL; ps -ef | grep $$
> lufthans 27705 27704  0 21:26 pts/0    00:00:00 ps -ef
> lufthans 27706 27704  0 21:26 pts/0    00:00:00 grep 27704
>
> :) lufthans at fred:~$
>
> ciao,
>
> der.hans
>
>> Sorry for the cross post but this is not an easy question I don't think....
>> 
>> Given:
>> Pid of a process is $$
>> Pid of a child process just spawned is $!
>> However a child process does not see $$ as it's pid but rather the pid of
>> it's parent... How can the child process know it's own pid?
>> 
>> Example:
>> [root at mybox l]# cat backTest
>> function backGround() {
>>        echo "Pid $1 is $$"
>> }
>> function backGround_subshell() {
>>        echo "echo Pid $1 is $$"
>> }
>> echo "My pid is $$"
>> backGround 1 &
>> echo "BPid 1 is $!"
>> backGround 2 &
>> echo "BPid 2 is $!"
>> backGround 3 &
>> echo "BPid 3 is $!"
>> $(backGround_subshell 4) &
>> echo "BPid 4 is $!"
>> $(backGround_subshell 5) &
>> echo "BPid 5 is $!"
>> $(backGround_subshell 6) &
>> echo "BPid 6 is $!"
>> wait
>> echo
>> [root at mybox l]# bash backTest
>> My pid is 16712
>> BPid 1 is 16713
>> Pid 1 is 16712
>> BPid 2 is 16714
>> Pid 2 is 16712
>> BPid 3 is 16715
>> BPid 4 is 16716
>> BPid 5 is 16717
>> BPid 6 is 16719
>> Pid 4 is 16712
>> Pid 3 is 16712
>> Pid 6 is 16712
>> Pid 5 is 16712
>> 
>
>

-- 
#  http://www.LuftHans.com/        http://www.PhxLinux.org/
#  "We should not be building surveillance technology into standards.
#  Law enforcement was not supposed to be easy.
#  Where it is easy, it's called a police state."  -- Jeff Schiller


More information about the PLUG-discuss mailing list