Come usare awk per killare una lista di processi
Vi sarà capitato la necessità di dover “killare” in un sistema unix più processi e di aver avuto la tentazione di farlo passando uno per uno il PID al comando kill usando la seguente sintassi
kill -9 <PID>
ovviamente per quanto possibile questa soluzione è a dir poco noiosa, soprattutto quando il numero di processi coinvolti è superiore a due 🙂 in tal caso se come me siete avversi a fare cose ripetitive potete fare qualcosa del genere.
In prima istanza è necessario ottenere la lista dei processi target, per farlo una via è quella di usare ad esempio una pipeline del comando ps e del comando grep :
ps -x | grep <nome del processo>
esempio:
ps -x | grep test
il risultato del comando precedente è la lista dei processi coinvolti:
PID TTY TIME CMD 42775 ttys004 0:00.04 sh test.sh 42795 ttys004 0:00.03 sh test.sh 42802 ttys004 0:00.03 sh test.sh 42807 ttys004 0:00.03 sh test.sh
a questo punto sarà necessario estrarre la lista dei pid:
ps -x | grep test | awk '{print $1}'
il cui risultato è:
42775 42795 42802 42807 44111
sarà necesasrio trasformare la lista in una riga di elementi :
ps -x | grep test | awk '{print $1}'| xargs
infine sarà possibile passarla al kill:
ps -x | grep test | awk '{print $1}'| xargs kill -9
attenzione nell’ultimo passaggio non è necessario usare un pipe ma xargs come argomento accetta il comando da eseguire:
xargs [-0oprt] [-E eofstr] [-I replstr [-R replacements] [-S replsize]] [-J replstr] [-L number] [-n number [-x]] [-P maxprocs] [-s size] [utility [argument ...]]
un’alternativa ad xargs è quella di usare la tecnica della sostituzione del comando attraverso la sintassi $(), in pratica mi calcolo la lista dei pid in un lista di testo sostituendolo al risultato del comando e la passo al kill.
kill $(ps -x | grep 'test' | awk '{print $1}')

Comments