bash - 使用 sleep 和 wait -n 在 bash 中实现简单的超时,竞争条件与否?

标签 bash shell timeout waitpid

如果我在 bash 脚本中这样做:

sleep 10 &
sleep_pid=$!
some_command &
wait -n
cmd_pid=$!

if kill -0 $sleep_pid 2> /dev/null; then
    # all ok
    kill $sleep_pid
else
    # some_command hung
    ...code to log diagnostics and then kill -9 $cmd_pid...
fi

其中 some_command 应该很快但可能会由于罕见的错误而挂起。

在“wait -n”开始之前是否存在可以完成并清理 some_command 的风险,因此只有等待 sleep ?还是一个命令后的“&”保证 shell 在处理下一行输入之前不会对其调用 waitpid()?

它在交互式 shell 中工作。如果你这样做:

sleep 10 &
sleep 0 &
wait -n

然后“wait -n”立即返回,即使您在运行它之前等待几秒钟也是如此。但我不确定非交互式 shell 是否可以信任它?

编辑:澄清诊断需求 + 一些语法。

最佳答案

我相信你可以使用 timeout 命令来做到这一点。
http://man7.org/linux/man-pages/man1/timeout.1.html

timeout 10s command_to_run

可以查看timeout命令的退出状态,了解是否超时。

timeout 2s sleep 10

if [[ $? -gt 0 ]]; then
  echo "it timed out"
else
  echo "It was successful"
fi

关于bash - 使用 sleep 和 wait -n 在 bash 中实现简单的超时,竞争条件与否?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50975596/

相关文章:

bash - 在 bash 中捕获来自 "docker stop"的信号

sql-server - DBeaver 连接已关闭 MS SQL

bash:获取目录参数

c - 在 Bash 脚本中运行 C 程序

linux - 使用 grep 检查文本文件中的 2 个精确字符串

java - 根据扩展名扰乱目录中的所有文件

shell - 在 Vagrant 中安装 Jenkins 后,无法从浏览器连接

python - 在 Python 循环中重复超时或用户输入

去超时不开火

linux - 硬编码 bin 路径和 NixOS