从cron运行脚本时运行外部程序

问题描述 投票:0回答:2

我有一个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的绝对路径来解决它,但这似乎是一个坏主意。但是我对此可能是错的。如果这是正确的方法,请解释原因。

python python-3.x cron subprocess
2个回答
0
投票

您可能必须在crontab中定义shell。之前已经问过这个问题。

crontab: python script being run but does not execute OS Commands


0
投票

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

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

40 13 * * * me /home/me/reposync.py sync 2> /tmp/test.txt
© www.soinside.com 2019 - 2024. All rights reserved.