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.