Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Commands run from functions don't exit cleanly on terminal close (SIGHUP)?



Ok, I just went through all of this and reproduced the experiment on zsh 4.3.11 and 5.0.0 (Macports). I got the same results with both shell versions.

# start 2 ssh sessions in zsh 5.0.0 from macports, one from ZLE/CLI and one via a function...
     TIME   PID  PGID  PPID COMMAND
  0:00.02 12084 12084 10729 /usr/bin/ssh imac -t screen -xRS MainScreen && echo FROM FUNCTION
  0:00.02 12131 12131 10903 /usr/bin/ssh imac -t screen -xRS MainScreen

To show you the process stack via pstree:
# from function
-+= 00001 root /sbin/launchd
 \-+= 00214 apinstein /sbin/launchd
   \-+= 00229 apinstein /Applications/iTerm.app/Contents/MacOS/iTerm -psn_0_24582
     \-+= 10659 root login -fp apinstein
       \-+= 10660 apinstein -zsh
         \-+= 10729 apinstein zsh
           \--= 12084 apinstein /usr/bin/ssh imac -t screen -xRS MainScreen && echo FROM FUNCTION

# ZLE
-+= 00001 root /sbin/launchd
 \-+= 00214 apinstein /sbin/launchd
   \-+= 00229 apinstein /Applications/iTerm.app/Contents/MacOS/iTerm -psn_0_24582
     \-+= 10820 root login -fp apinstein
       \-+= 10821 apinstein -zsh
         \-+= 10903 apinstein zsh
           \--= 12131 apinstein /usr/bin/ssh imac -t screen -xRS MainScreen

Now, go "close" both terminals... and re-run PS:

     TIME   PID  PGID  PPID COMMAND
  0:00.02 12084 12084     1 /usr/bin/ssh imac -t screen -xRS MainScreen && echo FROM FUNCTION

So, as far as I can tell, both processes look *identical* in terms of their process group IDs, parents, etc, and only act different when closed.

I would think according to your notes about how the OS/Process Groups work, that the HUP signal would get sent to both setups the exact same way, no?

Anything else I should be looking at?

Alan

On Oct 28, 2012, at 1:07 PM, Bart Schaefer wrote:

> On Oct 27,  9:33pm, Alan Pinstein wrote:
> }
> } Oh, duh yes I was HUP'ing the php process. Well of course that's what
> } would happen...
> 
> You didn't answer the question about which zsh version is involved.
> 
> } In any case I think that's kind of a digression; the simple truth is
> } still that when the shell gets the SIGHUP from the Terminal program,
> } it isn't propagating that to its children *if* the children are
> } started in a function.
> 
> I think you're missing the point I've been trying to make.  Regardless
> of whether the child is started from a function or not, closing the
> terminal sends a HUP signal only to the foreground job.  This is what
> is supposed to happen:
> 
> When zsh starts a job in the foreground, it makes that job the process
> group leader for the terminal.  After that, until zsh itself exits, the
> signals are all generated by the OS / terminal driver.
> 
> If you are at the ZLE prompt, then zsh is the foreground job.  It gets
> the signal and/or EOF from the terminal, and (assuming NO_HUP is not
> set) it explicitly sends HUP to all background children.
> 
> If you are not at the ZLE prompt -- e.g., your PHP program is running --
> then the terminal wil HUP the PHP program, but will not HUP zsh.  *After*
> that, it's possible that the behavior is different depending on whether
> a function is involved, but it should be the case that only the "process
> group leader" of the foreground process gets HUP'd.  This is an operating
> system thing, not a zsh thing.
> 
> If the foreground job exits, then zsh will wake up and at some point
> attempt to read from the terminal.  At that point it will get EOF, and
> therefore (once again depending on NO_HUP) send HUP to all of its
> background children.  In the case of your willnotdie function, the main
> zsh loop is not re-entered until the function finishes, so zsh won't
> see an EOF right away.
> 
> Now, I say that's what's supposed to happen, because there do seem to
> be some cases on MacOS where it doesn't work that way.  In particular
> with the stock 4.3.11 I see everything exit with no output from traps
> ever written to the file; but with 5.0 compiled under macports, I get
> output from the HUP trap.
> 
> } So I just re-did the test with a custom PHP script that logs signals
> } (except for KILL and STOP, it can't).
> }
> } [...]
> 
> I can't test this because on my Mountain Lion iMac I get:
> 
> Fatal error: Call to undefined function pcntl_signal() in /private/tmp/trap.php
> on line 5
> 
> which is very strange because php -v says
> 
> PHP 5.3.15 with Suhosin-Patch (cli) (built: Aug 24 2012 17:45:44)
> 
> } When run directly (php trap.php) and closing the terminal window, cat
> } sig yields:
> }
> } > Sat Oct 27 21:20:41 EDT 2012
> } > PHP START
> } 
> } So it looks like zsh sends KILL or STOP to all processes when ZSH
> } itself gets the HUP from the Terminal?
> 
> No, zsh won't do that.  It never sends KILL or STOP.  Note, though, that
> this is similar to the behavior of "willnotdie" that I observed on MacOS
> with the stock 4.3.11.  Repeat my version question.
> 
> } And when run in a zsh function:
> } 
> } > function p() { php trap.php }
> } 
> } cat sig yields:
> } 
> } Sat Oct 27 21:20:03 EDT 2012
> } PHP START
> } Sat Oct 27 21:20:14 EDT 2012
> } PHP DONE
> 
> Note here that PHP still did not log a HUP signal, so it appears that
> there is not a HUP being sent.
> 
> } *and* the PPID of the php process is 1 after the window closes...
> 
> Which means that zsh has already exited -- so either something external
> is killing it (repeat my question about whether you're running ssh in a
> terminal, or running a terminal in ssh), or the wait()-family system
> call that zsh makes [to go dormant while PHP is in the foreground] has
> returned so zsh was fooled into believing PHP had also exited.
> 
> Neither of these *ought* to happen.
> 
> -- 
> Barton E. Schaefer



Messages sorted by: Reverse Date, Date, Thread, Author