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

6

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?

edit: Estou usando o Ubuntu 14.04 LTS

    
por Pranjal 08.10.2014 / 06:34

2 respostas

9

Qualquer coisa com o PPID de 1 é, na maioria das vezes, um daemon. Mas há situações que podem surgir quando os processos podem se tornar filhos de um que não são tecnicamente daemons. Então, os métodos que eu discuto abaixo são para demonstrar como você iria determinar se um PID é de 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 pode lançar alguma luz sobre as coisas também, mas também deixa as coisas um pouco vagas sobre como determinar se um processo é um daemon ou não.

trecho da Wikipedia

In a Unix environment, the parent process of a daemon is often, but not always, the init process. A daemon is usually either created by a process forking a child process and then immediately exiting, thus causing init to adopt the child process, or by the init process directly launching the daemon. In addition, a daemon launched by forking and exiting typically must perform other operations, such as dissociating the process from any controlling terminal (tty). Such procedures are often implemented in various convenience routines such as daemon(3) in Unix.

NOTA: em sistemas que fazem uso de SystemD (distribuições Red Hat como o Fedora), normalmente não há init process mas sim isto:

$ 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.

No sistema 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á a razão pela qual pode ser complicado determinar se algo é um daemon ou não quando o seu PPID é 1:

Um processo pode tornar-se filho do processo init, ( NOTA: que init processo é PID 1), quando seu pai é morto ou o rejeita, esses processos não são necessariamente daemons, mas ainda será mostrado como tendo seu PPID igual a 1 .

Portanto, para determinar se algo é daemon ou não, é provável que exista uma bateria de testes, e não simplesmente verificar se o PPID é 1.

Então, onde isso nos deixa?

Para determinar se algo é um daemon, você provavelmente precisará recorrer a vários testes, como:

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

Então, temos que recorrer à "digitação de pato", se ela se chocar e nada, é provável que seja um pato, mas mesmo as características acima podem enganá-lo.

Referências

por 08.10.2014 / 06:57
6

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 duplicar o fork e desanexar do terminal para ser considerado um daemon.

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

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

Agora, se o que você quer é saber se seu daemon particular está rodando, então dê uma olhada no comando pgrep .

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

    
por 08.10.2014 / 07:40