Bash
Trabajos y Procesos
Buscar..
Listar trabajos actuales
$ tail -f /var/log/syslog > log.txt
[1]+ Stopped tail -f /var/log/syslog > log.txt
$ sleep 10 &
$ jobs
[1]+ Stopped tail -f /var/log/syslog > log.txt
[2]- Running sleep 10 &
Manejo de trabajos
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.
Listar todos los procesos
Hay dos formas comunes de enumerar todos los procesos en un sistema. Ambos listan todos los procesos que ejecutan todos los usuarios, aunque difieren en el formato que emiten (el motivo de las diferencias es histórico).
ps -ef # lists all processes
ps aux # lists all processes in alternative format (BSD)
Esto se puede usar para verificar si una aplicación dada se está ejecutando. Por ejemplo, para verificar si el servidor SSH (sshd) se está ejecutando:
ps -ef | grep sshd
Compruebe qué proceso se está ejecutando en un puerto específico
Para comprobar qué proceso se está ejecutando en el puerto 8080
lsof -i :8080
Encontrar información sobre un proceso en ejecución
ps aux | grep <search-term>
muestra los procesos que coinciden con el término de búsqueda
Ejemplo:
root@server7:~# ps aux | grep nginx
root 315 0.0 0.3 144392 1020 ? Ss May28 0:00 nginx: master process /usr/sbin/nginx
www-data 5647 0.0 1.1 145124 3048 ? S Jul18 2:53 nginx: worker process
www-data 5648 0.0 0.1 144392 376 ? S Jul18 0:00 nginx: cache manager process
root 13134 0.0 0.3 4960 920 pts/0 S+ 14:33 0:00 grep --color=auto nginx
root@server7:~#
Aquí, la segunda columna es la identificación del proceso. Por ejemplo, si desea finalizar el proceso nginx, puede usar el comando kill 5647
. Siempre se recomienda utilizar el comando kill
con SIGTERM
lugar de SIGKILL
.
Desaprobando trabajo de fondo
$ gzip extremelylargefile.txt &
$ bg
$ disown %1
Esto permite que un proceso de ejecución prolongada continúe una vez que su shell (terminal, ssh, etc.) esté cerrado.