-
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
[JENKINS-25503] Use setsid instead of nohup
Priority | Original: Minor [ 4 ] | New: Major [ 3 ] |
Description |
Original:
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|http://superuser.com/questions/708919/ctrlc-in-a-sub-process-is-killing-a-nohuped-process-earlier-in-the-script]). In looking at {{nohup.c}}, nohup [only ignores SIGHUP|https://gist.github.com/kohsuke/0eeb9bb43ca8d62643dd#file-nohup-c-L219]. 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|http://en.wikipedia.org/wiki/Process_group] for interaction of signals, process groups, and sessions. |
New:
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|http://superuser.com/questions/708919/ctrlc-in-a-sub-process-is-killing-a-nohuped-process-earlier-in-the-script]). In looking at {{nohup.c}}, nohup [only ignores SIGHUP|https://gist.github.com/kohsuke/0eeb9bb43ca8d62643dd#file-nohup-c-L219]. 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|https://gist.github.com/kohsuke/2ed6558d3c4d1f129837]}} 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|http://en.wikipedia.org/wiki/Process_group] for interaction of signals, process groups, and sessions. |
Labels | New: workflow |
Link |
New:
This issue is related to |
Link |
New:
This issue is related to |
setsid(1) doesn't appear available on Solaris (source) nor FreeBSD (source).
My proposal would be to write an equivalent command in Python.