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

Lin*_*eak 6 bash shell-script

我在 bash 中有以下无限循环,do_some_simple_job每 10 分钟执行一次:

while true
do

    do_some_simple_job

    sleep 600

done
Run Code Online (Sandbox Code Playgroud)

我希望脚本在做这项工作时接受一些按键,比如取消工作,但不终止脚本,这可能吗?

Kus*_*nda 19

是的,这是可能的。

#!/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
Run Code Online (Sandbox Code Playgroud)

这个sh脚本(也适用于bashksh93和其他兼容弹)包含您的无限循环。在后台启动作业后,它会安装一个信号处理程序,这是一个小程序,只要脚本捕获到特定信号就应该运行。它捕获的信号是INT(中断)信号,您可以按Ctrl+发送该信号C

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

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

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