我正在编写一个 bash 脚本,其中必须执行 3 个命令。
- 命令
1
必须在后台每 10 秒运行一次 - 命令
2
和3
必须运行一次并且也在后台运行。 - 此外,命令必须在命令和执行
1
之前至少成功执行一次,因为它会生成/更新最后两个正常运行所需的文件。2
3
但是,我不知道如何使命令1
在这些条件下运行...我不能将 awhile(1)
与 asleep 10
或类似的东西一起使用,因为那样我将永远不会到达命令2
和3
。
我缺少什么 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 函数中,并大量清理此代码。