¿Es posible poner el proceso en primer plano en segundo plano sin suspender (control + z)?

11

Estoy ejecutando una aplicación que recibe paquetes TCP y UDP y, por lo tanto, no se puede suspender. Inicialmente ejecuté 3 procesos de la misma aplicación, con diferentes argumentos, en modo de fondo usando &. Cuando solo lo hice $fg, los tres procesos entraron en primer plano. Ahora quiero enviarlos al fondo nuevamente pero sin suspensión. ¿Cómo puedo hacer eso?

rahul.deshmukhpatil
fuente
Aquí hay un tema de ServerFault sobre cómo mover un proceso en ejecución a una nueva instancia de pantalla -> serverfault.com/questions/55880/…
Alan Barber

Respuestas:

10

Primero lo primero: solo puede haber un proceso en primer plano, no los tres. fgtrae el último proceso a primer plano. Para hacer el proceso de Ctrl+ z, luego escriba bgmás rápido para no "perturbar" la aplicación en cuestión (tenga en cuenta que el planificador de procesos lo hará de todas formas muchas veces por segundo), descubra el PID del proceso en primer plano, luego en un segundo terminal / Sesión SSH, use

kill -SIGSTOP »pid« ; kill -SIGCONT »pid«

Tu terminal original dirá stopped, pero como enviaste un mensaje de SIGCONTinmediato, el proceso continuará ejecutándose en segundo plano.

Stefan Seidel
fuente
1
@stefen: su solución es convincente. No dañará mis procesos de ninguna manera, suponiendo que si suspendemos el proceso, las conexiones de socket establecidas no se rompen (el cambio del planificador no desconecta la conexión de socket, estoy seguro de esto). Lo depurará y actualizará. Muchas gracias. If
rahul.deshmukhpatil
2

Si realmente tiene un trabajo en primer plano, entonces bash está esperando que se complete, esa es más o menos la definición de un trabajo en primer plano . Si bash todavía tiene el control de la terminal, verifique qué sucede con jobs -l, por ejemplo:

$ ncat -kl -p 10111 &
[1] 13404
$ ncat -kl -p 10222 &
[2] 13405
$ ncat -kl -p 10333 &
[3] 13406
$ jobs -l
[1]  13404 Running                 ncat -kl -p 10111 &
[2]- 13405 Running                 ncat -kl -p 10222 &
[3]+ 13406 Running                 ncat -kl -p 10333 &

Comencé tres ncatprocesos de escucha en segundo plano para esto. También puede ver "Listo" o "Detenido" para ver el estado de un trabajo.

Puede realizar un trabajo en segundo plano de manera efectiva desde un shell diferente utilizando el método SIGSTOP / SIGCONT de Stefan Seidel (aunque la señal real enviada por un shell con Ctrl- Zes SIGTSTP, cualquiera de las señales debería funcionar).

Existe una sutil distinción entre procesos y trabajos cuando se utilizan los términos primer plano y fondo. Solo hay un trabajo en primer plano de shell , puede haber varios procesos en primer plano (esto está relacionado con las ID de grupo de proceso de terminal y se puede observar cuando inicia dos o más procesos en una tubería).

Un proceso en ejecución o una tubería bajo el control del shell se conoce como un "trabajo", cuando usa el comando bgo fgestá refiriendo implícitamente el trabajo más reciente, en mi caso el que está +en el anterior. Estos trabajos también pueden (entre otras cosas) referirse explícitamente como% 1% 2 o% 3 (el número en []).

Un fgcomando no calificado solo afectará un trabajo, el más reciente, por lo que puede estar equivocado en su comprensión de la situación actual. Un trabajo en segundo plano aún puede escribir en la terminal:

  echo foo > /dev/tcp/127.0.0.1/10111

Puede depender de cómo el programa maneja el terminal, ncatfunciona bien para escribir. Para leer, aunque los programas detendrán la ejecución, verá un mensaje "Detenido". El shell iniciará procesos y esperará a que salgan o reciban una señal SIGTTIN ( nohupes una forma de evitar esto, tal como está disown).

Puede crear un fondo de un trabajo detenido específico con

$ bg %3

(en mi caso obtendré el error bash: bg: job 3 already in background)

De lo contrario, si un proceso está en primer plano, a menos que el programa detecte SIGTSTP y haga algo especial, es poco probable que tenga problemas con un rápido Ctrl- Zy bg. No hay nada especial sobre los programas de red a este respecto, las conexiones / datos entrantes serán almacenados por el núcleo (hasta cierto punto). Sin embargo, una conexión de transmisión puede tener una pausa observable.

Consulte la sección " CONTROL DE TRABAJO " de la página de manual de bash para obtener más detalles.

Sr. púrpura
fuente
1

La forma más fácil de hacerlo es usar el programa de pantalla . Puede iniciar su aplicación dentro del terminal virtual, luego salir de la pantalla con Ctrl + A, D. Si desea reanudar su sesión, escriba su tipo screen -x. Si tiene varios procesos, se le presentará una lista de pantallas para volver a adjuntar. Para obtener más detalles, lea la página de manual de la pantalla .

Janos Pasztor
fuente
55
Creo que está buscando una solución "después del hecho", es decir, los procesos se están ejecutando en este momento.
Stefan Seidel