He escrito un pequeño demonio que se inicia en el momento del arranque y hace todas las cosas perfectamente, como escribir en el archivo de registro. Pero quiero saber, ¿cómo podemos comprobar si ese proceso es un demonio o no? Mi profesor me habló de un comando
ps -xj | grep daemon
(mi nombre de archivo es daemon
), pero no estoy convencido porque muestra información no deseada. ¿Existe algún comando de shell para eso?
editar: estoy usando Ubuntu 14.04 LTS
Respuesta1
Cualquier cosa con el PPID de 1 es, en su mayor parte, probablemente un demonio. Pero pueden surgir situaciones en las que los procesos pueden convertirse en hijos de 1 que técnicamente no son demonios. Entonces, los métodos que analizo a continuación son para demostrar cómo se determinaría si un PID es propiedad de 1, no necesariamente que sea un demonio real.
Por ejemplo
$ ps -xj
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
8420 1211 1211 8420 pts/4 1211 S+ 1000 0:01 ssh dufresne
1 2276 2275 2275 ? -1 Sl 1000 0:48 /usr/bin/gnome-keyring-daemon --daemonize --login
2196 2278 2278 2278 ? -1 Ssl 1000 0:39 gnome-session
1 2288 2278 2278 ? -1 S 1000 0:00 dbus-launch --sh-syntax --exit-with-session
1 2289 2289 2289 ? -1 Ssl 1000 6:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
1 2358 2289 2289 ? -1 Sl 1000 0:01 /usr/libexec/gvfsd
El extracto de Wikipedia también puede arrojar algo de luz sobre las cosas, pero también deja un poco vagos las cosas sobre cómo determinar realmente si un proceso es un demonio o no.
extracto de WikipediaEn un entorno Unix, el proceso padre de un demonio suele ser, pero no siempre, el proceso de inicio. Un demonio generalmente se crea mediante un proceso que bifurca un proceso hijo y luego sale inmediatamente, lo que hace que init adopte el proceso hijo, o cuando el proceso init inicia directamente el demonio. Además, un demonio iniciado mediante bifurcación y salida normalmente debe realizar otras operaciones, como disociar el proceso de cualquier terminal de control (tty). Estos procedimientos suelen implementarse en varias rutinas de conveniencia, como daemon(3) en Unix.
NOTA:en sistemas que utilizan SystemD (distros de Red Hat como Fedora) normalmente no hay ningún init
proceso sino este:
$ ps -j -1
PID PGID SID TTY STAT TIME COMMAND
1 1 1 ? Ss 0:42 /usr/lib/systemd/systemd --switched-root --system --deserialize 20
Ese es el proceso con el PID 1.
En los sistemas Debian/Ubuntu, todavía tendrán un proceso llamado init
:
$ ps -j -1
PID PGID SID TTY STAT TIME COMMAND
1 1 1 ? Ss 0:02 /sbin/init
Entonces, ¿qué es un demonio?
Y esta es la razón por la que puede resultar complicado determinar si algo es un demonio o no cuando su PPID es 1:
Un proceso puede convertirse en hijo del proceso init, (NOTA:ese init
proceso es PID 1), cuando su padre es asesinado o los repudia, estos procesos no son necesariamente demonios, pero aún así aparecerán con su PPID igual a 1.
Entonces, para determinar si algo es un demonio o no, probablemente se requerirá una batería de pruebas, y no simplemente mirar para ver si su PPID es 1.
Entonces, ¿dónde nos deja eso?
Para determinar si algo es un demonio, probablemente tendrás que recurrir a una variedad de pruebas como:
- ¿PPID 1?
- ¿Tiene TTY adjunto?
- ¿Es un servicio?
sudo service ...
? - ¿Está administrado por Systemd, Upstart o SysV?
- ¿Está escuchando en un puerto?
- ¿Está escribiendo en un archivo de registro? ¿Syslog?
Así que tenemos que recurrir a la "tipificación de pato". Si grazna y nada, es probable que sea un pato, pero incluso las características anteriores pueden engañarte.
Referencias
Respuesta2
No hay forma de distinguir un proceso regular de un proceso demonio. Un demonio se puede iniciar desde cualquier lugar, no solo desde el inicio. No es necesario realizar una doble bifurcación y desconectarse del terminal para ser considerado un demonio.
En los sistemas GNOME, gnome-settings-daemon mantiene su padre, inicia sesión en el terminal del padre y no tiene PID1 como su PID padre, pero todavía se considera un demonio.
Un demonio es simplemente un proceso que se ejecuta continuamente. Por lo tanto, es imposible identificarlos con un solo comando.
Ahora, si lo que quieres es saber si tu demonio en particular se está ejecutando, entonces echa un vistazo al pgrep
comando.
Además, cambia el nombre de tu demonio, ya existe un comando llamado demonio con el que eventualmente puedes entrar en conflicto.