背景
我用Python 写了一个自动获取数据库里的数据,然后将数据通过邮件发送,程序在本地是可以正常运行的,但是放在服务器上,一直不能正常发送邮件,经过排查后发现了好几处问题,现在都已经解决,先把排查的过程记录下:
自己定时任务设置的流程
- 将自己本地的代码打包上传到服务器上
- 新建sh文件,用来运行py文件
python3 /u1/ships_pass/auto_mail.py
3.新增定时列表中的任务
命令:crontab -e
0 9 * * mon sh /u1/ships_pass/auto_mail.sh
这里的地址最好写绝对地址
新增一个定时任务,我这里设置的是每周一上午9点自动运行,这部分的设置可以根据自己的需要进行更改
简单说明任务设置中,0 9 * * mon的含义:
第一位数字表示分钟
第二位表示小时,9表示9点执行
第三位表示日期,* 表示每天都执行
第四位表示月,*表示每个月都执行
第五位表示星期,mon表示每个周一,星期和第三位的日期不能同时设置。
正常情况下运行的顺序就是先执行cron中的定时任务,然后执行.sh文件,最后执行.py文件
了解了执行顺序,按照执行顺序进行排查就好了。
1.检查代码是否可以正常运行
先尝试直接运行.py文件
Python example.py
如果代码需要在指定的环境里运行,则先切换到该环境,然后运行代码
conda activate my_env
#my_env 为自己的运行环境
第一步成功后,则进入第二步
2.检查.sh文件是否有问题
切换到.sh的文件夹,运行.sh文件。
sh /u1/ships_pass/auto_mail.sh
这里需要注意,如果是用虚拟环境运行的py文件,则在.sh 中需要添加一行,让脚本运行前,先切换到虚拟环境中。
source /root/anaconda3/bin/activate base
python3 /u1/ships_pass/auto_mail.py
其中,/root/anaconda3/bin/activate 表示anaconda 安装的地址,可以用whereis查看,要把地址中的最后的anaconda 换成activate 。
base 是自己要切换的环境。
.sh 执行没有问题后,进入3步
3.检查cron定时任务列表有没有问题
查看cron 设定的任务有没有问题,主要查看:
(1)时间设置的对不对
(2)列表里执行的sh 文件地址对不对
经过这3个步骤检查后,大概率是可以查找到问题的,经过几次的布置,发现大部分的问题都可以在前两个检查的步骤里被解决。