我有一个 python selenium 脚本,可以打开 chrome 并为我运行一些自动化任务。在 crontab 中直接调用 python 可以使用下面的行。 :10.0 是我运行 echo $DISPLAY 时得到的值。我使用的是 Ubuntu 22.04.4 LTS
58 23 * * 2 DISPLAY=:10.0 /usr/bin/python3 /home/user/Script.py
但是,我想将一些环境变量传递给 python 脚本,因此我创建了一个 sh 文件。手动触发时,bash 脚本将按预期工作。但当设置为在 cron 中运行时则不然。 Cron 日志显示它尝试运行该脚本。我可以看到从我的 python 脚本生成的日志文件,但没有写入任何内容,我猜它没有运行。
10 12 * * * DISPLAY=:10.0 /home/aaron/script.sh
这是 bash 脚本的内容
#!/bin/bash
#Boook facility
/usr/bin/python3 /home/aaron/script.py -u $env1 -p $env2 -f "TEST" -t "7.00PM-9.00PM"
任何人都可以告诉我我在这里缺少什么?我不介意探索 cron 替代方案,只要我能让 bash 脚本运行即可。
问题在于 crontab 在一个非常有限的环境中运行,它无法访问你期望的相同环境变量。
这里有几种方法可以解决这个问题:
1. 在 crontab 中直接设置环境变量:
你可以在 crontab 文件中直接定义环境变量。例如:
10 12 * * * env1="value1" env2="value2" DISPLAY=:10.0 /home/aaron/script.sh
2. 在脚本中获取环境变量:
你可以修改 bash 脚本,使其从文件中读取环境变量。例如,创建一个名为
.env
的文件,并将环境变量存储在其中:
env1="value1"
env2="value2"
然后在你的 bash 脚本中使用
source
命令加载这些变量:
#!/bin/bash
#Boook facility
source /home/aaron/.env
/usr/bin/python3 /home/aaron/script.py -u "$env1" -p "$env2" -f "TEST" -t "7.00PM-9.00PM"
3. 使用
crontab -e
编辑器:
使用
crontab -e
命令编辑 crontab 文件时,你可以使用
source
命令加载你的 bash 配置文件(例如
.bashrc
或
.zshrc
),这将加载你在 shell 中设置的所有环境变量。
# 在 crontab 文件的第一行添加以下内容
source ~/.bashrc
# 其他 cron 任务
10 12 * * * DISPLAY=:10.0 /home/aaron/script.sh
4. 使用 systemd timer:
systemd timer 是 cron 的一个更现代的替代方案,它提供了更多的灵活性和功能。使用 systemd timer,你可以创建一个 systemd 服务单元,并在其中定义环境变量。
调试建议:
-
检查 cron 日志:
查看 cron 日志以获取有关脚本执行的更多信息。你可以使用
grep CRON /var/log/syslog
或sudo journalctl -u cron
命令查看日志。 -
添加调试输出:
在你的 bash 脚本和 Python 脚本中添加
echo
或print
语句,以输出环境变量的值和其他相关信息,以便进行调试。
选择适合你需求的方法,并确保在进行更改后重新启动 cron 服务 (
sudo systemctl restart cron
).