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édiaEm 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á init
processo, 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 init
processo é 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 pgrep
comando.
Além disso, mude o nome do seu daemon, já existe um comando chamado daemon com o qual você pode eventualmente entrar em conflito.