desarrollo-web-br-bd.com

Hay trabajos detenidos (al salir de bash)

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

  • ctrl+c es manejado por el intérprete como una excepción.
  • ctrl+z 'detiene' el proceso.
  • ctrl+d sale python para reales.

Aquí hay una salida de terminal del mundo real:

[email protected]_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
[email protected]_server:~$ exit
logout
There are stopped jobs.

Bash no salió, debo exit nuevamente para salir del bash Shell.

  • P: ¿Qué es un 'trabajo detenido', o qué significa esto?
  • P: ¿Se puede reanudar un proceso detenido?
  • P: ¿El primer exit mata los trabajos detenidos?
  • P: ¿Hay alguna forma de salir de Shell la primera vez? (sin ingresar exit dos veces)
168
ThorSummoner

Un trabajo detenido es aquel que se ha colocado temporalmente en segundo plano y ya no se está ejecutando, pero todavía 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 comando incorporado jobs en bash, probablemente también otros shells. Ejemplo:

[email protected]:~$ jobs
[1] + Stopped                python
[email protected]:~$ 

Puede reanudar un trabajo detenido utilizando el comando incorporado fg (primer plano) bash. 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 fg solo:

[email protected]:~$ fg 1
python

En este punto, está de vuelta en el intérprete python) y puede salir usando control-D.

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

[email protected]:~$ 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
[email protected]:~$ kill 17781
[1]+  Killed                  python
[email protected]:~$ 

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

[email protected]:~$ 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 se cierra. Esto puede causar problemas para algunos programas que no están destinados a ser eliminados de esta manera.

En bash parece que puede usar el comando logout 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 terminan de esta manera, y su sistema podría terminar con una gran cantidad de procesos huérfanos que usan 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:

[email protected]:~$ python &
[1] 19028
[email protected]:~$ jobs
[1]+  Stopped                 python

Puede reanudar y eliminar estos trabajos de la misma manera que realizó los trabajos que detuvo con el Ctrl-z interrumpir.

221
OldTimer

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, kernel 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 se ejecute /Procesando.

Los trabajos de Shell activos se pueden enumerar por: jobs.

P: ¿Se puede reanudar un proceso detenido?

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

P: ¿La primera salida mata los trabajos detenidos?

Primera vez cuando escribe exit/logout o 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 opción checkjobs está habilitada (shopt -s checkjobs), También puede enumerar los trabajos con sus estados.

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

Puedes presionar Ctrl+D dos veces o manténgalo presionado durante más tiempo, esto saldrá de Shell en silencio rápidamente y matará los trabajos de parada actuales/en ejecución.

Alternativamente, desconéctelos (disown) para dejarlos o eliminarlos manualmente: kill $(jobs -p).

19
kenorb