2009-04-28 13 views
10

La pregunta es especial porque algunas teclas, como CTRL + Z, dejaron de funcionar.¿Cómo puedo poner un proceso en segundo plano después de su ejecución con CTRL + Z roto?

traté de poner el proceso a fondo escribiendo en el orden:

  1. find/
  2. CTRL + Z
  3. bg

Sin embargo, aún puede ver el stdout. La única diferencia con solo hacer el primer paso es que el comando CTRL + Z ya no funciona. Es bastante desagradable cuando tengo trabajos no guardados y mi disco duro tiene más de 100 GB. Entonces

¿cómo puedo poner el proceso en segundo plano?

[Detalles]

estoy usando la cuarta versión de Bash en Mac.

[Crux Responder por Nicholas Riley]

El problema es realmente que no entiendo las "ramificaciones" de fondo corriente de proceso. No puedo entender por qué los comandos, como CTRL + Z, no funcionan con procesos en segundo plano. Yo todavía era capaz de matar el proceso en la otra línea de comandos con el comando:

ps -ej | awk '! /grep/ && /find/ {print $2}' | xargs kill -9 

Respuesta

12

^Z no funciona porque el trabajo más avanzado ahora es el shell y las shells generalmente no responden a SIGTSTP. (Si realmente desea suspender un shell que no es de inicio de sesión, generalmente funciona suspend)

Parece que el problema es que no entiende las ramificaciones de un trabajo en segundo plano. Redirigir la salida estándar del trabajo no está relacionado.

De hecho, no está claro qué desea hacer. Si solo desea detener la ejecución de find, entonces fg y use ^C o ^\ (que de forma predeterminada envían SIGINT y SIGQUIT respectivamente).

Si desea mantener find ejecutándose pero suprimir su salida posterior, entonces la solución más fácil que puedo pensar es usar bg ; disown ; exit. Eso evitará que el shell mate su proceso secundario (find) y salga del shell; suponiendo que esté en el nivel superior de la ventana de la Terminal, verá un poco más de salida y find se seguirá ejecutando (pero no tendrá forma de interactuar con ella).

+0

¿Puedes aclarar la oración "Redirigir el resultado estándar del trabajo no está relacionado"? –

+2

Claro. El efecto principal de crear un fondo de un proceso es que su * entrada * (incluidas señales, como^Z) ya no interactúa con ese proceso; ellos interactúan con el shell padre en su lugar. A menos que el proceso esté escrito para verificar si está en segundo plano y hacer algo diferente, la salida aún emanará de ese proceso. –

+0

Riley: ¡Gracias! –

5

Es posible ajustar la operación a una tecla diferente con stty en cualquier sistema Unix.

$ stty susp Q 

hará Q su clave de suspensión en lugar de CTRL-Z.

+0

That's brillant! Ahora no puede usar la tecla Q para lo que $ DEITY pretendía ("Q"). – paxdiablo

+0

+1 para el comando cool. –

+0

No * tiene * para usar Q, Pax. –

0

Supongo que está utilizando una variante común de Linux o UNIX y posiblemente el shell bash. En cuyo caso:

CTRL-Z envía la señal SIGTSTP al proceso en primer plano. Debería poder hacer lo mismo con el comando kill especificando kill -s SIGTSTP [pid].

2

Normalmente hago este tipo de cosas con nohup. De esta manera:

nohup find /> /tmp/myresults.txt &

nohup se asegura de que el proceso no se detiene, incluso si la consola desaparece (como, cierra la ventana o pierde su SSH o lo que sea). El ">" envía salida a un archivo en lugar de a la consola, y "&" pone el trabajo en segundo plano.

+0

Una idea me acaba de ocurrir desde el nohup: "usarlo con el comando de pantalla" como "pantalla nohup". Puede ser útil. +1 para compartir tu experiencia –

+0

¿Por qué usarías la pantalla con nohup? la pantalla tiene una función de desconexión incorporada. (C-a, C-d) –

5

Hacer un fondo de un proceso no desconectará la salida del dispositivo terminal, es por eso que todavía está viendo salida y la salida puede contener caracteres de control que pueden rellenar su configuración TTY (cat). Haz eso).

Si desea que el trabajo se ejecute en segundo plano, hacerlo bien:

find/>/tmp/out 2>&1 & 

continuación, examine el archivo /tmp/out cuando esté terminado.

+0

Excepto, ¿normalmente no pondría el 2> & 1 antes del>/tmp/out? (Mente, en realidad no tengo ni idea, así que siéntete libre de ignorar). –

+5

No, @Jeremy, porque es posicional. Mi versión dirige stdout al archivo luego stderr al mismo lugar que stdout (el archivo). Su sugerencia dirigiría stderr al mismo lugar que stdout (el terminal), luego stdout al archivo. Y rara vez ignoro las preguntas, prefiero educar. – paxdiablo

+0

+1 para su comentario :) –

0

Sé que en Ubuntu 9.04, puede iniciar el proceso con un & para ejecutarlo en segundo plano. Por ejemplo, "sudo gedit /boot/grub/menu.lst &" iniciará un editor de texto editando el archivo de configuración de GRUB en segundo plano.

6

Uso el rechazo.

find/& disown 
exit # close the terminal and the command still runs 

Puede utilizar disown después de que Z^así:

find/
^Z 
bg 
disown 
exit 

disown es una orden interna del bash, creo. No estoy seguro de las alternativas para otras conchas.

Para obtener más información, consulte my equivalent answer on Server Fault.

+1

+1 para su explicación sistemática –

Cuestiones relacionadas