Bien, no es la forma más “bonita”, pero sí una de las más efectivas. Si queremos lanzar una aplicación como un demonio de UNIX podemos usar el comando nohup. Con este comando estaremos:
Veamos cómo lanzarlo:
ahornero@6581-D:~$ nohup el_commando_o_programa
Como ejemplo, podemos lanzar lo siguiente:
ahornero@6581-D:~$ nohup sleep 1000 &
nohup: ignoring input and appending output to `nohup.out’
Abandonamos el terminal
ahornero@6581-D:~$ logout
Y volvemos a entrar. Ahora miramos qué PID tiene el programa en ejecución:
ahornero@6581-D:~$ ps aux | grep sleep
4076 4596 4076 4784 pty0 1002 13:01:36 /usr/bin/sleep
También podemos usar directamente pgrep y obtendremos directamente el PID:
ahornero@6581-D:~$ pgrep sleep
4076
Si queremos saber qué está ocurriendo hacemos un seguimiento del fichero nohup.out
ahornero@6581-D:~$ tail -f nohup.out
En este caso no obtendremos nada, ya que sleep no escribe nada por la salida estándar (ni por ninguna otra).
Para terminar, matamos el proceso de una forma más o menos elegante, mandando una interrupción al proceso:
ahornero@6581-D:~$ kill -SIGINT $(pgrep sleep)
También podréis usar directamente pkill o usar SIGKILL para, directamente, matarlo. Aquí os dejo una referencia de las señales en Linux (POSIX y ANSI).
Ver comentarios
Que interesante comando...
Tengo una pregunta ¿Es posible de alguna manera montar una aplicación como demonio pero para el inicio del sistema, de modo que cada que el equipo se encienda la aplicación corra de forma predeterminada?
David Gómez (@emsLinux), claro, por supuesto. Creando un script en el directorio init.d y seleccionando su runlevel. Si quieres puedo dedicar una entrada explicándolo.
HOLA QUE EXCELENTE ARTICULO.
TENGO UNA DUDA PERO NO TIENE NADA QUE VER CON ESTO.
TENGO UN CD DE UBUNTU DESKTOP 10.10 Y DESDE WINDOWS EJECUTE "WUBI" QUE VENIA DENTRO DE EL CD Y PUES LO INSTALE DESDE "WUBI" Y AHORA ME APARECE UN GRUB, PERO CUANDO ARRANCA UBUNTU ME DICE Q NO SE DEFINIO DIRECTORIO RAIZ???
Bueno, eso no es hacer un "demonio", si quisieras hacer que funcione como un demonio, mejor mírate este enlace:
Un adelanto:
--------------------------------------------------
#!/bin/bash
######### Lock checker ###########
myName="`echo $0 | awk '{print $NF}' FS='/'`"
lockDir="/var/lock/"
lockFile=$lockDir$myName.pid
currentPID=$$
oldPID="`cat $lockFile`"
oldderExist=` kill -0 $oldPID 2>/dev/null ; echo $? `
if [ "$oldderExist" == "0" ]; then echo "An Other Instance Is Running...! PID:$oldPID" ; exit
else echo $currentPID > $lockFile
fi
######### Lock checker ###########
--------------------------------------------------
Más información:
Convertir un Script Linux para que funcione como un demonio.
Ya que lo que estás haciendo, es dejar un programa funcionando cuando abandonas la consola, que es distinto de que funcione como un demonio.
@Eggun gracias por el aporte.
En efecto, coincido contigo en que esta vía no es la de creación de un demonio propiamente dicho, pero por facilidad y desarrollo es más viable según qué caso.
No te preocupes, en los próximos días contaré como crear un demonio en lenguaje C, que puesto a elegir, supera con creces la elegancia de un shell script. Igualmente, me apunto tu nota para futuros usos. Gracias.
Interesante el comentario de Eggun, yo por lo general siempre uso nohup cuando me toca hacer backups