我对 bash 非常了解,所以如果这很明显可以解决,我深表歉意,如果需要更多详细信息,请告诉我。下面的脚本是启动 python 工作流并等待在工作流结束时更新 results.json 文件的较大脚本的一部分。
我试过用
{
sleep 1m
kill $$
}&
但这会在 results.json 文件在 1 分钟内刷新时生成错误:
杀死:(90015) - 没有这样的过程
这是脚本:
#! /bin/bash
export DISPLAY=:0.0
export outputfile=results.json
if [[ ! -e $outputfile ]]; then
touch $outputfile
fi
OldTimestamp=$(date -r $outputfile)
{
sleep 1m
kill $$
}&
NewTimestamp=$OldTimestamp;
while [ "$NewTimestamp" = "$OldTimestamp" ]; do
sleep 0.1
NewTimestamp="$(date -r $outputfile)"
done
如果你想要做的就是摆脱那个kill: (90015) - 没有这样的进程错误,你可以在杀死它之前检查进程是否仍在运行:
但我实际上根本不会使用 kill 。您可以只跟踪您在 while 循环中进行了多少次交互,并在适当次数的迭代后中断循环:
如果您想在文件未更新的情况下使用非零退出代码退出,您可以在之后添加:
或类似的。
如果您必须以这种方式执行此操作,这就是在成功生成 results.json 时出现该错误的原因:当您将 sleep 和 kill 放在大括号中时,这就是调用组命令。当您将 & 符号放在大括号之后时,它会将其置于子 shell 中的后台(
$$
仍然有效,因为它在解析和执行 group 命令时已更改为当前 pid)。如果您的 Python 程序成功完成,则没有任何东西告诉运行 sleep & kill 的子进程消失。当 sleep 到期时,它会运行 kill ,并且由于您的原始脚本不再运行,它会抱怨“没有这样的进程”。以下是如何让它发挥作用。在获得成功的结果后运行
kill %1
,这将杀死睡眠并杀死。我在上面说过“如果你必须……”,因为这不是写这篇文章的典型方式。通常你会使用一个
timeout
命令来运行应该创建你的 results.json 的 Python 脚本。这样,您可以检查该运行的状态,如果不成功,只需退出脚本。它还具有在达到超时持续时间后终止报告生成器的好处。上面的方法没有:如果报告生成器只是运行缓慢,即使顶层脚本已经完成,您也会看到它仍在后台运行。(我正在对您的系统如何工作做出一些假设,但一般来说,这种方法只会停止顶级脚本,而不是脚本本身启动的任何内容)
如果你的 python 脚本名为“makereport.py”,我们可以这样做: