我有一个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=True
添加到subprocess.run
,但似乎没有什么不同。或它不会引发该异常,但是从proc打印stderr时仍然出现相同的错误。
我想我可以通过包含指向rsync
的绝对路径来解决它,但这似乎是一个坏主意。但是我对此可能是错的。如果这是正确的方法,请解释原因。
您可能必须在crontab中定义shell。之前已经问过这个问题。
crontab: python script being run but does not execute OS Commands
在crontab中,您正在覆盖$PATH
变量,该变量现在仅包含目录/home/me
。现在找不到您的rsync
可执行文件,因为它不在您的主目录中。
通过删除PATH=...
行并使用其完整路径调用脚本来更改crontab条目:
40 13 * * * me /home/me/reposync.py sync 2> /tmp/test.txt