为什么我的带有 pipelinenv 的 .sh 脚本可以手动正确运行,但不能通过 cron 运行?

为什么我的带有 pipelinenv 的 .sh 脚本可以手动正确运行,但不能通过 cron 运行?

最近,我遇到了一个 cron 脚本的问题,该脚本已经运行了很长时间,然后突然停止工作。该脚本在根 crontab 上运行。组织机构如下:

  • 在 crontab 中我执行一个run_script.sh脚本
  • 在 .sh 脚本中,我执行 cd 到特定目录,然后执行pipenv run python script.py

如果手动执行,则可以正常工作run_script.sh,但是当由 cron 触发时,它会返回导入 python3 中存在的库的错误(script.py 是用 python3 编写的)但不在 python2 中。所以我认为由于某种原因,使用 pipelinenv 设置 venv 时一定会出现问题,即使日志只显示导入库错误。

我尝试更改为run_script.shpipenv run python3 script.py但仍然收到相同的错误日志。

还尝试在 cron 文件中设置 PATH env 并将run_script.shpython3 的路径添加到现有的 PATH 中,但这对我来说也不起作用。

最后我的sudo apt update && upgrade机器仍然无法运行脚本。

uname -a以下是和的输出lsb_release -a

Linux ubuntu 5.7.0-2-amd64 #1 SMP Debian 5.7.10-1 (2020-07-26) x86_64 GNU/Linux


No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye

提前致谢!

答案1

作业通过 运行cron,或者systemd启动脚本不在桌面上运行的同一运行时环境中运行。systemd启动脚本作为root.您的任何PATH更改或其他环境变量设置都不会自动传播到您的cron作业。例如,没有$DISPLAY,因此 GUI 程序需要特殊处理(读取man xhost)。

可以在Read 文件cron中为所有作业设置环境变量。crontabman 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias查看每个环境中的结果 。

由于默认情况下,command该行的部分由 解释,它的语法比 更简单,因此我建议调用一个脚本(可执行文件,已安装,以 开头)来设置环境,然后调用所需的程序。crontab/bin/sh/bin/bashcommandbash#!/bin/bash

相关内容