【问题标题】:Prevent shutdown/reboot until background Python script finishes防止关机/重启,直到后台 Python 脚本完成
【发布时间】:2016-08-08 04:03:20
【问题描述】:

背景:

我有一个 Python 脚本,它在 Ubuntu 服务器的后台启动时(无限地)运行。该过程通过发送一个 SIGINT 结束,该脚本由在退出之前完成所有作业的脚本处理。如果有人关闭服务器,从而终止脚本,重要数据将会丢失。我想知道是否有办法在关闭之前等待脚本完成,或者完全阻止关闭(如果阻止它可以显示一条消息会很好)。

尝试:

我的 Python 脚本 (test.py) 有一个 SIGINT 处理程序,当它接收到 SIGINT 时,它会在退出之前完成所有任务。我编写了以下 shell 脚本:

PROCESS=$(pgrep -f 'python test.py')
echo $PROCESS
kill -2 $PROCESS
while kill -2 $PROCESS 2> /dev/null; do
        sleep 1
done

这个脚本会不断地向 python 脚本发送 kill 命令,直到它退出(它在运行时工作)。我将脚本放在 init.d 目录中,在脚本上使用 chmod -x,对名称以 K99 开头的 rc0.d 和 rc6.d 目录进行符号链接。由于 rc0.d/rc6.d 目录中的脚本在关机/重启时运行,因此该脚本应该(理论上)运行并等待 Python 脚本完成关机/重启。这似乎不起作用。它在未完成任务的情况下关闭/重新启动。

【问题讨论】:

  • 如果你的脚本自己正确运行,问题可能在于你如何挂钩它。如果您确定它可以运行,则问题可能是它所需的资源已被禁用(磁盘已卸载?),或者可能是其他东西已经杀死了您的进程。如果没有这些事情的细节,我们所能做的就是推测;在任何情况下都不是严格的编程问题(或者至少不是您发布的代码)。
  • 如果你有pgrep,我猜你有pkill
  • 也许用shutdown -c替换sleep 1

标签: bash shell unix ubuntu sh


【解决方案1】:

作为正常关闭序列的一部分,系统已经向所有正在运行的进程发送了一个信号,但它不是SIGHUP。将您的程序改为处理SIGTERM(或者,也涵盖所有可能性。当您使用它时,也可以添加SIGINT)。

您无需在关闭脚本中添加任何内容;我猜你无法让它工作的原因是在你的脚本运行时进程已经终止了。

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 2020-02-04
    • 2016-01-31
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多