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?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top