¿Salir de zsh, pero dejar abiertos los trabajos en ejecución?

96

Acabo de cambiar de bash a zsh.

En bash, las tareas en segundo plano continúan ejecutándose cuando el shell sale. Por ejemplo aquí, dolphincontinúa ejecutándose después de exit:

$ dolphin .
^Z
[1]+  Stopped                 dolphin .
$ bg
[1]+ dolphin . &
$ exit

Esto es lo que quiero como comportamiento predeterminado.

Por el contrario, el comportamiento de zsh es advertir sobre la ejecución de trabajos exity luego cerrarlos si exitvuelve a hacerlo . Por ejemplo, aquí, dolphinse cierra cuando el segundo exitcomando realmente sale del shell:

 % dolphin .
^Z
zsh: suspended  dolphin .
 % bg
[1]  + continued  dolphin .
 % exit
zsh: you have running jobs.
 % exit 

¿Cómo hago aquí el comportamiento predeterminado de zsh como el de bash?

Owen_R
fuente

Respuestas:

169

Inicie el programa con &!:

dolphin &!

El &!( o equivalentemente,&| ) es un atajo específico de zsh tanto para el segundo plano como para rechazar el proceso, de modo que salir del shell lo dejará en ejecución.

Anko
fuente
2
Para completar, ¿puede también enumerar cómo repudiarlo una vez que ya ha comenzado?
trusktr
@trusktr Hay una pregunta diferente sobre el rechazo del proceso de primer plano . Creo que es mejor mantenerlo separado para mayor claridad. Para cualquier persona interesada en zsh específicamente, le hice una pregunta en U&L SE sobre cómo crear un flujo de trabajo más rápido para rechazar el proceso de primer plano .
Anko
Me gusta esta solución y la implementaré para comandos individuales, pero todavía estoy buscando una forma de cambiar el comportamiento predeterminado de Zsh.
Vince
1
@Vince ¿Te refieres a cambiar el valor predeterminado para siempre rechazar los procesos en segundo plano? Si es así, puede hacerlo con setopt nohupsu ~/.zshrc. Entonces, iniciar un comando en segundo plano con &también lo rechazará siempre. Aunque, de forma predeterminada, zsh todavía le recordará que tiene trabajos en ejecución cuando intente salir. También puedes apagar eso con setopt nocheckjobs.
Anko
@Anko creo que setopt nocheckjobshace lo que quiero. Ahora encontré las opciones disponibles en man zshoptions. Me gustaría apagar la advertencia. Sé cuando tengo procesos en segundo plano y no los necesito. Me gustaría cerrar los procesos en segundo plano a menos que los inicie con nohup. Actualmente uso esto con una función de shell que ejecuta PyCharm en segundo plano con nohup. Cuando escribo, pycharm .se ejecuta nohup charm $@ &. No se cierra cuando cierro la terminal, pero sigo recibiendo esa advertencia y tengo que escribir exitdos veces.
Vince
59

De la documentación de zsh :

HUP

... En zsh, si tiene un trabajo en segundo plano ejecutándose cuando el shell sale, el shell asumirá que desea que se elimine; en este caso, se envía una señal particular llamada SIGHUP... Si a menudo inicia trabajos que deberían continuar incluso cuando el shell ha salido, puede configurar la opción NO_HUPy los trabajos en segundo plano se dejarán en paz.

Así que configura la NO_HUPopción:

% setopt NO_HUP
Carl Norum
fuente
Si no quiere la advertencia, sí.
Carl Norum
30

Descubrí que usar una combinación de nohup, &y disownfunciona para mí, ya que no quiero que los trabajos se ejecuten permanentemente cuando el shell ha salido.

nohup <command> & disown

Si bien &me ha funcionado bash, descubrí que cuando usaba solo nohup, &o disownen comandos en ejecución, como un script que llama a un comando de ejecución de Java, el proceso aún se detendría cuando se salía del shell.

  • nohuphace que el comando ignore NOHUPySIGHUP señales desde el shell
  • & hace que el proceso se ejecute en segundo plano en un subterminal
  • disownseguido de un argumento (el índice del número de trabajo en su lista de trabajos) evita que el shell envíe una SIGHUPseñal a los procesos secundarios. El uso disownsin un argumento hace que se establezca de forma predeterminada en el trabajo más reciente.

Encontré la información nohupy disownen esta página , y la &información en esta respuesta SO .

Ryanjdillon
fuente
5

Normalmente lo uso screenpara mantener en ejecución los trabajos en segundo plano.

1) Cree una sesión de pantalla:

screen -S myScreenName

2) Ejecute sus scripts, servicios, demonios o lo que sea

3) Salir (desconectar) de la sesión de pantalla con

screen -d

o atajo ALT+A then d


Después de algunos cientos de años, si desea reanudar su sesión (vuelva a adjuntar):

screen -r myScreenName

Si desea saber si hay una sesión de pantalla, su nombre y su estado (adjunto o separado):

screen -ls

Esta solución funciona en todos los intérpretes de terminal como bash, zsh, etc. Consulte también man screen

Aydin K.
fuente
Una nota para los usuarios de MacOS, el atajo de teclado para desconectar de la pantalla era Control + A, luego D. Además, esta era mi única opción cuando dejé un proceso en ejecución y cediendo a stdout, escribir screen -d allí no ayudaría.
Bishoy
Agradable, pero no tiene nada que ver con Q, que trata específicamente sobre cómo mantener en ejecución las tareas de bg al salir de ZSH.
RichieHH