【问题标题】:send a blocking process to background after a delay延迟后将阻塞进程发送到后台
【发布时间】:2020-06-04 20:05:57
【问题描述】:

我正在尝试编写一个 bash 脚本,它在某些条件下启动一个外部 python 脚本。

目标是避免等待 python 脚本完成,而是等待延迟(例如 30 秒),如果 python 脚本仍在运行,则将进程发送到后台。

非常简化的python脚本示例:

#!/usr/bin/python  
import time  
time.sleep(120)

在这种情况下,我希望 bash 脚本启动 python 脚本,等待 30 秒,然后将 python 进程发送到后台(就像nohup example.py & 一样)。

如果 python 脚本在 30 秒延迟期间崩溃,错误消息应显示在终端上。

我无法修改 python 脚本。

有没有可能以干净的方式做到这一点?

我设法通过使用nohup / & 并将python脚本的输出重定向到一个临时文件来完成这项工作,并在30秒后读取该文件,以检查是否没有错误消息。

但我很想知道是否有更好的方法。

谢谢!

【问题讨论】:

  • 嗯,不。我不希望在延迟后终止进程。如果它仍在运行,我只想让它进入后台。这是一个非常具体的 python 脚本,我知道它只会在第一秒内崩溃。那么执行时间可能需要几天。
  • 是的,我看到你实际上想做与接受的答案相反的事情。我确实认为从前台开始是一种错误的方法。所以你想要这样的东西吗? while :; do python foo.py & pid=$!; sleep 30; kill -0 $pid && break; done。这将启动 foo.py,等待 30 秒,看看它是否还活着,是否不重复。
  • 您需要提供更多详细信息。比如,为什么你希望这是一个脚本而不是.bashrc 文件中定义的函数?这会成为更大剧本的一部分吗?发送到后台的程序是否会在 30 秒后向终端打印任何内容?它是否必须在调用后的前 30 秒内处于前台?你想在那个时期能够与它互动吗?您自己提出的 nohup 解决方案有什么问题?

标签: linux bash


【解决方案1】:

Jordanm 建议的方法(在后台启动进程)将提供正确的方向。考虑以下 bash 脚本,它在 bash 包装器中使用 2 个后台作业。

#! /bin/bash

sleep 30 &
sleep_pid=$!
(python -c 'import time ; time.sleep(10)' ; kill $sleep_pid) &
if wait $sleep_pid ; then
    echo "Python continue in background ..."
else
    echo "Python Completed"
fi

作为替代方案,可以使用单个后台进程在 Python/Perl 中实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2012-06-14
    相关资源
    最近更新 更多