【问题标题】:Bash script that starts python script doesn't stop itself启动 python 脚本的 Bash 脚本不会自行停止
【发布时间】:2014-05-22 10:26:09
【问题描述】:

我不确定这是否真的是问题所在,但让我解释一下:我有一个由 bash 脚本启动的 python 脚本。然后 bash 脚本的工作就完成了,但是当我 grep ps aux 时,调用仍然存在。

#!/bin/bash
export http_proxy='1.2.3.4:1234'
python -u /home/user/folder/myscript.py -some Parameters >> /folder/Logfile_stout.log 2>&1 

如果我使用 grep 搜索 ps aux | grep python,我会得到 python -u /home/user/folder/myscript.py -some Parameters。根据日志文件,python脚本正确关闭。 (结束脚本的代码在脚本本身内。) 该脚本每小时启动一次,我仍然可以看到前几个小时的所有电话。

提前感谢您的帮助、提示或建议!

【问题讨论】:

  • 显然您的 Python 脚本不会终止。如果没有看到脚本的代码,我们无法告诉你为什么它没有。
  • 你是在运行一个无限循环还是什么。在不知道脚本做什么的情况下,很难诊断问题。
  • 我使用了来自 gaoithe 的答案并让它对我有用。因此,在我的 python 脚本中,我检查现在是什么时间,以及何时到达硬编码时间,脚本停止 - 使用使用 atexit 的清理函数。同时,启动 python 脚本的 Bash 脚本同时休眠,然后杀死它的孩子和它自己。测试它并且它有效..不是很漂亮,但有效。

标签: python bash shell process


【解决方案1】:

只要子(python 脚本)正在运行,父 bash 脚本就会一直存在。 如果您启动在后台运行的 python 脚本(在 python 行的末尾添加 &),则父级将退出。

#!/bin/bash
export http_proxy='1.2.3.4:1234'
python -u /home/user/folder/myscript.py -some Parameters >> /folder/Logfile_stout.log 2>&1 &

如果您检查进程列表(例如“ps -elf”)。它将显示孩子(如果仍在运行)。子 PPID(父 PID)将是 1(根 PID)而不是父 PID,因为父不再存在。

如果您的 python 脚本永远不会退出,最终可能会出现问题。 您可以让父脚本等待并杀死孩子,例如等待 30 秒,如果孩子仍然存在,则将其杀死:

#!/bin/bash
export http_proxy='1.2.3.4:1234'
python -u /home/user/folder/myscript.py -some Parameters >> /folder/Logfile_stout.log 2>&1 &
sleep 30
jobs
kill %1
kill -9 %1
jobs

【讨论】:

  • 啊,最后是小 &。我现在正在测试它。我会回来报告的!
  • 还是不行。当我按照您的建议使用 sleep 命令杀死它时,它当然可以工作,但我想从其内部杀死脚本。我只是想确保父母在它(bash脚本/父母)启动脚本之后或者如果可能的话直接死亡。
  • 如果您希望 python 脚本自行结束,那么这是 python 脚本的问题。如果 python 脚本自行结束,则父级将立即结束。所以你不需要任何睡眠和杀戮的东西。
  • “从内部杀死脚本”是什么意思?为此,我们需要讨论 python 脚本的内容和行为。
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 2020-09-27
  • 2016-03-19
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多