Bash Manejo de trabajos


Ejemplo

Creando empleos

Para crear un trabajo, simplemente agregue un solo & después del comando:

$ sleep 10 &
[1] 20024

También puede hacer que un proceso en ejecución sea un trabajo presionando Ctrl + z :

$ sleep 10
^Z
[1]+  Stopped                 sleep 10

Fondo y primer plano de un proceso.

Para poner el proceso en primer plano, el comando fg se usa junto con %

$ sleep 10 &
[1] 20024

$ fg %1
sleep 10

Ahora puedes interactuar con el proceso. Para volver a ponerlo en segundo plano, puede utilizar el comando bg . Debido a la sesión de terminal ocupada, primero debe detener el proceso presionando Ctrl + z .

$ sleep 10
^Z
[1]+  Stopped              sleep 10

$ bg %1
[1]+ sleep 10 &

Debido a la pereza de algunos programadores, todos estos comandos también funcionan con un solo % si hay un solo proceso, o para el primer proceso en la lista. Por ejemplo:

$ sleep 10 &
[1] 20024

$ fg %        # to bring a process to foreground 'fg %' is also working.
sleep 10

o solo

$ %           # laziness knows no boundaries, '%' is also working.
sleep 10

Además, con solo escribir fg o bg sin ningún argumento, se manejará el último trabajo:

$ sleep 20 &
$ sleep 10 &
$ fg
sleep 10
^C
$ fg
sleep 20

Matando trabajos en ejecución

$ sleep 10 &
[1] 20024

$ kill %1
[1]+  Terminated              sleep 10

El proceso de suspensión se ejecuta en segundo plano con el ID de proceso (pid) 20024 y el número de trabajo 1 . Para hacer referencia al proceso, puede usar el pid o el número de trabajo. Si usa el número de trabajo, debe prefijarlo con % . La señal de eliminación predeterminada enviada por kill es SIGTERM , que permite que el proceso de destino salga correctamente.

Algunas señales comunes de muerte se muestran a continuación. Para ver una lista completa, ejecute kill -l .

Nombre de la señal Valor de señal Efecto
SIGHUP 1 Colgar
SIGINT 2 Interrumpir desde el teclado
SIGKILL 9 Señal de matar
SIGTERM 15 Señal de terminación

Iniciar y matar procesos específicos.

Probablemente, la forma más sencilla de eliminar un proceso en ejecución es seleccionándolo a través del nombre del proceso como en el siguiente ejemplo, usando el comando pkill como

pkill -f test.py

(o) una forma más pgrep usar pgrep para buscar el identificador de proceso real

kill $(pgrep -f 'python test.py')

Se puede obtener el mismo resultado utilizando grep sobre ps -ef | grep name_of_process luego mata el proceso asociado con el pid resultante (id de proceso). La selección de un proceso con su nombre es conveniente en un entorno de prueba, pero puede ser realmente peligroso cuando se usa el script en producción: es prácticamente imposible asegurarse de que el nombre coincidirá con el proceso que realmente desea eliminar. En esos casos, el siguiente enfoque es realmente seguro.

Inicie el script que finalmente se eliminará con el siguiente enfoque. Supongamos que el comando que desea ejecutar y finalmente matar es python test.py

#!/bin/bash

if [[ ! -e /tmp/test.py.pid ]]; then   # Check if the file already exists
    python test.py &                   #+and if so do not run another process.
    echo $! > /tmp/test.py.pid
else
    echo -n "ERROR: The process is already running with pid "
    cat /tmp/test.py.pid
    echo
fi

Esto creará un archivo en el directorio /tmp contiene el pid del proceso python test.py . Si el archivo ya existe, asumimos que el comando ya se está ejecutando y que el script devuelve un error.

Luego, cuando quieras matarlo usa el siguiente script:

#!/bin/bash

if [[ -e /tmp/test.py.pid ]]; then   # If the file do not exists, then the
    kill `cat /tmp/test.py.pid`      #+the process is not running. Useless
    rm /tmp/test.py.pid              #+trying to kill it.
else
    echo "test.py is not running"
fi

eso matará exactamente el proceso asociado con su comando, sin depender de ninguna información volátil (como la cadena utilizada para ejecutar el comando). Incluso en este caso, si el archivo no existe, la secuencia de comandos asume que desea eliminar un proceso que no se está ejecutando.

Este último ejemplo se puede mejorar fácilmente para ejecutar el mismo comando varias veces (agregando al archivo pid en lugar de sobrescribirlo, por ejemplo) y para administrar los casos en que el proceso muere antes de eliminarse.