最近,我遇到了一个 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.sh
,pipenv run python3 script.py
但仍然收到相同的错误日志。
还尝试在 cron 文件中设置 PATH env 并将run_script.sh
python3 的路径添加到现有的 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
中为所有作业设置环境变量。crontab
man 5 crontab
echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias
查看每个环境中的结果 。
由于默认情况下,command
该行的部分由 解释,它的语法比 更简单,因此我建议调用一个脚本(可执行文件,已安装,以 开头)来设置环境,然后调用所需的程序。crontab
/bin/sh
/bin/bash
command
bash
#!/bin/bash