Вот такой код:
#!/bin/bash
if (( PPID==1 )); then
echo "(son, pid=$$, ppid=$PPID) a=$a"
# for ((i=0; i<25; i++)); do echo -n '='; sleep 1; done
else
echo "(parent, pid=$$, ppid=$PPID) exporting variable a to my son..."
export a=34
$0 &
# for ((i=0; i<25; i++)); do echo -n '-'; sleep 1; done
fi
Ведет себя несколько странно... Иногда два раза вызывается часть else, а потом один раз if (то есть PPID становится равным единице), иногда работает, как ожидается: один раз отрабатывает предок, который запускает сам себя в фоне, а у фоновой копии процесса отрабатывает блок if, после чего скрипт завершается.
Вопросы:
1) Почему вообще у потомка в таком случае PPID равен 1-му, ведь это PID процесса init!
2) Почему иногда PPID первого порожденного потомка оказывается корректным, указывает на реального предка? И при этом второе порождение потомка (из этого, с нормальным PPID) всё равно будет считать своим предком процесс init!
3) Если вы раскомментируете два цикла for, получите бесконечное самопорождение процессов. Это как так вообще?
Заранее признателен, всю бошку уж сломал, это вам не fork'анье тупое в C, это вам высшая математика BASH'а :)
Форум —
Development


