SSH connection hanging on logout
Damien Miller
djm at mindrot.org
Sat May 5 15:53:56 EST 2001
On Fri, 4 May 2001, Daniel David Benson wrote:
>
> I am running OpenSSH 2.9p1 on SunOS 5.7 w/4-24-2001 patch cluster.
> Like many other users I am seeing the hanging session on logout
> with background processes. This is a huge problem for me as
> I centrally manage 50+ machines with rdist across ssh.
> Instead of just complaining about the problem I thought I would
> put my CS degree to use and try to track down the problem myself.
> For starters, though, can someone point me in the right direction?
This is the best description of the problem, pinched from Redhat:
About the hang-on-exit bug: this is the TODO item which shows up when you
run "ssh server 'sleep 20 & exit'".
* The shell starts up, and starts its own session. As a side-effect, it
gets its own process group.
* The child forks off sleep, and because it's in the background, puts it
into its own process group. The sleep command inherits a copy of the
shell's descriptor for the tty as its stdout.
* The shell exits, but doesn't SIGHUP all of its child PIDs like it probably
should.
* The sshd server attempts to read from the master side of the pty, and
while there are still process with the pty open, no EOF is produced.
* The sleep command exits, closes its descriptor, sshd detects the EOF, and
the connection gets closed.
Attempts at fixing this in sshd, and why they don't work:
* SIGHUP the sshd's process group.
- The shell is in its own process group.
* Track process group IDs of all children before we reap them (via an extra
field in Session structures which holds the pgid for each child pid), and
SIGHUP the pgid when we reap.
- Background commands are in yet another process group.
* Close the connection when the child dies.
- Background commands may need to write data to the connection. Also
prematurely truncates output from some commands (scp server, the
famous "dd if=/dev/zero bs=1000 count=100" case).
Known-good workarounds:
* bash: shopt huponexit on
* tcsh: none
* zsh: ?
* pdksh: ?
This appears to affect rsh as well: it behaves the same with 'sleep 20 & exit'.
--
| Damien Miller <djm at mindrot.org> \ ``E-mail attachments are the poor man's
| http://www.mindrot.org / distributed filesystem'' - Dan Geer
More information about the openssh-unix-dev
mailing list