함수 내부의 nc_pid 변수 값을 추출합니다.

함수 내부의 nc_pid 변수 값을 추출합니다.

nc_pidpid가 있는 프로세스가 실행 중인지 확인하는 데 사용할 수 있도록 업데이트하고 싶습니다 nc_pid.

#!/usr/bin/bash

function start () {
    trap 'echo "Clean up and exit"; kill $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=$!                 # global variable nc_pid is not updated
        wait $nc_pid
        kill $nc_pid &>/dev/null
    done
}

if [ "$1" != "__forked__" ]; then
        setsid "$0" __forked__ "$@" &
        exit
else
        shift
fi

# stop or start daemon
nc_pid=999999

case "$1" in
    stop)
    killall simpled.sh
    ;;
    start)  
    if ! kill -0 $nc_pid &>/dev/null            # always false
    then
        start
    fi
    ;;
    status)
    if kill -0 $nc_pid &>/dev/null              # always false
    then
        echo "nc running"
    else
        echo "nc not running"
    fi
    ;;
    *)
    echo -e "\nsimpled.sh [start|stop|status]"
    ;;
esac

처음에는 nc_pid일반적으로 존재하지 않는 값(999999)으로 설정됩니다. 그런 다음 실행하는 동안 nc_pid분기된 프로세스의 pid를 업데이트 하고 싶습니다 nc. start()하지만 nc_pid전혀 업데이트되지 않는 것 같습니다(값은 999999로 유지됩니다).

따라서 $0 start항상 분기된 프로세스의 새 인스턴스를 시작 nc하고 $0 status항상 "nc not running"을 출력합니다.

포크된 프로세스의 pid를 외부에서 얻을 수 있도록 코드를 수정하려면 어떻게 해야 합니까 nc_pid? 감사해요!ncstart()

답변1

방금 nc의 pid를 파일에 저장하고 그런 식으로 수정했습니다.

#!/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

건배!

관련 정보