python - 查找 shell 脚本中调用的每个进程的 pid

标签 python bash shell ubuntu cron

我有一个 cron 作业,每 8 小时启动一个 shell 脚本,进而调用一堆程序。有时这些程序不会正常终止,并且会陷入困境。

如果我的 cron 脚本 (run_foo_bar.sh) 看起来像这样:

python foo.py
python bar.py

...我可以同时运行多个 foo 和 bar。现在,我通过执行 ps -ax |grep foo 来获取 PID,然后使用 ps -p $PID -o etime= 查找运行时,但这会很麻烦。

Python 程序有一堆调试语句被打印到控制台,并且 shell 脚本本身通过管道传输到日志文件。我想找到一种方法,可以在调用每个进程后回显其 PID 及其调用时间,因此我的 run_foo_bar.sh 看起来像这样:

date
python foo.py
<some magic to find PID>
echo foo.py is running as PID $PID

date
python bar.py
<some magic to find PID>
echo bar.py is running as PID $PID

最佳答案

因此,为了完整起见,在 Python 方面,您可以执行以下操作:

import os, sys
print(os.getpid())
sys.stdout.flush()

转储当前 PID。您可能希望将其打印到文件而不是终端,以便可以从该文件中获取它。

在 shell 中,由于您只是等待 cron 作业运行,因此另一个选项是这样的(从 this answer 修改):

python foo.py & echo "$!" > "some file somewhere that will hold the PID" ; fg

在后台运行python foo.py,保存python进程的pid(位于$!中的每个this) ,然后返回python到前台,这样就可以正常运行了。

关于python - 查找 shell 脚本中调用的每个进程的 pid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41506781/

相关文章:

python - 如何循环程序,比如Basic中的 "goto"

python - 删除多个 Excel 电子表格中的列

bash - SQLite用新行导入字段

linux - 检查文件的整个原始文本内容是否作为另一个文件的一部分存在

bash - sed 命令替换具有特殊字符 "&"的字符串

Python - 使用 DataReader 连接数据帧列表

python - 出现在 Django URL 中的站点名称

linux - 列出我在颠覆中拥有的文件

linux - 如果最后一行(包含字符串的最后一次出现)是否以逗号作为最后一个字符,我该如何检查(并删除)?

windows - PowerShell 比较-Object SideIndicator