我在 bash 中有以下无限循环,do_some_simple_job
每 10 分钟执行一次:
while true
do
do_some_simple_job
sleep 600
done
我希望脚本在执行此作业时接受一些按键,例如取消作业,但不终止脚本,这可能吗?
答案1
是的,这是可能的。
#!/bin/sh
sigint_handler () {
echo "Killing the job ($job_pid)"
kill $job_pid
}
while true; do
some_simple_job & job_pid=$!
trap 'sigint_handler' INT
echo "Job started ($job_pid)"
wait
trap - INT
echo "Job finished, waiting 10 minutes..."
sleep 600
done
该sh
脚本(也适用于bash
、ksh93
和其他兼容的 shell)包含无限循环。在后台启动作业后,它会安装信号处理程序,一个小例程,每当脚本捕获特定信号时就应该运行。它捕获的信号是INT
(中断)信号,您可以通过按Ctrl+发送该信号C。
该脚本等待作业完成,然后休眠 10 分钟(就像您的脚本一样)。在休眠之前,它会卸载信号处理程序,以便您可以使用Ctrl+中断脚本C。
如果INT
作业运行时收到信号,信号处理程序将使用其进程 ID 终止该作业。然后,脚本将继续卸载处理程序并休眠。
如果您在 10 分钟睡眠期间没有退出脚本,循环将继续启动作业并再次安装处理程序。