Perché pidof e pgrep si comportano diversamente?


8

Ho uno script /etc/init.d/myservicedi inizializzazione per inizializzare un servizio come questo:

...
start() {
  ...
  daemon /usr/sbin/myservice
  ...
}

stop() {
  ...
  pgrep myservice
  pidof myservice
  ps -ef | grep myservice
  ...
}

E quando provo a interrompere il servizio, questo è l'output:

10000 10001
10000
root      10000     1  0 09:52 ?        00:00:02 /usr/sbin/myservice
root      9791   9788  0 10:06 pts/1    00:00:00 /bin/sh /sbin/service myservice stop
root      10001  9791  1 10:06 pts/1    00:00:00 /bin/sh /etc/init.d/myservice stop 
root      9805   9796  0 10:06 pts/1    00:00:00 grep myservice

È previsto? Perché pidofviene restituito solo il PID corretto del servizio che desidero interrompere e pgreprestituisce il PID del servizio e il PID dello script init? Posso fare affidamento sul fatto che pidofignorerà sempre il PID dallo script init?

Risposte:


7

pidof = trova l'ID di processo di un programma in esecuzione

Pidof trova l'ID di processo (pid) dei programmi indicati. Stampa gli ID sull'output standard. Questo programma è su alcuni sistemi utilizzati negli script di modifica a livello di esecuzione, specialmente quando il sistema ha una struttura rc simile a System-V.

sysadmin@codewarden:~$ pidof apache2
5098 5095 5094 5092

pgrep = cerca o segnala i processi in base al nome e ad altri attributi, pgrep controlla i processi attualmente in esecuzione ed elenca gli ID di processo che corrispondono ai criteri di selezione.

sysadmin@codewarden:~$ pgrep apache2
5092
5094
5095
5098

pgrep, (p) = process, grep= grep stampa le linee corrispondenti

Vuoi saperne di più su pgrep & pidof? Corri nel terminal come

# man pidof
# man pgrep

1
Ah, ecco perché pidofnon ritorna 10001, perché il programma è shno?
— Pigueiras,

sì, hai ragione
— Babin Lonston,

0

Penso che non dovresti fare affidamento pidof, può causare il fallimento del programma. Un semplice esempio con il supervisordprogramma:

% cuonglm at ~
% ps -ef | grep supervisord
root      8512     1  0 16:53 ?        00:00:00 /usr/bin/python /usr/bin/supervisord
cuonglm   8584  7688  0 17:00 pts/0    00:00:00 grep --color=auto supervisord
% cuonglm at ~
% pidof supervisord
% cuonglm at ~
% 

Si può vedere, il nome supervisordè effettivamente chiamato dall'interprete di Python, causa pidoferrori:

#! /usr/bin/python                                                            
# EASY-INSTALL-ENTRY-SCRIPT: 'supervisor==3.0a8','console_scripts','supervisord'
__requires__ = 'supervisor==3.0a8'                                            
import sys                                                                    
from pkg_resources import load_entry_point                                    

if __name__ == '__main__':                                                    
    sys.exit(                                                                 
        load_entry_point('supervisor==3.0a8', 'console_scripts', 'supervisord')()
    )

Ma in questo caso non posso fare affidamento su di esso no ?, Non sto usando un interprete per eseguire il programma (è un binario eseguibile).
— Pigueiras,

Ovviamente. Ma penso che il buon modo sia l'uso killproc. Perché non lo usi mentre hai usato daemonin startfunzione?
— cuonglm

Poiché voglio ottenere il PID per uccidere i bambini del processo, stavo usando killprocper uccidere il processo stesso.
— Pigueiras,

Perché devi farlo? se uccidi parent process, anche la sua child processvolontà morirà.
— cuonglm


0

Il pidofcomando ignora gli script a meno che non si includa l' -xopzione. Inoltre, è più sicuro includere l'intero percorso nel comando pidof, come in:

killme=$(pidof -x /usr/bin/supervisord)
      *instead of*
killme=$(pidof -x supervisord)

questo riduce al minimo le possibilità di abbinare qualche altro processo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.