如何停止在bash脚本优雅无限循环?(How to stop infinite loop in ba

2019-07-30 02:47发布

我需要在每X秒运行的应用程序,因此,尽可能的cron不秒,这样的工作,我写了一个bash脚本具有X秒睡在它无限循环。

当我必须手动停止正在运行的脚本,我愿做一个正确的方式 - 让应用程序完整的功能,只是没有进入循环的下一次。

你有任何想法,如何可以做到这一点? 我想过传递参数,但我找不到如何参数传递给正在运行的脚本。

Answer 1:

你可以捕获一个信号,说SIGUSR1:

echo "My pid is: $$"
finish=0
trap 'finish=1' SIGUSR1

while (( finish != 1 ))
do
    stuff
    sleep 42
done

然后,当你想退出的下一次迭代循环:

kill -SIGUSR1 pid

其中pid是脚本的进程ID。 如果信号在睡眠期间提出的,它将唤醒(休眠休眠,直到发生的任何信号)。



Answer 2:

您可以通过文件传递一些参数。 在每次迭代中你可以阅读这个文件,看看你的运行condtions得到了改变。



Answer 3:

如果你有反正做一些清理以下结构是合适的。 如图cdarke的答案使用kill。

#===============================================================
#  FUNCTION DEFINITIONS
#===============================================================
# . . .

#===  FUNCTION  ================================================
#          NAME:  cleanup
#   DESCRIPTION:  
#===============================================================
cleanup ()
{
  # wait for active children, remove empty logfile, ..., exit
  exit 0
} # ----------  end of function cleanup  ----------

#===============================================================
#   TRAPS
#===============================================================
trap  cleanup SIGUSR1

#===============================================================
#   MAIN SCRIPT
#===============================================================
echo -e "Script '$0' / PID ${$}"

while : ; do                                # infinite loop
  # . . .
  sleep 10
done
# . . .

#===============================================================
#   STATISTICS / CLEANUP
#===============================================================
cleanup


Answer 4:

早些时候发布的陷阱解决方案有利于大循环,但繁琐的,你只是遍历一个或几个命令常见的情况。 在这种情况下,我建议采用以下解决方案:

while whatever; do
    command || break
done

这将退出循环,如果命令有一个非零退出代码,如果它被中断,这将发生。 所以,除非command处理SIGINT ,按下Ctrl-C都将停止当前命令,并退出循环。

编辑:更紧密地阅读你的问题后,我看到你想要的电流命令继续执行。 在这种情况下,这种解决方案并不适用。



文章来源: How to stop infinite loop in bash script gracefully?