这是我的 crontab 命令:
*/15 * * * * cd /home/ec2-user/SageMaker && /bin/bash /home/ec2-user/SageMaker/churn_end_to_end_pipeling_actionable.sh
在我的邮件中,我收到以下错误:
Message-Id: <[email protected]>
X-Authentication-Warning: ip-172-16-124-135.ec2.internal: ec2-user set sender to root using -f
From: [email protected] (Cron Daemon)
To: [email protected]
Subject: Cron <ec2-user@ip-172-16-124-135> cd /home/ec2-user/SageMaker && /bin/bash /home/ec2-user/SageMaker/churn_end_to_end_pipeling_actionable.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/ec2-user>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=ec2-user>
X-Cron-Env: <USER=ec2-user>
Traceback (most recent call last):
File "feature_engineering.py", line 9, in <module>
import seaborn as sns
ImportError: No module named seaborn
Traceback (most recent call last):
File "generate_churn_outputs_actionable.py", line 5, in <module>
from xgboost import XGBClassifier
ImportError: No module named xgboost
我不确定为什么我会遇到这个错误,因为我sudo -H pip install <package>
在运行 cron 作业之前就已经遇到过。
另外,这里是我的 bash 脚本及其引用的 python 脚本的内容:
重击:
#!/bin/bash
python feature_engineering.py
python generate_churn_outputs_actionable.py 1
脚本 1 和 2:
#! /home/ec2-user/anaconda3/envs/JupyterSystemEnv/bin/python
任何帮助都将不胜感激。此外,如果我遗漏了任何细节,请告诉我,我会添加。
答案1
我在 Ubuntu 18.04 上遇到了同样的问题,使用 crontab 中的显式路径不起作用。出于某种原因,cron 不起作用,而我帐户中的 sudo 起作用。我本以为它们会相同,但可惜它们不是。我得出的结论是,这是一个环境变量问题。
您可以通过运行以下命令模拟 sudo 中的 cron 问题:
sudo bash -c "HOME=FOO;python3 -c \"import xgboost\""
对于我来说,解决方法是让 crontab 调用一个 shell 脚本,然后执行 python 脚本。还必须设置家和python 路径环境变量:
crontab:
# Execute shell script and pipe stdout and stderr to a log file
# Which will enable you to see what's going on in real time
* * * * * <your_path>/yourscript.sh >> <your_path>yourscript_cron.log 2>&1
你的脚本.sh:
#!/bin/bash
echo yourscript.sh called: `date`
HOME=<your_home_dir>
PYTHONPATH=<path_to_dist_packages>
cd <path_to_your_python_script>
<python_executable> ./<your_python_script> 2>&1 1>/dev/null