¿Cómo comprobar si un proceso es un demonio o no?

¿Cómo comprobar si un proceso es un demonio o no?

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 Wikipedia

En 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 initproceso 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 initproceso 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 pgrepcomando.

Además, cambia el nombre de tu demonio, ya existe un comando llamado demonio con el que eventualmente puedes entrar en conflicto.

información relacionada