関数内の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を更新したいと思いますncstart()しかし、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

乾杯!

関連情報