ubuntu_系统定时任务crontab
ubuntu_系统定时任务crontab.
弄这个主要是为 笔记仓库 全自动化 更新生成 hexo站点 服务, 之前还需要 ssh 连上去执行脚本生成, 现在就让定时任务去定时生成.
前篇
- Ubuntu cron 定时执行任务 - https://www.jianshu.com/p/d6d8d9f7f60c
安装 定时任务
如果执行 service cron start
报错 cron: unrecognized service
, 则需要安装 cron
1 | root@ubuntu-2:~# apt install cron |
添加 定时任务
每分钟将时间追加写入 /tmp/testCron.txt 文件
1
2
3
4
5
6
7
8# crontab -e
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow command
*/1 * * * * date >> /tmp/testCron.txt重启 定时任务 服务
1
# service cron restart
然后就可以隔几分钟查看一下是否有写入进去
1
2
3
4
5# cat /tmp/testCron.txt
Sat Jun 8 11:12:01 UTC 2019
Sat Jun 8 11:13:01 UTC 2019
Sat Jun 8 11:14:01 UTC 2019
Sat Jun 8 11:15:01 UTC 2019测试发现如果是 echo 查看的话, 不会输出到控制台显示.
实例说明
1 | # m h dom mon dow command |
Minute Hour Day Month Dayofweek command
分钟 小时 天 月 天每星期 命令
每个字段代表的含义及取值范围如下:
Minute :分钟(0-59),表示每个小时的第几分钟执行该任务
Hour : 小时(1-23),表示每天的第几个小时执行该任务
Day : 日期(1-31),表示每月的第几天执行该任务
Month : 月份(1-12),表示每年的第几个月执行该任务
DayOfWeek : 星期(0-6,0代表星期天),表示每周的第几天执行该任务
Command : 指定要执行的命令(如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可以了,调用的时候记得写出命令的完整路径)
“*” ,代表所有的取值范围内的数字;
“/” , 代表”每”(“*/5”,表示每5个单位, 也就是 对 5 求余等于0的时间点, 也就是 0, 5, 10, 15 … 这些时间点)
- 比如
18 */7 * * * /root/gen_blog.sh
, 会在每天的 07:18:00, 14:18:00, 21:18:00 这些时间点执行
“-” , 代表从某个数字到某个数字(“1-4”,表示1-4个单位);
“,” ,分开几个离散的数字;
命令
1 | # service cron start /*启动服务*/ |
查看日志
- Ubuntu 下 Crontab 不生效 - https://blog.csdn.net/qq_28018283/article/details/78708058
如果系统没有安装 rsyslog 模块, 需要先安装
1
# apt install rsyslog
编辑配置, 去掉相关注释
1
2
3# vi /etc/rsyslog.d/50-default.conf
# 找到cron.log相关行,将前面注释符#去掉,保存退出,重启rsyslog:重启 rsyslog 服务
1
# service rsyslog restart
就可以查看到 日志 /var/log/cron.log
1
2
3# vi /var/log/cron.log
Jun 8 11:45:01 ubuntu-2 CRON[2709]: (root) CMD (/root/gen_blog.sh)
调试定时任务
设置为每分钟执行, 把日志输出到一个地方. 比如 执行 pic_download.sh 日志输出到 aaa.log
1 | */1 * * * * /my_git_repo/qiniuPicture/pic_download.sh >> /my_git_repo/qiniuPicture/aaa.log 2>&1 |
执行定时任务时一定要设置环境变量
如果不设置, 在 python 脚本中会获取不到环境变量
设置环境变量有两种方式
设置到用户目录下的 ~/.bash_profile 文件中. 推荐
1
2
3export LANG="zh_CN.utf-8"
export LC_CTYPE="zh_CN.utf-8"
export PYTHONIOENCODING="utf-8"执行的 shell 脚本 pic_download.sh
1
2
3
4#!/bin/bash
cd $(dirname ${BASH_SOURCE[0]})
source $HOME/.bash_profile
python3 pic_download.py设置到执行脚本之前 export 环境变量. 执行的 shell 脚本 pic_download.sh
1
2
3
4
5
6#!/bin/bash
cd $(dirname ${BASH_SOURCE[0]})
export LANG="zh_CN.utf-8"
export LC_CTYPE="zh_CN.utf-8"
export PYTHONIOENCODING="utf-8"
python3 pic_download.py
很多时候安装的程序也会找不到, 所以最好把系统的一些可执行文件所在的目录加入到 ~/.bash_profile 文件中, 如:
1 | # 为了 cron 而设, 很多安装的程序都会在这个路径下, 但 定时任务 获取不到, 就必须设置 |
秒级 定时任务
一般的守护进程都需要 秒级 的重启, 而定时任务最小单位时 分钟, 但可以通过机器实现 秒级 定时任务, 例如: 每 10 秒调用
1 | $ crontab -e # 编辑定时任务 |
如果多个脚本需要相同的秒级实现, 可以统一一个 执行 shell 脚本a, 把需要调用的其他 shell 脚本丢到 脚本a 中去调用, 脚本a 在定时任务中调用.
shell 添加进系统的环境变量
crontab 并不享有用户的 path, 所以执行 shell 脚本时, 必须在 shell 中添加进系统的环境变量.
先输出系统的 环境变量 PATH
1
2# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/bin在 shell 脚本加入 环境变量 PATH
1
2
3
4
5
6#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/bin
source $HOME/.bash_profile
cd $(dirname ${BASH_SOURCE[0]})
python3 refresh_blog_gen.py
踩坑
- 解决ubuntu下定时任务不执行问题 - https://blog.csdn.net/qfikh/article/details/78202449
- Linux中crontab的坑爹环境变量问题 - https://blog.csdn.net/Dancen/article/details/24355287
定时任务 中某个命令不执行
比如在自动生成 hexo 站点时, git 的命令执行了, 但是 hexo 相关命名没有执行
解决方法参考: hexo generate
not working with crontab
?
就是再 shell 脚本中, 加入 hexo 命令所在的路径, 如
1 | PATH=/usr/local/bin/:$PATH |
查看 hexo 命令所在路径
- ubuntu16.04查看软件的安装位置 - https://blog.csdn.net/AAA123524457/article/details/79103402
1 | root@ubuntu-2:~# whereis hexo |
定时任务中 python 获取不到环境变量
被这个坑的有点久, 最终参考这个解决: cronjob cannot find environment variables defined in .bashrc
参考: 执行定时任务时一定要设置环境变量
需要起一个中间 shell 脚本, 设置当前系统的环境变量 到 定时任务 中, 如: pic_download.sh
1 | # vi pic_download.sh |
这样在 python 就能获取到 $HOME/.bash_profile 中的变量
1 | import os |
定时任务中执行 python 报错: UnicodeEncodeError
python3 UnicodeEncodeError: ‘ascii’ codec can’t encode characters cron
参考: https://stackoverflow.com/questions/11735363/python3-unicodeencodeerror-only-when-run-from-crontab
识别不了中文编码, 执行 python 之前需要设置环境变量. 参考: 执行定时任务时一定要设置环境变量
1
2
3 export LANG="zh_CN.utf-8"
export LC_CTYPE="zh_CN.utf-8"
export PYTHONIOENCODING="utf-8"安装语言参考: ubuntu_相关.md 中的 显示中文乱码问题解决
执行 shell 不成功, 手动执行又没问题
基本就是环境变量问题, 在 shell 中执行时获取不到环境变量 or 程序
解决办法: 在 shell 开头加上环境变量配置即可
1 | #!/bin/bash |