Borgmatic cron 作业因 python `ModuleNotFoundError` 而出现错误

Borgmatic cron 作业因 python `ModuleNotFoundError` 而出现错误

我正在尝试设置一个每日 cron 作业,使用以下方法备份一些文件博格马蒂,但我一直收到同样的错误,并且无法弄清楚如何修复它。

我的borgmatic版本:

$ borgmatic --version
1.3.0

我的/etc/cron.daily/borgmatic文件:

#!/bin/bash
MAILTO="[email protected]"
PATH=$PATH:/usr/local/bin
PYTHONPATH=/home/tomeraberbach/.local/lib/python3.6/site-packages
/usr/local/bin/borgmatic

及其权限:

$ ls -l /etc/cron.daily/borgmatic
-rwxr-xr-x 1 root tomeraberbach 162 Apr  8 00:20 /etc/cron.daily/borgmatic*

但是,我在作业运行时不断收到以下错误:

/etc/cron.daily/borgmatic:
Traceback (most recent call last):
  File "/usr/local/bin/borgmatic", line 7, in <module>
    from borgmatic.commands.borgmatic import main
  File "/usr/local/lib/python3.6/dist-packages/borgmatic/commands/borgmatic.py", line 22, in <module>
    from borgmatic.config import checks, collect, convert, validate
  File "/usr/local/lib/python3.6/dist-packages/borgmatic/config/convert.py", line 3, in <module>
    from ruamel import yaml
ModuleNotFoundError: No module named 'ruamel'
run-parts: /etc/cron.daily/borgmatic exited with return code 1

这只会在 cron 作业中发生。运行borgmatic通常可以正常工作。

此外,该ruamel软件包肯定已经安装:

$ ls /home/tomeraberbach/.local/lib/python3.6/site-packages/ruamel
yaml/

知道为什么会发生这种情况吗?我知道 cron 在不同的环境中运行,但我不确定如何解决此问题。

编辑:

将该行更改PYTHONPATH=/home/tomeraberbach/.local/lib/python3.6/site-packagesexport PYTHONPATH=/home/tomeraberbach/.local/lib/python3.6/site-packages /usr/local/bin/borgmatic会导致脚本以不同的方式出错:

/etc/cron.daily/borgmatic:
Traceback (most recent call last):
  File "/usr/local/bin/borgmatic", line 7, in <module>
    from borgmatic.commands.borgmatic import main
ModuleNotFoundError: No module named 'borgmatic'
run-parts: /etc/cron.daily/borgmatic exited with return code 1

答案1

borgmatic 作者在这里。看起来 borgmatic 是在系统级别安装的,并且它的一些依赖项是以您的个人用户身份安装的。但 borgmatic cron 作业是以 root 身份运行的。这是根本的不匹配。所以我的建议是以您的个人用户身份卸载任何 borgmatic 依赖项,然后以 root 身份重新安装它们按照此处的说明,带或不带--user。然后,当您以 root 用户身份运行 cron 作业时,它应该希望所有内容都在正确的路径中。如果没有,那么您可以尝试PYTHONPATH按照steeldriver上面的建议将相关路径添加到您的路径中。可能追加如果需要,可以使用 .path 来PYTHONPATH=$PYTHONPATH:/new/path避免替换现有路径。

相关内容