-
Bug
-
Resolution: Fixed
-
Major
-
-
durable-task 1.31
durable task step currently uses nohup to launch a durable process. But if Jenkins is started from an interactive terminal and the user presses Ctrl+C, the forked process is still gone. So far we've blushed it off saying this is not how Jenkins is typically run. That may be true, but it is also a perfectly reasonable way to run Jenkins, for example for the first time evaluation.
The reason these processes get killed with Ctrl+C is because shell sends SIGINT to all the processes in the process group (source). In looking at nohup.c, nohup only ignores SIGHUP. You can also run a command like nohup sleep 30 from the command line. hit Ctrl+C, and observe that the sleep 30 process gets killed.
The root problem is that nohup is a poor way to isolate a child process. Specifically, it doesn't put the process into a new process group, so it's vulnerable to any signal sent to the entire process group (of which Ctrl+C is one.) setsid is a better way of doing this. This puts the process into a new session (hence also new process group.) So no group-wide signal will get to the child process.
See Wikipedia process group page for interaction of signals, process groups, and sessions.
- is related to
-
JENKINS-25848 Shell step fails on Mac: nohup: can't detach from console: No such file or directory
- Resolved
-
JENKINS-27617 Isolate durable task in a dedicated Windows process group
- Resolved
- relates to
-
JENKINS-25053 Record process ID of spawned process on Windows
- Open
-
JENKINS-50379 Jenkins kills long running sh script with no output
- Open
-
JENKINS-58290 WebSocket / OkHttp thread leak from BourneShellScript + ContainerExecDecorator
- Resolved
-
JENKINS-47791 Eliminate ProcessLiveness
- Resolved
- links to