Los processs pierden el file adjunto al shell cuando se inicia vía bash -x

Normalmente, si ejecuto emacs & y luego cierro el shell, emacs saldrá.

Sin embargo, si ejecuto bash -x foo.foo (donde foo.foo es un script que ejecuta emacs & ), entonces emacs permanecerá abierto incluso cuando salga del shell.

¿Hay alguna forma de cerrar todos los processs cuando sale el shell, incluso cuando los processs se iniciaron mediante una llamada a bash -x ?

No, esto no es posible:

Normalmente, cuando inicia un progtwig en segundo plano usando & el shell pierde el control sobre él, y no terminará cuando el shell se cierre. Esto es cierto incluso si no usa la opción -x para bash .

Los shells interactivos son la exception a esta regla: pueden hacer algo llamado "control de trabajo" para monitorear los processs secundarios que iniciaron, y terminarlos cuando sale el shell interactivo / de inicio de session. (Esto también es configurable; es posible dejar los processs en segundo plano en ejecución, y ese es en realidad el comportamiento pnetworkingeterminado para la mayoría de los processs).

Puede foo.foo este problema de varias foo.foo , pero solo para finalizar emacs cuando el script foo.foo , no cuando sale el intérprete de commands que llama, esto se debe a que llamar a bash -x ejecuta otro (sub) shell, y el shell padre interactivo no no "saber" sobre los hijos de la subshell.

Podría agregar una trampa en EXIT que mata todos los processs en su session:

(para agregar a su .bashrc ):

 killall_on_exit() { sid=$(ps -o sid= -p "$$") if [ "$sid" -eq "$$" ]; then # we're the session leader ( trap '' TERM ps -eo pgid= -o sid= | awk -v sid="$sid" '$2 == sid && !seen[$1]++ {print "-" $1}' | xargs kill -s TERM -- ) fi } trap killall_on_exit EXIT 

Eso mata a todos los grupos de processs en su session. Eso no eliminará los processs que se inician en una nueva session, pero dado que las nuevas sesiones suelen iniciarse con emuladores de terminal, si se mata al emulador de terminal, es probable que el process que generó también muera (y sus hijos si el líder es un golpe interactivo con esa misma trampa).

nohup o el disown típicamente no harán que los commands sean inmunes a eso.

Puede replace los TERM arriba con HUP , pero luego observe que algunos commands como xterm ignoran los SIGHUP.

Para inmunizar un command contra SIGTERM, comienza como:

 (trap '' TERM; emacs &)