Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

bash setsid nohup ./prog & -- $! not pointed at child process

I was trying to get pid of process I ran with setsid and which ought to run in background like this:

test.sh:

#/bin/bash
setsid nohup ./my_program &
echo $!

if I run ./test.sh it will print a pid of my_program process and it's exactly what I need. But if run this commands one by one in my shell like this:

$ setsid nohup ./my_program &
$ echo $!

It will give me a pid of setsid command (or may be something else, but it almost all times gives me pid of my_program minus one).

What is happening here? Why results of commands I ran in terminal by myself differs from results of test.sh script?

Btw, may be you know some easy way of process which I started with setsid and which I need to run in background?

like image 376
PepeHands Avatar asked Dec 17 '25 16:12

PepeHands


2 Answers

Repost of comments above as an answer:

This is because setsid only forks the current process if it is the process group leader. A detailed explanation can be found here.

To get the pid of a process executed via setsid, the approaches given here may be tried.

like image 185
0range Avatar answered Dec 19 '25 05:12

0range


setsid will call fork to ensure that it creates a new process group aswell as a new session, hence the resulting pid will not match the pid of setsid. The most clean work-around would be that my_program stores its pid into a file.

When you later want to send kill to my_program, you should check that the pid actually matches a program named my_program via /proc file system or calling the ps command with some magic code around it. (This is a very common method used by many daemons)

like image 41
Stian Skjelstad Avatar answered Dec 19 '25 07:12

Stian Skjelstad



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!