Python cron 子进程 Popen 抛出 OSError [Errno 2],手动执行时有效

问题描述

我正在尝试自动化 Python 脚本以连续捕获网络数据包并将其写入文件。该脚本严重依赖 Wireshark 的 dumpcap CLI 命令的使用,并使用子进程 Popen 模块在 shell 中运行该命令。在正常执行期间,脚本会创建一个新目录并开始将网络数据捕获到该新目录。在命令行上手动执行时,脚本运行到完成,但是,当我让 cron 执行作业时,脚本在捕获开始之前终止,并出现以下错误

Traceback (most recent call last):
    File "./netcapture.py",line 19,in <module>
        dumpcap = subprocess.Popen(['dumpcap','-i','3','-a','duration:30','-b','duration:10','-w',filepath],cwd=r'/var/tmp/traces/')
    File "/usr/lib64/python2.6/subprocess.py",line 642,in __init__ errread,errwrite)
    File "/usr/lib64/python2.6/subprocess.py",line 1238,in __execute_child raise child_exception
OSError: [Errno 2] No such file or directory

文件路径变量是

netdata_02_24_2021/trace.pcap

这是新创建的目录的名称和 dumpcap 将网络数据写入的文件名和类型。我在 RHEL 6 上使用 Python 2.6 运行此脚本以供参考。 cron作业语法如下:

0 0 * * * cd /var/tmp/traces/ && python ./netcapture.py &

我知道的事情:

  • cron 能够找到并执行脚本
  • 脚本执行的当前工作目录是正确的
  • subprocess.Popen 在由 cron 执行时工作,因为它在抛出错误之前使用以成功创建
mkdir -p netdata_02_24_2021

在当前工作目录中调用

  • 路径对于捕获写入是正确的。我可以手动执行这个脚本,它会识别新目录并写入它

我尝试过的事情:

  • 提供所有目录的完整路径
  • 将 subprocess.Popen() 调用切换为 subprocess.check_call() 调用
  • 在我的 subprocess.Popen() 调用中使用 shell=True 语法

此时,我不确定是什么导致了 cron 的执行问题。任何帮助将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)