crontab系统自带的调度命令,通过crontab命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。
一、基本操作
查看 crontab 是否启动
sudo launchctl list | grep cron
crontab服务的重启,关闭,开启
mac系统下
sudo /usr/sbin/cron start
sudo /usr/sbin/cron restart
sudo /usr/sbin/cron stop
ubuntu:
$sudo /etc/init.d/cron start
$sudo /etc/init.d/cron stop
$sudo /etc/init.d/cron restart
centos:
$systemctl status crond.service 查看cron服务的启动状态
$systemctl start crond.service 启动cron服务[命令没有提示]
$systemctl stop crond.service 停止cron服务[命令没有提示]
$systemctl restart crond.service 重启cron服务[命令没有提示]
$systemctl reload crond.service 重新加载cron服务[命令没有提示]
crontab命令
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]
命令参数
-u user:用来设定某个用户的crontab服务;
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并导入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crontab文件时给确认提示。
# 使用-l参数列出crontab文件
crontab -l
# 使用-r参数删除crontab文件
crontab -r
# 追加 crontab 定时任务,每分钟触发,会已vim方式呈现
crontab -e
# 导入预先编好的脚本文件
crontab filename
crontab基本格式
* * * * * command
分 时 日 月 周 命令
第1列分钟0~59
第2列小时0~23(0表示子夜)
第3列日1~31
第4列月1~12
第5列星期0~7(0和7表示星期天)
第6列要运行的命令
例子
*/60 * * * * #每60分钟即每小时执行一次
*/100 * * * * #每100分钟执行一次
二、问题排查
报错1
默认情况下,crontab中执行的日志写在/var/log下,如:
ls /var/log/cron*
/var/log/cron
/var/log/cron.1
/var/log/cron.2
/var/log/cron.3
/var/log/cron.4
crontab 作为执行文件需要在 liunx 编写,如果在 windows 编写执行文件,会出现格式错误,导致定时任务不执行
crontab的日志比较简单,当crond执行任务失败时会给用户发一封邮件
在 /var/spool/mail/root 文件中,有crontab执行日志的记录,用tail -f /var/spool/mail/root 即可查看最近的crontab执行情况。
linux 清除/var/spool/mail/root日志存储
cat /dev/null>root
cat /dev/null>/var/spool/mail/root
报错2
no crontab for root
[root@localhost ~]# crontab -l
no crontab for root
这个问题非常简单,同样在 root 用户下输入 crontab -e
按 Esc 按: wq 回车
在输入 crontab -l 就没有问题了
三、实战
1.编写 .sh 文件
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/vim/bin:/root/bin
ttime=`date +"%Y-%m-%d %H:%M:%S"`
pppoe-stop
echo "关闭ip等待30s" $ttime
sleep 10s
ttime=`date +"%Y-%m-%d %H:%M:%S"`
pppoe-start
echo "启动ip等待5分钟" $ttime
sleep 2m
ttime=`date +"%Y-%m-%d %H:%M:%S"`
echo "docker jdmain 启动" $ttime
docker restart jdmain
sleep 15s
echo "docker jdmain 结束" $ttime
ttime=`date +"%Y-%m-%d %H:%M:%S"`
echo "docker jdmain_2 启动" $ttime
docker restart jdmain_2
sleep 15s
echo "docker jdmain_2 结束" $ttime
2.编写 定时任务,每半个小时执行一次
*/30 * * * * /root/data/script.sh
3.查询定时任务信息
[root@s251 data]# cat /var/spool/mail/root
From root@s251.localdomain Wed Oct 20 17:07:02 2021
Return-Path: <root@s251.localdomain>
X-Original-To: root
Delivered-To: root@s251.localdomain
Received: by s251.localdomain (Postfix, from userid 0)
id 3B79235DD31; Wed, 20 Oct 2021 17:07:02 +0800 (CST)
From: "(Cron Daemon)" <root@s251.localdomain>
To: root@s251.localdomain
Subject: Cron <root@s251> /root/data/script.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
Precedence: bulk
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20211020090702.3B79235DD31@s251.localdomain>
Date: Wed, 20 Oct 2021 17:00:01 +0800 (CST)
SIOCDELRT: No such process
关闭ip等待30s 2021-10-20 17:00:01
SIOCDELRT: No such process
SIOCDELRT: No such process
启动ip等待5分钟 2021-10-20 17:00:33
docker jdmain 启动 2021-10-20 17:05:41
jdmain
docker jdmain 结束 2021-10-20 17:05:41
docker jdmain_2 启动 2021-10-20 17:06:22
jdmain_2
docker jdmain_2 结束 2021-10-20 17:06:22
4.查询定时任务启动状态信息
[root@s251 data]# systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 三 2021-10-20 17:20:23 CST; 10min ago
Process: 7051 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 7043 (crond)
Tasks: 6
Memory: 3.1M
CGroup: /system.slice/crond.service
├─7043 /usr/sbin/crond -n
├─7272 /usr/sbin/CROND -n
├─7274 /bin/bash /root/data/script.sh
├─7290 /usr/sbin/sendmail -FCronDaemon -i -odi -oem -oi -t -f root
├─7292 /usr/sbin/postdrop -r
└─7304 sleep 2m
10月 20 17:20:23 s251 systemd[1]: Started Command Scheduler.
10月 20 17:20:23 s251 crond[7043]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 68% if used.)
10月 20 17:20:23 s251 crond[7043]: (CRON) INFO (running with inotify support)
10月 20 17:20:23 s251 crond[7043]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
10月 20 17:20:35 s251 systemd[1]: Reloading Command Scheduler.
10月 20 17:20:35 s251 systemd[1]: Reloaded Command Scheduler.
10月 20 17:21:01 s251 crond[7043]: (CRON) INFO (running with inotify support)
10月 20 17:30:01 s251 CROND[7273]: (root) CMD (/usr/lib64/sa/sa1 1 1)
10月 20 17:30:01 s251 CROND[7274]: (root) CMD (/root/data/script.sh)