Script bash per killare processi e tutti i suoi figli

Sui server capita di avere processi da killare, ma se questi hanno processi figli killandoli resterebbero zombie, sleeping o running (dipende dal modo in cui sono stati creati dal padre).

Ho scirtto uno script bash a cui passare il nome del processo padre da killare e lui cerca tutti i figli (cioè a tutti i livelli gerarchici) ed esegue un bel kill -9 alla lista di PID:


#!/bin/bash

### Script che elenca e killa tutti i processi figli
### prima di killare il padre.

usage(){
echo "utilizzo: $0 nomeprocesso"
exit
}

if [ $# -lt 1 ]
then
usage
fi

find_children()
{
children="`ps -ef|awk '$3 == l_proc {print $2}' l_proc=$J`"
for J in ${children}
do
echo "Child = $J"
if [ $J -eq $$ ]
then
#echo "Processo figlio sono io!"
### Svuoto proc_list per prevenire il suicidio.
###
proc_list=""
else
proc_list="$J $proc_list"
find_children
fi
done
}

# inizialmente l'avevo scritta così, poi mi sono ricordato di pgrep!

# per recuperare i PID dei processi passati come argomento
# PIDS="`ps eao bsdtime,pid,comm|egrep "$1"|awk '{print $2}'`"
PIDS="`pgrep $1`"

for J in ${PIDS}
do
if [ $J -ne $$ ]
then
echo "Parent = $J"
###
### Inizia la lista dei processi
###
proc_list=$J
find_children
###
### Ora ho la lista completa per il PID corrente
###
#
if [ "$proc_list" != "" ]
then
echo "kill -9 $proc_list"
kill -9 $proc_list
fi
fi
done

Commenti