Bash - 在等待按下特定键时做一些无限的工作 - 可能吗?

Bash - 在等待按下特定键时做一些无限的工作 - 可能吗?

我在 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脚本(也适用于bashksh93和其他兼容的 shell)包含无限循环。在后台启动作业后,它会安装信号处理程序,一个小例程,每当脚本捕获特定信号时就应该运行。它捕获的信号是INT(中断)信号,您可以通过按Ctrl+发送该信号C

该脚本等待作业完成,然后休眠 10 分钟(就像您的脚本一样)。在休眠之前,它会卸载信号处理程序,以便您可以使用Ctrl+中断脚本C

如果INT作业运行时收到信号,信号处理程序将使用其进程 ID 终止该作业。然后,脚本将继续卸载处理程序并休眠。

如果您在 10 分钟睡眠期间没有退出脚本,循环将继续启动作业并再次安装处理程序。

相关内容