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
건배!