[Linux-Biella] kill PID in bash
andrea ferraris
andrea_ferraris a libero.it
Gio 9 Giu 2005 22:05:02 CEST
vallini.daniele a bilug.linux.it wrote:
> Con uno script avvio un xterm che a sua volta avvia processi figli
> (gnuplot).
> Non ho problemi a chiudere dopo un certo tempo tutto il processo poiche'
> nello script stesso mi basta un kill -9 $PPID oppure kill -9 $$.
>
> Se invece voglio mantenere il processo padre (xterm) e chiudere solo
> alcuni dei figli come faccio?
>
> Magari e' un metodo elementare ma ieri ho ruminato documentazione senza
> riuscire a trovare un mezzo semplice (come per il PPID) per ottenere il
> PID dei figli ai quali inviare nello script il SIGKILL.
>
> Onorato del vostro interessamento ringrazio anticipatamente.
E' un onore nostro cercare di risponderti. Si`, e` una cosa che mi ero
chiesto anch'io e a cui non avevo trovato risposta immediata. Colgo
l'occasione di questa interessante domanda per approfondire.
Credo di aver trovato 3 soluzioni possibili che hanno i loro vantaggi e
svantaggi.
Una consiste nel lanciare i processi figli in backgroung (con una "&"
senza doppi apici alla fine del comando), dato che la variabile $!
contiene il PID del processo appena lanciato in background, e quindi te
la puoi salvare in un file temporaneo e usarla in seguito per ucciderlo,
oppure se conosci il nome del processo figlio ed e` unico o vuoi
uccidere tutti quelli che si chiamano come lui, puoi ricavarne il/i PID
con ps -C <nome_processo> | awk '{print $1}' | grep -v PID e ucciderli con
for i in `ps -C <nome_processo> | awk '{print $1}' | grep -v PID`
do
kill -9 $i
done
Oppure se lanci in quell' xterm solo i processi che vuoi killare, si
dovrebbe poter fare con
ps -ef | grep $$ | grep -v xterm | grep -v grep \
| grep -v 'ps -ef' > file_temporaneo
e poi ti ricavi i PID dei processi lanciati in quell'xterm e da killare
con un
awk '{print $2}' file_temporaneo
Il primo ps, potrebbe essere anche sostituito da
ps -ef | awk -v ProCessoNonEsistentEE=$$ \
'{if($3==ProCessoNonEsistentEE) print }' | grep -v xterm \
| grep -v ProCessoNonEsistentEE > file_temporaneo
Si potrebbero poi anche mischiare la soluzione 2 e 3 per avere la
certezza che i processi che vai ad uccidere col nome specificato
dall'opzione -C siano figli di quell'xterm.
Personalmente, se e` praticabile (lancio in background), preferirei la
prima soluzione perche' mi sembra la piu` semplice e pulita.
Andrea
Maggiori informazioni sulla lista
Linux