Trova PID di un processo per nome senza utilizzare popen () o il sistema ()
Domanda
Ho un nome di processo e non ho di inviare un segnale kill()
a quel processo, ma ho bisogno il suo PID di chiamare kill()
. Vorrei utilizzare solo:
popen("pidof process_name");
come l'ultima cosa. C'è un altro modo per scoprire il processo di PID? Un modo ho potuto pensare è quello di inviare una richiesta di presa a quel processo e chiedere al suo PID.
L'altro modo è un po 'troppo complicato per un semplice codice che sto scrivendo: per fare ciò che del comando pidof codice sorgente sta effettivamente facendo (si utilizza una find_pid_by_name()
chiamata di funzione, ma che sta facendo un sacco di cose).
Se nessuna soluzione semplice è possibile, ho a che fare questo:
system("pkill <process_name>");
e verificare il suo codice di ritorno. Ma sarà pkill disponibile per sicuro su tutte le macchine Linux?
Soluzione
Lei ha detto che si stava utilizzando Linux. Non è la soluzione più pulita, ma si può passare attraverso ogni voce nel / proc e verificare il nome del processo in cmdline contro ciò che state cercando.
Altri suggerimenti
Utilizzare sysctl - Esempio di codice
Modifica - è disponibile in Linux vedere qui
procfs legge sono molto a buon mercato, molte persone pensano di iterazione attraverso / proc come avrebbero scorrendo /, la sua realtà non è il caso a tutti.
risparmiare un po 'di tempo saltando qualsiasi voce che è meno di 1000, non ha senso per esaminare i thread del kernel. Quindi, in sostanza .. dopo opendir (), se strtoint () pensa che la voce è un int, e che int è maggiore o uguale a 1000, basta leggere / proc /% d / stat.
Cercate di evitare la voglia di risolvere solo il link 'exe', come quella non sta per dirvi lo stato del processo che riceverà il segnale. Per esempio, se il bersaglio è in stato di 'D' (stop del disco), che ci si vuole sapere come il segnale non verrà immediatamente consegnato, o forse mai, se lo stato D è perenne.
In molti sistemi, ci sta per essere di 70 -. 120 processi per esaminare e spesso troverete il vostro modo di destinazione prima di raggiungere la fine
Lei parla, "In un modo ho potuto pensare è quello di inviare una richiesta di presa a quel processo e chiedere al suo PID". Sembra che il processo che si sta tentando di uccidere è un programma che hai scritto.
Se questo è il caso, la cosa cannonical fare è per memorizzare il pid in un file (di solito in / var / run, se si ha accesso ad esso), mentre il programma è in esecuzione, e rimuovere il file quando il programma termina . In questo modo, rilevando se il programma è in esecuzione è semplice come
if kill -0 $(cat /var/run/myprog.pid 2>/dev/null) 2>/dev/null; then
echo Running!
else
rm -f /var/run/myprog.pid
echo "Not running."
end
Lo studio attento di tutte le implicazioni del codice di cui sopra probabilmente vi insegnerà molto su come funzionano i file PID. Oppure si può semplicemente chiedere una spiegazione più dettagliata.
Questo sembra funzionare bene per me.
Si potrebbe voler dare il percorso completo del processo, però, perché non si uccide un processo che ha un nome simile.
Il vantaggio principale di questo è che è possibile specificare il segnale che si desidera inviare.
system("killall -s 9 process_name");
Perché non usare fcntl con F_GETOWN?
Per completare @GregRogers risposte, non vi resta che controllare la realizzazione di pidof
- https://gitlab.com/procps-ng /procps/blob/master/pidof.c#L147
- https://gitlab.com/procps -ng / procps / blob / master / proc / readproc.h # L288
- https://gitlab.com/procps -ng / procps / blob / master / proc / readproc.c # L932
come si può vedere che cerca solo sulla directory / proc.