微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。