nc_pid
pidを持つプロセスが実行されていることを確認するために使用できるように更新したいと思います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
?ありがとうございます!nc
start()
答え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
乾杯!