我需要在每X秒运行的应用程序,因此,尽可能的cron不秒,这样的工作,我写了一个bash脚本具有X秒睡在它无限循环。
当我必须手动停止正在运行的脚本,我愿做一个正确的方式 - 让应用程序完整的功能,只是没有进入循环的下一次。
你有任何想法,如何可以做到这一点? 我想过传递参数,但我找不到如何参数传递给正在运行的脚本。
我需要在每X秒运行的应用程序,因此,尽可能的cron不秒,这样的工作,我写了一个bash脚本具有X秒睡在它无限循环。
当我必须手动停止正在运行的脚本,我愿做一个正确的方式 - 让应用程序完整的功能,只是没有进入循环的下一次。
你有任何想法,如何可以做到这一点? 我想过传递参数,但我找不到如何参数传递给正在运行的脚本。
你可以捕获一个信号,说SIGUSR1:
echo "My pid is: $$"
finish=0
trap 'finish=1' SIGUSR1
while (( finish != 1 ))
do
stuff
sleep 42
done
然后,当你想退出的下一次迭代循环:
kill -SIGUSR1 pid
其中pid
是脚本的进程ID。 如果信号在睡眠期间提出的,它将唤醒(休眠休眠,直到发生的任何信号)。
您可以通过文件传递一些参数。 在每次迭代中你可以阅读这个文件,看看你的运行condtions得到了改变。
如果你有反正做一些清理以下结构是合适的。 如图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
早些时候发布的陷阱解决方案有利于大循环,但繁琐的,你只是遍历一个或几个命令常见的情况。 在这种情况下,我建议采用以下解决方案:
while whatever; do
command || break
done
这将退出循环,如果命令有一个非零退出代码,如果它被中断,这将发生。 所以,除非command
处理SIGINT
,按下Ctrl-C都将停止当前命令,并退出循环。
编辑:更紧密地阅读你的问题后,我看到你想要的电流命令继续执行。 在这种情况下,这种解决方案并不适用。