Основная причина такого соглашения заключается в том, что если родительский процесс завершится раньше дочернего, код завершения дочернего процесса будет потерян, и дочерний процесс может некоторое время оставаться зомби.
После завершения дочернего процесса он остается (и потребляет память )до тех пор, пока не будет прочитан код выхода. Это то, что называется зомби-процессом -мертвым, но не пожатым (удаленным ).
Как правило, родительский процесс несет ответственность за считывание кода выхода и разрешение процесса-зомби полностью уйти. Поскольку родитель должен следить за детьми, мы надеемся, что это будет быстро очищаться. Если родительский процесс этого не делает, у вас есть утечка ресурсов.
Если родительский процесс завершится раньше, чем дочерний, init действительно возьмет на себя эту ответственность, но может не узнать об этом сразу, поэтому дочерний процесс может дольше оставаться зомби и, таким образом, потреблять больше ресурсов.
Отредактируйте :для уточнения, процесс в состоянии зомби не хранит всю свою память вокруг -большая ее часть освобождается до того, как процесс становится зомби. Это запись в таблице процессов, которая остается. Чем больше записей в таблице процессов, тем больше времени потребуется ядру для действий, связанных с процессом -.
Я просто сохраняю pid nc в файл и исправляю его таким образом.
#!/usr/bin/bash
function start () {
trap 'echo "Clean up and exit"; kill $nc_pid; rm nc_pid; exit' TERM
exec > outfile
exec 2> errfile
exec 0< /dev/null
while true; do
(nc -lkp 1234 -e /usr/bin/bash &>/dev/null) &
nc_pid=$!
echo $nc_pid > nc_pid
wait $nc_pid
kill $nc_pid &>/dev/null
done
}
if [ "$1" != "__forked__" ]; then
setsid "$0" __forked__ "$@" &
exit
else
shift
fi
# stop or start daemon
([ ! -f "nc_pid" ] && nc_pid=9999) || nc_pid=$(cat nc_pid)
case "$1" in
stop)
killall simpled.sh
;;
start)
if ! kill -0 $nc_pid &>/dev/null
then
start
fi
;;
status)
if kill -0 $nc_pid &>/dev/null
then
echo -e "\nnc running: pid $nc_pid"
else
echo -e "\nnc not running"
fi
;;
*)
# when $0 is run, the help message displays then won't return to terminal until return key is pressed.
echo -e "\nsimpled.sh [start|stop|status]"
;;
esac
Ура!