我有我的script.sh
,并希望用./script.sh
或运行它./script.sh --daemon
,让它保持在前台,除非给出了 --daemon 标志,在这种情况下它应该分离并适当地进入后台。我希望脚本看起来像
[function definitions]
process_args
if [ "$BECOME_DAEMON" == "1" ]; then
become_daemon
fi
while true; do
read line <controller_fifo
do_command $line
done
是否有可能获得我想要的行为?如果可以,我需要为 become_daemon 填写什么?如果不行,最好的替代方案是什么?
答案1
我发现以下方法有效:
[function definitions]
process_args
function command_loop {
trap handle_term SIGTERM
while true; do
read line <controller_fifo && do_command $line &
wait
done
}
if [ "$BECOME_DAEMON" == "1" ]; then
command_loop &> /dev/null &
disown
else
command_loop
fi
请注意,此方法在两种情况下(守护进程或无守护进程)都能正常处理 SIGTERM 信号,而我发布的原始读取循环不会处理信号(直到另一个读取行之后才会调用信号处理程序)。