Modo grazioso per uccidere il processo


12

Dopo che il mio script bash è finito con il server selenio, lo script lo uccide in questo modo:

kill `ps -ef | grep selenium | awk '{ print $2 }'`

Mentre funziona e uccide lo script di selenio, tenta anche di terminare il processo per grep seleniumSo quando il numero di processo torna al comando kill, il processo è andato, quindi finisce per generare un messaggio di errore. (In altre parole: finisce per uccidere due processi, uno è il vero server di selenio, l'altro è un processo fugace che è un effetto collaterale di come sto facendo questo comando.)

C'è un modo più grazioso di uccidere il processo, che non ha questo effetto collaterale indesiderato?

(FWIW un'idea che avevo: questo stesso script avvia il selenio in precedenza nella sceneggiatura, quindi forse se ci fosse un modo per catturare il PID quando avvio il selenio, potrei semplicemente mantenerlo e ucciderlo direttamente, invece di chiedere l'ID del processo. Il problema è che non so come ottenere quel PID, come usare una variabile per mantenerlo e come fare riferimento in un secondo momento nello script. Ma è un modo migliore per farlo?)

Risposte:


12

Prova a usare pkill seleniumse né questo, né uno degli altri funziona, puoi continuare a usare il tuo metodo con un'altra sequenza di pipe come

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`

pkill non funziona sul mio server per questo, ma la tua striscia grep migliorata aiuta molto.
Eric

20

Prova il pgrepcomando, che genererà il PID del comando che ti interessa.

pgrep selenium

Per interrompere effettivamente il processo, utilizzare il pkillcomando companion .

pkill selenium

Adoro l'eleganza di questo, ma il processo è simile al seguente: "root 26401 11997 2 23:20 pts / 1 00:00:00 java -jar /home/lm/cron/selenium-server-standalone-2.19.0. jar "quindi l'ho appena cambiato pgrep javae funziona :-) grazie!
Eric

2
Se si dà a pgrep il flag '-f', corrisponderà al modello sull'intera riga di comando. Quindi, in questo caso l'uccisione pgrep -f seleniumdovrebbe funzionare
mills013,

7
l'utilizzo pkillè molto più semplice. pkillusa esattamente gli stessi criteri di corrispondenza di pgrep, quindi puoi farlo in 1 comando invece di 2 (e devi fare affidamento sull'output di uno).
Patrick,

7

Prova a usare grep [s]elenium. Questo non troverà il processo grep.


Questo è un trucco utile, davvero. Perché funziona

2
@hesse: greputilizza BREs per impostazione predefinita. Cioè, [e si ]presentano argvper grep, ma non corrispondono perché [e ]non vengono utilizzati letteralmente da grep.
Chris Down,

Ho spesso usato un | grep -v grepcomponente nel tubo. Ma questo è piuttosto elegante e mi piace!
Alexios,

Questo (spesso) non è sufficiente se hai un file nella directory di lavoro corrente con lo stesso nome del processo per cui stai cercando. Quindi, la soluzione che uso normalmente è: ps -ef | grep \[s]elenium. Anche se ho scoperto lsofdi essere un'alternativa molto migliore all'utilizzo di pse grep.
Moreaki,

2

Il killallcomando non è stato menzionato e ritengo sia un'utile aggiunta al repertorio.

$ killall selenium

È inoltre possibile utilizzare l' -r regexopzione per specificare un'espressione regolare corrispondente al nome del processo e persino un valore temporale:

$ killall -o 5m selenium 

Uccide tutti i processi di selenio più vecchi di 5 minuti.


Sembra essere unico per le versioni non RHEL / CentOS dikillall
ewwhite,

0

Utilizzare l' -m 1opzione con il comando grep per recuperare solo il primo processo trovato. Finché ordinerai i tuoi processi in base al PID, in ordine crescente, funzionerà.


1
Non si può essere certi che il processo di selenio stia utilizzando un PID inferiore.
FJRA

FJRA, un processo avviato in precedenza ottiene sempre un PID inferiore. Poiché il server selenio viene avviato prima del 'selenio grep', otterrà un PID inferiore.
hellodanylo,
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.