在后台多次执行命令(bash 脚本)

在后台多次执行命令(bash 脚本)

我正在编写一个 bash 脚本,其中必须执行 3 个命令。

  • 命令1必须在后台每 10 秒运行一次
  • 命令23必须运行一次并且也在后台运行。
  • 此外,命令必须在命令和执行1之前至少成功执行一次,因为它会生成/更新最后两个正常运行所需的文件。23

但是,我不知道如何使命令1在这些条件下运行...我不能将 awhile(1)与 asleep 10或类似的东西一起使用,因为那样我将永远不会到达命令23

我缺少什么 bash 脚本概念?也许是线程?

编辑:命令1可以像在 .txt 文件中递增整数一样简单,该文件将在命令2和中使用3

答案1

我缺少什么 bash 脚本概念?也许是线程?

作业控制。您可以在后台启动进程,并通过了解进程 ID 和退出状态来对它们进行相当细粒度的控制。

要获取后台命令的 PID,请使用该$!变量。

要获取后台命令的退出状态,请使用wait()并提供其 PID。wait()注意,如果命令尚未退出,调用将会阻塞。如果此阻塞是问题(可能是在您的情况下),您可以ps在调用之前执行检查(或其他一些方法),wait()以查看您的进程是否已准备好被收获,通常在有看门狗或其他一些的循环中设置任务执行时间限制的方法。

考虑以下基于循环的样板:

complete=0
cycles=0
# Task 1
sleep 200 &
pid=$!
while [[ complete -eq 0 ]]; then
    ps -o pid= -p $pid > /dev/null
    if [[ $? -ne 0 ]]; then
        # Signal complete to logic below
        complete=1
        break;
    fi
    # Perform some timeout / cycle check to give up on this task
    cycles=$((cycles + 1))
    if [[ $cycles -gt 100 ]]; then # whatever, this is just a simple watchdog example
        break;
    fi
    # Optional sleep
    sleep 1
done
if [[ $complete -eq 1 ]]; then
    # Process the command's exit status
    wait $pid
    if [[ $? -ne 0 ]]; then
        : # handle command failed perhaps
    else
        : # do other things, assuming exit of 0 is a good thing
    fi
else
    # Process a command watchdog failure
    kill -9 $pid # come what may
fi

对于更复杂的作业控制,您可以将命令检查和周期管理移至 bash 函数中,并大量清理此代码。

相关内容