I'm trying to write a mail program which might contain data that a user wouldn't want to lose upon a broken SSH/telnet connection. Would SIGHUP
be sent to the process? After all, it's the "hangup" signal...
-
It depends - see for example [In which cases is SIGHUP not sent to a job when you log out?](84737).– Thomas DickeyDec 10, 2015 at 14:23
-
@Thomas, ITYM In which cases is SIGHUP not sent to a job when you log out?. (yes, I agree it's a real pain to link to other questions in comments).– Stéphane ChazelasDec 10, 2015 at 14:33
-
Depends if a pty is used. So with telnet yes, with ssh, only for interactive sessions or if passed -t/-tt– Stéphane ChazelasDec 10, 2015 at 14:35
-
odd - it looked okay after I saved the edit.– Thomas DickeyDec 10, 2015 at 14:37
-
@Thomas, just found SE Comment Link Helper, testing just now (edit: it works!)– Stéphane ChazelasDec 10, 2015 at 14:51
1 Answer
By default the process will be sent a SIGHUP
. The default signal handler (trap) will shutdown the program relatively gracefully, but won't save the users work.
In your case, I would have the program include a trap routine that saves the user's work when a SIGHUP
is received. You can catch and handle all signals except SIGKILL
. You may also want to run the same routine for a SIGTERM
interupt.
There are other mechanisms that can be used to avoid getting a SIGHUP
signal, but handling the signal is the simplest and safest. If the other approachs fail, or a SIGHUP
is sent with the kill
command your process would still shutdown without saving the work.
-
With
ssh host 'cmd'
,cmd
won't get a SIGHUP if the connection drops.cmd
could get a SIGPIPE if it tries to write something on stdout/stderr after the connection has dropped (with openssh, there are issues with that when using connection sharing). Dec 10, 2015 at 14:55