2020年3月24日星期二

Linux crontab任务


在linux下有两种方法来让一个命令或者脚本执行:

crontab : 执行一个任务一次或者多次.
at : 只执行一次.
crontab是通过读取一个crontab文件来工作,这是一个普通的文本文件,里面列出了要执行的任务。每行都含有要指定的任务的命令、参数与选项,以及要执行任务的时间。(cron 软件在后台运行并且经常检查 /etc/crontab 文件。cron 软件也检查 /var/cron/tabs 目录,搜索新的 crontab 文件。这些 crontab 文件存储一些 cron 在特定时间执行任务的信息。)

crontab的基本格式:

* * * * * command

几个星号分别为:分 时 日 月 周,最后是要执行的命令。
分:0~59
时:0~23
日:1~31
月:1~12
周:0~6(0表示星期天)
除了数字还有几个个特殊的符号就是* / – :
* 代表所有的取值范围内的数字
/ 代表每的意思
*/5 表示每5个单位
– 代表从某个数字到某个数字
, 分开几个离散的数字
配置文件的一些例子:
0 3 * * * /root/test.sh         “每天凌晨3点执行test.sh文件“
* 23-7/1 * * * /root/lnmp restart       “晚上11点到早上7点之间,每隔一小时重启lnmp套件“
*/30 * * * * /usr/sbin/ntpdate            “每半小时同步一下时间“
0 23 * * 6 /lnmp restart                     “每星期六的11 : 00 pm重启重启lnmp套件。“
*/1 * * * * echo “i am running.”>>/tmp/running.txt           “每隔1分钟向/tmp/running.txt写一个”i am running.”字符串。“
0 0 1 1-12/3 *  root  ./etc/apache2/ssl/ssl.sh    “从1月到12月,每3个月的每月1日00:00执行./etc/apache2/ssl/ssl.sh文件。“

编辑
vim /etc/crontab

运行
编辑crontab保存后不会自动执行,必须通过重启cron才可以,命令如下:
启动/etc/init.d/cron start
关闭/etc/init.d/cron stop
重启/etc/init.d/cron restart


debian下执行定时任务及问题解决
一、安装crond
apt-get install cron

二、配置文件
1.常用的cron命令:
/etc/init.d/crond start   //启动
/etc/init.d/crond stop    //关闭
/etc/init.d/crond restart //重启

有的系统可能init.d目录下没有crond,只有cron,其实也一样,只不过把crond换为cron:

/etc/init.d/cron start   //启动
/etc/init.d/cron stop    //关闭
/etc/init.d/cron restart //重启

判断crond 是否在运行:pgrep crond或者pgrep cron,如果有在运行则返回进程号。
杀掉crond进程:pkill crond或者pkill cron,此法可用在关闭或重启不了cron的时候。
配置cron定时任务:crontab -e,配置文件路径一般为/var/spool/cron/crontabs/root
这个是root用户的配置文件,其它用户是对应的用户名命名的文件,所以配置定时任务也可以

vi /var/spool/cron/crontabs/root
进入编辑。
crontab -u<用户名称>
查看配置文件:crontab –l

2.下面讲如何配置定时任务
基本格式 :

* * * * * command

几个星号分别为:分 时 日 月 周,最后是要执行的命令。

分:0~59
时:0~23
日:1~31
月:1~12
周:0~6(0表示星期天)

配置文件的一些例子:

0 3 * * * /root/test.sh 每天凌晨3点执行test.sh文件
* 23-7/1 * * * /root/lnmp restart 晚上11点到早上7点之间,每隔一小时重启lnmp套件
*/30 * * * * /usr/sbin/ntpdate 每半小时同步一下时间
0 23 * * 6 /lnmp restart 每星期六的11 : 00 pm重启重启lnmp套件。
* */1 * * * /usr/bin/mutt -s "hello" test@seeke.net </home/content.txt 每隔1小时发送一封电子邮件。

3.几个特殊符号的含义
“*”代表取值范围内的数字,
“/”代表”每”,
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字

4.注意事项
很多朋友可能在用cron 的时候会遇到命令不执行的情况。遇到这种情况一般首先是检查cron有没有在运行,如果有在运行在重启一下cron,让它重新加载配置试试,再就是检查配置文件有没有格式错误,如果这些都没有问题,那我就讲下我是怎么处理的,把执行语句调频繁一些比如:

*/1 * * * * /root/test.sh

每分钟执行一次测试语句,看看任务有没有执行,如果有被执行,那就是软件,和配置文件都没有问题了,那很可能就是时间对不上的问题了的,比如时区不对,在我的实践中遇到,cron默认好像是按照天文时间来执行的,即使你的服务器时区是配置正确的也这样,不知为何,也可能是个例,比如我的时间是东8区,设定03:00点执行的命令,实际是11:00点执行的,这是也可以变通下,把时间+8设定为19:00,就可以达到03:00执行的目的了。

在 root 用户下输入 crontab -e  创建定时任务


三、出现错误问题:
crontab -e出现:

crontab: "/usr/bin/sensible-editor" exited with status 1

解决方法:

输入select-editr

出现

Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny


我们选择3,更改编辑器

Choose 1-4 [2]: 3