all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* Asynchronous shell command that leaves a background process running
@ 2010-10-20 20:51 Sean McAfee
  2010-10-20 22:43 ` Andreas Politz
  2010-10-21  3:41 ` Pascal J. Bourguignon
  0 siblings, 2 replies; 7+ messages in thread
From: Sean McAfee @ 2010-10-20 20:51 UTC (permalink / raw)
  To: help-gnu-emacs

I've written a shell script which is essentially a single exec command:

  #!/bin/bash
  exec real-program fixedarg1 fixedarg2 "$@"

"real-program" chugs along for several seconds, printing some status
messages in the meantime, before finally forking off a background
process and exiting.  The background process manifests a window on my
desktop.

All is well when I run this command from an interactive shell, but
things fall apart when I try to run it as an asynchronous shell command
from Emacs, a la:

  (shell-command "wrapper-script arg1 arg2 &")

I see the status messages appear in the *Async Shell Command* buffer,
but when the command exits, no desktop window appears.

The only fix I've found is to execute real-program in a separate process
group:

  #!/bin/bash
  perl -e 'if (fork() == 0) { setpgrp; exec @ARGV } wait' \
    real-program fixedarg1 fixedarg2 "$@"

I guess Emacs is sending a fatal signal (probably SIGHUP) to the
asynchronous shell's process group after the main process exits.

Naturally I don't want to have to write my scripts defensively against
the possibility of running asynchronously from Emacs.  So I can just
move my perl/setpgrp wrapper inside Emacs:

  (shell-command "perl -e 'if (fork() == 0) { setpgrp; exec @ARGV } wait' wrapper-script arg1 arg2 &")

That's pretty ugly, though.  A little Googling turned up the nohup
command, which also mostly does the job:

  (shell-command "nohup wrapper-script arg1 arg2 | cat &")

The "| cat" is necessary to prevent nohup from redirecting output to
nohup.out.  That's still ugly, and I also get the distracting header
"nohup: ignoring input and redirecting stderr to stdout" prepended to my
normal output.

Is there a more elegant way to address this problem?


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2010-10-22 18:34 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-20 20:51 Asynchronous shell command that leaves a background process running Sean McAfee
2010-10-20 22:43 ` Andreas Politz
2010-10-21 17:48   ` Sean McAfee
2010-10-21 18:22     ` Andreas Politz
2010-10-22 18:34       ` Sean McAfee
2010-10-21  3:41 ` Pascal J. Bourguignon
2010-10-21 19:24   ` Sean McAfee

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.