Hay trabajos detenidos (al salir de bash)

158

Recibo el mensaje There are stopped jobs.cuando intento salir de un shell bash a veces. Aquí hay un escenario reproducible en python 2.x:

  • ctrl+ ces manejado por el intérprete como una excepción.
  • ctrl+ z'detiene' el proceso.
  • ctrl+ dsale de Python para reales.

Aquí hay una salida de terminal del mundo real:

example_user@example_server:~$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ctrl+z

[1]+  Stopped                 python
example_user@example_server:~$ exit
logout
There are stopped jobs.

Bash no salió, debo exitvolver a salir del bash shell.

  • P: ¿Qué es un 'trabajo detenido' o qué significa esto?
  • P: ¿Se puede reanudar un proceso detenido?
  • P: ¿El primero exitmata los trabajos detenidos?
  • P: ¿Hay alguna forma de salir del shell la primera vez? (sin entrar exitdos veces)
ThorSummoner
fuente
ctrl + shift + \ también hará que Python salga.
ThorSummoner

Respuestas:

206

Un trabajo detenido es aquel que se ha colocado temporalmente en segundo plano y ya no se está ejecutando, pero aún está utilizando recursos (es decir, memoria del sistema). Debido a que ese trabajo no está conectado al terminal actual, no puede producir resultados y no recibe entradas del usuario.

Puede ver los trabajos que está ejecutando utilizando el jobscomando incorporado en bash, probablemente también otros shells. Ejemplo:

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 

Puede reanudar un trabajo detenido utilizando el fgcomando incorporado bash (primer plano). Si tiene varios comandos que se han detenido, debe especificar cuál reanudar pasando el número de especificación de trabajos en la línea de comando con fg. Si solo se detiene un programa, puede usar fgsolo:

user@mysystem:~$ fg 1
python

En este punto, vuelve al intérprete de Python y puede salir utilizando control-D.

Por el contrario, puede killejecutar el comando con su especificación de trabajo o PID. Por ejemplo:

user@mysystem:~$ ps
  PID TTY          TIME CMD
16174 pts/3    00:00:00 bash
17781 pts/3    00:00:00 python
18276 pts/3    00:00:00 ps
user@mysystem:~$ kill 17781
[1]+  Killed                  python
user@mysystem:~$ 

Para usar la especificación de trabajo, preceda el número con la tecla de porcentaje (%):

user@mysystem:~$ kill %1
[1]+  Terminated              python

Si emite un comando de salida con trabajos detenidos, se mostrará la advertencia que vio. Los trabajos se dejarán en ejecución por seguridad. Eso es para asegurarse de que está consciente de que está intentando matar trabajos que podría haber olvidado que detuvo. La segunda vez que utiliza el comando de salida, los trabajos finalizan y el shell sale. Esto puede causar problemas para algunos programas que no están destinados a ser eliminados de esta manera.

En bash parece que puedes usar el logoutcomando que matará los procesos detenidos y saldrá. Esto puede causar resultados no deseados.

También tenga en cuenta que algunos programas pueden no salir cuando se terminan de esta manera, y su sistema podría terminar con una gran cantidad de procesos huérfanos utilizando recursos si tiene la costumbre de hacerlo.

Tenga en cuenta que puede crear un proceso en segundo plano que se detendrá si requieren la entrada del usuario:

user@mysystem:~$ python &
[1] 19028
user@mysystem:~$ jobs
[1]+  Stopped                 python

Puede reanudar y eliminar estos trabajos de la misma manera que realizó los trabajos que detuvo con la Ctrl-zinterrupción.

Viejo contador de tiempo
fuente
44
Me gustaría discutir con tu segunda oración. Debería decir: "Debido a que el trabajo se detiene , no puede realizar ninguna acción: E / S de archivo, E / S de red, E / S de terminal o cualquier otro procesamiento"
Scott
2
Esto me ayuda mucho.
hasta el
Excelente publicación de gran ayuda para cualquiera!
George Udosen
18

P: ¿Qué es un 'trabajo detenido' o qué significa esto?

El trabajo detenido significa el proceso que recibió la señal de detención ( SIGSTOP/ SIGTSTP) del teclado (carácter de suspensión Ctrl-Z), comando (por ejemplo kill -STOP [PID]) u otro proceso (por ejemplo, el núcleo cuando el sistema no tiene recursos) y está en estado de pausa, por lo que le dice al sistema que detenga / suspenda un proceso para que no realice ninguna ejecución / procesamiento.

Empleos de concha activos se pueden enumerar por: jobs.

P: ¿Se puede reanudar un proceso detenido?

El proceso detenido solo reanudará su ejecución si se le envía la SIGCONTseñal. Esto se puede lograr mediante fg(o fg ID) que moverá el trabajo al primer plano convirtiéndolo en el trabajo actual, bgpara continuarlo en segundo plano o enviando una SIGCONTseñal (por ejemplo kill -CONT [PID]).

P: ¿La primera salida mata los trabajos detenidos?

La primera vez que escribe exit/ logouto presiona Ctrl-D, el shell imprime un mensaje de advertencia sobre los trabajos activos actuales que están asociados con su terminal, por lo tanto, no matará a aquellos sin su permiso al confirmar la acción por segunda vez. Si la checkjobsopción está habilitada ( shopt -s checkjobs), también puede enumerar los trabajos con sus estados.

P: ¿Hay alguna forma de salir del shell la primera vez? (sin entrar en la salida dos veces)

Puede presionar Ctrl+Ddos veces o mantenerlo presionado durante más tiempo, esto saldrá de la carcasa en silencio rápidamente y matará los trabajos actuales de parada / ejecución de shel.

Alternativamente repudiarlos ( disown) para salir o matarlos de forma manual: kill $(jobs -p).

kenorb
fuente