Publicación original: 14.07.2014
Me parece interesante a modo de «chuleta» y/o recordatorio comentar un poco este tema…
Lo quiero separar en dos partes una sobre los procesos en segundo plano y otra sobre la señal SIGHUP.
La manera de lanzar procesos en segundo plano es añadiendo al final & , de este modo el proceso quedará en ejecución pero liberará la shell, para poder seguir trabajando.
Para poder interactuar con estos procesos necesitamos traerlos a primer plano y para realizar esta gestión tenemos los comandos jobs, bg y fg
Un ejemplo…. Lanzamos dos procesos en segundo plano:
Visualizamos los procesos en segundo plano así como su estado:
Traemos uno de los procesos a primer plano y lo detenemos con Ctrl+Z
Al listar los procesos en segundo plano tenemos uno detenido y uno en ejecución.
Volvemos a poner en ejecución en background el proceso que estaba detenido.
También podemos matar un proceso en background determinado
Esto es un problema cuando queremos dejar corriendo algún proceso en la shell en la que nos encontremos, ya que aun teniéndolos en background, al salir de la shell el proceso terminará.
Podemos evitar esto lanzado el proceso con NOHUP, lo cual hará que el proceso no «escuche» la señal SIGHUP de su proceso padre.
Para lanzar un proceso con NOHUP basta con (nohup «comando»), por ejemplo:
Algo interesante, a tener en cuenta, es el tratamiento de la salida /entrada estandar, así como de la salida de error que hace nohup.
Me parece interesante a modo de «chuleta» y/o recordatorio comentar un poco este tema…
Lo quiero separar en dos partes una sobre los procesos en segundo plano y otra sobre la señal SIGHUP.
- Procesos en segundo plano
La manera de lanzar procesos en segundo plano es añadiendo al final & , de este modo el proceso quedará en ejecución pero liberará la shell, para poder seguir trabajando.
gandalf ~ # find / -name hola &
[1] 19968
gandalf ~ # ps -ef|grep find
...
[1]+ Hecho find / -name hola
Para poder interactuar con estos procesos necesitamos traerlos a primer plano y para realizar esta gestión tenemos los comandos jobs, bg y fg
Un ejemplo…. Lanzamos dos procesos en segundo plano:
gandalf ~ # while true; do echo "ab" > /dev/null; done &
[1] 20265
gandalf ~ # while true; do echo "a" > /dev/null; done &
[2] 20266
Visualizamos los procesos en segundo plano así como su estado:
gandalf ~ # jobs
[1]- Ejecutando while true; do
echo "ab" > /dev/null;
done &
[2]+ Ejecutando while true; do
echo "a" > /dev/null;
done &
Traemos uno de los procesos a primer plano y lo detenemos con Ctrl+Z
gandalf ~ # fg %1while true; do
echo "ab" > /dev/null;
done
^Z
[1]+ Detenido while true; do
echo "ab" > /dev/null;
done
Al listar los procesos en segundo plano tenemos uno detenido y uno en ejecución.
gandalf ~ # jobs
[1]+ Detenido while true; do
echo "ab" > /dev/null;
done
[2]- Ejecutando while true; do
echo "a" > /dev/null;
done &
Volvemos a poner en ejecución en background el proceso que estaba detenido.
gandalf ~ # bg %1
[1]+ while true; do
echo "ab" > /dev/null;
done &
gandalf ~ # jobs
[1]- Ejecutando while true; do
echo "ab" > /dev/null;
done &
[2]+ Ejecutando while true; do
echo "a" > /dev/null;
done &
También podemos matar un proceso en background determinado
kill %2
- SIGHUP / NOHUP
Esto es un problema cuando queremos dejar corriendo algún proceso en la shell en la que nos encontremos, ya que aun teniéndolos en background, al salir de la shell el proceso terminará.
Podemos evitar esto lanzado el proceso con NOHUP, lo cual hará que el proceso no «escuche» la señal SIGHUP de su proceso padre.
Para lanzar un proceso con NOHUP basta con (nohup «comando»), por ejemplo:
nohup ./script.sh arg1 arg2
nohup su - user -c "./script arg1 arg2"
Algo interesante, a tener en cuenta, es el tratamiento de la salida /entrada estandar, así como de la salida de error que hace nohup.
- Salida estandar –> Si no esta redirigida, se redirige a $HOME/nohup.out
- Entrada estandar –> SI no esta definida toma valor de «/dev/null»
- Salida de error –-> Si no está definida es redirigida a la salida estandar.
No hay comentarios:
Publicar un comentario