Извлечение значения nc _переменной pid, находящейся внутри функции

Основная причина такого соглашения заключается в том, что если родительский процесс завершится раньше дочернего, код завершения дочернего процесса будет потерян, и дочерний процесс может некоторое время оставаться зомби.

После завершения дочернего процесса он остается (и потребляет память )до тех пор, пока не будет прочитан код выхода. Это то, что называется зомби-процессом -мертвым, но не пожатым (удаленным ).

Как правило, родительский процесс несет ответственность за считывание кода выхода и разрешение процесса-зомби полностью уйти. Поскольку родитель должен следить за детьми, мы надеемся, что это будет быстро очищаться. Если родительский процесс этого не делает, у вас есть утечка ресурсов.

Если родительский процесс завершится раньше, чем дочерний, init действительно возьмет на себя эту ответственность, но может не узнать об этом сразу, поэтому дочерний процесс может дольше оставаться зомби и, таким образом, потреблять больше ресурсов.

Отредактируйте :для уточнения, процесс в состоянии зомби не хранит всю свою память вокруг -большая ее часть освобождается до того, как процесс становится зомби. Это запись в таблице процессов, которая остается. Чем больше записей в таблице процессов, тем больше времени потребуется ядру для действий, связанных с процессом -.

1
18.03.2021, 04:25
1 ответ

Я просто сохраняю 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

Ура!

0
22.03.2021, 00:12

Теги

Похожие вопросы