Cómo hacer que el programa se ejecute en segundo plano bajo Linux

  

Primero, ¿por qué debería ejecutarse el programa en segundo plano?

El programa que calculamos es muy largo, generalmente varias horas o incluso una semana. El entorno que utilizamos es conectarnos a un servidor Linux japonés de forma remota utilizando masilla. Por lo tanto, tener el programa ejecutado en segundo plano tiene los siguientes tres beneficios:

1: El hecho de que cerremos este lado no afecta al programa que se ejecuta en Japón.
(No como antes, cuando se desconecta nuestra red o cuando se apaga, el programa se interrumpirá o no podrá encontrar datos, el programa que se ejecuta durante unos días solo puede volver a aparecer, es muy molesto)

2 : No afecta la eficiencia del cálculo

2: después de que el programa se ejecuta en segundo plano, no ocupará el terminal, podemos usar el terminal para hacer otras cosas.

En segundo lugar, cómo hacer que el programa se ejecute en segundo plano

Hay muchos métodos, aquí se enumeran principalmente dos. Si tenemos el programa pso.cpp, después de compilar para generar el archivo ejecutable pso, queremos que el pso se ejecute en el fondo del servidor Linux. Cuando el cliente se apaga y luego vuelve a iniciar sesión en el servidor, continúa viendo los resultados de la salida que se emitió originalmente en el terminal.
(Suponiendo que todas las operaciones estén en el directorio actual)

Método 1 Ingrese el comando en el terminal:

# ./pso > pso.file 2 > &1 &

Explicación: PSO se coloca directamente en segundo plano, y la salida del terminal se almacena en el archivo pso.file en el directorio actual.

Cuando el cliente se apaga y vuelve a iniciar sesión en el servidor, puede ver directamente el archivo pso.file para ver el resultado de la ejecución (Orden de Vida

: #cat pso.file).


Método 2 Ingrese el comando en el terminal:

# nohup ./pso > pso.file 2 > &1 &

Explique: Nohup significa no colgar, coloque pso directamente en segundo plano y almacene la salida del terminal en el archivo pso.file en el directorio actual

. Después de que el cliente se apague y vuelva a iniciar sesión en el servidor, vea directamente el archivo pso.file

para ver el resultado de la ejecución (comando: #cat pso.file).

Tres, comandos comunes de administración de tareas

# trabajos //Ver tareas, devolver el número de tarea n y el número de proceso

# bg% n //se numerarán n tarea Ejecutar en segundo plano

# fg% n //Ejecutar la tarea numerada n en primer plano

# ctrl + z //suspender la tarea actual

# ctrl + c //Finalice la tarea actual


Nota: Si desea poner la tarea en ejecución en segundo plano el día anterior, primero use ctrl + z para suspender la tarea, luego use bg para hacer la ejecución posterior .








En Linux, si quieres Deje que el proceso se ejecute en segundo plano. En general, podemos agregar &después del comando. De hecho, esto coloca el comando en una cola de trabajos:

$ ./test.sh & [1] 17208 $ jobs -l [1] + 17208 Ejecutando ./test.sh &Para los comandos que se han ejecutado en primer plano, también puede volver a ejecutarlos en segundo plano. Primero presione ctrl + z para pausar el proceso en ejecución, luego Use el comando bg para poner el trabajo detenido en segundo plano:

$ ./test.sh [1] + Detenido ./test.sh $ bg% 1 [1] + ./test.sh &$ Jobs -l [1] + 22794 Ejecutando ./test.sh &Sin embargo, si el proceso se ejecuta desde arriba hacia el fondo, el proceso principal sigue siendo el proceso del shell de terminal actual, y una vez que el proceso principal finaliza, enviará una señal de suspensión a todos los procesos secundarios. El proceso hijo también se cerrará después de recibir el bloqueo. Si queremos continuar ejecutando el proceso mientras salimos del shell, debemos usar nohup para ignorar la señal de colgar, o setsid configurará el proceso primario al proceso de inicio (el número de proceso es 1)

$ echo $$ 21734 $ nohup. /test.sh &[1] 29016 $ ps -ef |  Prueba de Grep 515 29710 21734 0 11:47 pts /12 00:00:00 /bin /sh ./test.sh 515 29713 21734 0 11:47 pts /12 00:00:00 prueba de grep $ setsid ./test.sh &[1] 409 $ ps -ef |  Prueba de Grep 515 410 1 0 11:49? 00:00:00 /bin /sh ./test.sh 515 413 21734 0 11:49 pts /12 00:00:00 prueba de grep El experimento anterior demuestra el uso de nohup /setsid Agregue ¶ que el proceso se ejecute en segundo plano sin verse afectado por la salida del shell actual. Entonces, ¿qué pasa con un proceso que ya se está ejecutando en segundo plano? Puede usar el comando disown:

$ ./test.sh &[1] 2539 $ jobs -l [1] + 2539 Running ./test.sh &$ disown -h% 1 $ ps -ef |  Prueba de Grep 515 410 1 0 11:49? 00:00:00 /bin /sh ./test.sh 515 2542 21734 0 11:52 pts /12 00:00:00 prueba de grep Hay otra manera, incluso si el proceso Ejecutado en una subshell, de hecho, esto es lo mismo que setsid. El método es simple, encierre el comando entre paréntesis ():

$ (./test.sh &) $ ps -ef |  Prueba Grep 515 410 1 0 11:49? 00:00:00 /bin /sh ./test.sh 515 12483 21734 0 11:59 pts /12 00:00:00 prueba grep Nota: el entorno de prueba para este artículo es Red Hat Enterprise Linux AS versión 4 (Nahant Update 5), el shell es /bin /bash, y los diferentes sistemas operativos y comandos de shell pueden ser diferentes. Por ejemplo, KX de AIX no está deshabilitado, pero puede usar el PID nohup -p para obtener el mismo efecto que descartar.

Una forma más poderosa es usar la pantalla, primero cree un terminal virtual en modo desconectado y luego vuelva a conectarse al terminal virtual con la opción -r, cualquier comando que se ejecute en él puede llegar a nohup El efecto es que es más conveniente cuando hay varios comandos que deben ejecutarse continuamente en segundo plano:

$ screen -dmS screen_test $ screen-list Hay una pantalla en: 27963.screen_test (Separada) 1 Socket in /tmp /uscreens /S-jiangfeng. $ screen -r screen_test

Copyright © Conocimiento de Windows All Rights Reserved