Scusate ragazzi ma non mi capacito di una cosa… ho semplificato ancora di più lo script in questo modo…
function gui_start {
local choice=""
choice=`yad --title="TITLE" --center --text="WELCOME insert text" --entry`
verify_exit $?
}
function verify_exit {
local code=$1
if $code -eq 1 -o $code -eq 252 ]; then
kill_all_child $MY_PID
#MY_PID è una variabile globale inizializzata più giù
fi
}
function kill_all_child {
local parent=$1
local childs=`ps -o pid --no-headers --ppid "$parent"`
echo "mypid: $parent"
echo "childs: $childs"
for i in $childs
do
kill_all_child $i
done
kill -kill $parent
}
MY_PID=$$
gui_start
#MY_PID viene inizializzato a $$, vale a dire il pid dello script.
In questo modo la PRIMA volta che viene chiamata verify_exit viene passato come pid a kill_all_child
che ricorsivamente termina i processi figli dello script
Il punto a mio parere assurdo è questo:
appena dopo aver lanciato lo script ed essermi apparsa la prima schermata, quella che richiede l’ inserimento del testo, ho dato da terminale:
$ps -Al
...
0 S 1002 3421 3419 0 80 0 - 28022 pipe_w pts/1 00:00:00 my-search-tool
0 S 1002 3422 3421 0 80 0 - 104358 poll_s pts/1 00:00:00 yad
...
la prima riga è il mio script, la seconda è il comando che crea la schermata di YAD, che come vedete risulta figlio di my-search-tool
Adesso premo il tasto di “cancel” sulla schermata e viene correttamente effettuata la chiamata a verify_exit, che a sua volta chiama kill_all_child…
Qui arrivano le cose strane, come vedete ho messo degli echo in kill_all_child, per capire che succedeva… bene questo è l’ output visualizzato sul terminale:
mypid: 3421
childs: 3425
mypid: 3425
childs:
./my-search-tool-2: line 64: kill: (3425) - Nessun processo corrisponde
./geany_run_script.sh: line 5: 3421 Ucciso "./my-search-tool-2"
Come vedete alla prima chiamata kill_all_child riceve in ingresso il pid dello script 3421 che è GIUSTO se confrontato con l’ output di ps -Al di sopra… adesso ci si aspetterebbe che in child ci sia 3422… e INVECE c’è 3425 !!! che non compare nemmeno nell’ elenco di ps -Al
Quindi mi chiedo perché questa linea di codice di kill_all_child restituisce 3425 ???
childs=`ps -o pid --no-headers --ppid "$parent"`
P.S.
In una simulazione identica a questa ho provato a dare, da un altro terminale
$ ps -o pid --no-headers --ppid 3411
3412
e infatti
$ ps -Al
0 S 1002 3411 3419 0 80 0 - 28022 pipe_w pts/1 00:00:00 my-search-tool
0 S 1002 3412 3411 0 80 0 - 104358 poll_s pts/1 00:00:00 yad