首页 > 解决方案 > 从 cron 运行脚本时运行外部程序

问题描述

我有一个从命令行执行时可以正常工作的 python 脚本。但是当我尝试从 cron 运行它时,它不起作用。

command = "rsync -avHP --delete --bwlimit=800 rsync://mirror.nsc.liu.se/CentOS/7.8.2003/  /home/me/reposync/centos"
proc=subprocess.run(command.split(), capture_output=True)

cronjob 运行。cronfile 看起来像这样:

PATH=/home/me
40 13 * * * me cd $PATH && ./reposync.py sync 2> /tmp/test.txt

但是我从以下位置收到此错误(是的,两次)print(proc.stderr.decode('utf-8'))

-avHP: rsync: command not found

似乎问题与找不到rsync有关,但我不知道该怎么办。

输出/tmp/test.txt

FileNotFoundError: [Errno 2] No such file or directory: 'rsync'

我尝试添加shell=Truesubprocess.run但似乎没有什么不同。或者它不会抛出那个异常,但是从proc打印stderr时我仍然得到同样的错误。

我想我可以通过包含绝对路径来解决它,rsync但感觉这是一个坏主意。但我可能错了。如果这是正确的方法,请解释原因。

标签: pythonpython-3.xcronsubprocess

解决方案


在您的 crontab 中,您正在覆盖您的$PATH变量,该变量现在仅包含目录/home/mersync现在找不到您的可执行文件,因为它不在您的主目录中。

PATH=...通过删除该行并使用其完整路径调用您的脚本来更改您的 crontab 条目:

40 13 * * * me /home/me/reposync.py sync 2> /tmp/test.txt

推荐阅读