[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