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