Como verificar se um processo é daemon ou não?

Como verificar se um processo é daemon ou não?

Eu escrevi um pequeno daemon que inicia no momento da inicialização e faz todas as coisas perfeitamente, como escrever no arquivo de log. Mas eu quero saber como podemos verificar se esse processo é daemon ou não? Meu professor me contou sobre um comando ps -xj | grep daemon(meu nome de arquivo é daemon), mas não estou convencido disso, pois mostra informações indesejadas. Existe algum comando shell para isso?

editar: estou usando o Ubuntu 14.04 LTS

Responder1

Qualquer coisa com PPID igual a 1 é, na maior parte, provavelmente um daemon. Mas podem surgir situações em que processos podem se tornar filhos de 1 que não são tecnicamente daemons. Portanto, os métodos que discuto abaixo são para demonstrar como você determinaria se um PID pertence a 1, não necessariamente que seja um daemon real.

Por exemplo

$ 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

O trecho da Wikipedia também pode esclarecer algumas coisas, mas também deixa um pouco vago sobre como realmente determinar se um processo é um daemon ou não.

trecho da Wikipédia

Em um ambiente Unix, o processo pai de um daemon é frequentemente, mas nem sempre, o processo init. Um daemon geralmente é criado por um processo que bifurca um processo filho e sai imediatamente, fazendo com que o init adote o processo filho, ou pelo processo init iniciando diretamente o daemon. Além disso, um daemon iniciado por bifurcação e saída normalmente deve realizar outras operações, como dissociar o processo de qualquer terminal de controle (tty). Tais procedimentos são frequentemente implementados em várias rotinas de conveniência, como o daemon(3) no Unix.

OBSERVAÇÃO:em sistemas que fazem uso do SystemD (distros Red Hat como o Fedora), normalmente não há initprocesso, mas sim 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

Esse é o processo com o PID 1.

Nos sistemas Debian/Ubuntu eles terão um processo ainda chamado init:

$ ps -j -1
  PID  PGID   SID TTY      STAT   TIME COMMAND
    1     1     1 ?        Ss     0:02 /sbin/init

Então, o que é um daemon?

E aqui está o motivo pelo qual pode ser complicado determinar se algo é um daemon ou não quando seu PPID é 1:

Um processo pode se tornar filho do processo init, (OBSERVAÇÃO:esse initprocesso é PID 1), quando seu pai é eliminado ou os rejeita, esses processos não são necessariamente daemons, mas ainda aparecerão como tendo seu PPID igual a 1.

Portanto, para determinar se algo é um daemon ou não, provavelmente será necessária uma bateria de testes, e não apenas verificar se o PPID é 1.

Então, onde isso nos deixa?

Para determinar se algo é um daemon, você provavelmente terá que recorrer a uma variedade de testes, como:

  • PPID 1?
  • O TTY está anexado?
  • É um serviço? sudo service ...?
  • É gerenciado por Systemd, Upstart ou SysV?
  • Está escutando em uma porta?
  • Está gravando em um arquivo de log? Syslog?

Portanto, teremos que recorrer à "digitação de pato" se ele grasnar e nadar, provavelmente é um pato, mas mesmo as características acima podem enganar você.

Referências

Responder2

Não há como discernir um processo regular de um processo daemon. Um daemon pode ser iniciado de qualquer lugar, não apenas do init. Não é necessário dobrar o fork e desconectar do terminal para ser considerado um daemon.

Em sistemas GNOME, gnome-settings-daemon mantém seu pai, registra-se no terminal do pai e não tem PID1 como PID pai, mas ainda é considerado um daemon.

Um daemon é simplesmente um processo em execução contínua. São, portanto, impossíveis de identificar com um comando.

Agora, se o que você deseja é saber se o seu daemon específico está em execução, dê uma olhada no pgrepcomando.

Além disso, mude o nome do seu daemon, já existe um comando chamado daemon com o qual você pode eventualmente entrar em conflito.

informação relacionada