我的环境:
ubuntu 20.04
ubuntu 18.04
最简单的 crontab 使用方式
直接编辑 crontab 文件
$ sudo vim /etc/crontab
查找 systemctl 的 cron 命令
$ systemctl list-unit-files --type=service | grep cron
返回结果
cron.service enabled enabled
查看 cron 服务状态
$ sudo systemctl status cron
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-06-24 09:53:56 CST; 40s ago
Docs: man:cron(8)
Main PID: 1341 (cron)
Tasks: 1 (limit: 4621)
Memory: 696.0K
CGroup: /system.slice/cron.service
└─1341 /usr/sbin/cron -f
重启 cron 服务
sudo systemctl restart cron
或者
sudo service cron restart
查看当前用户的定时任务
$ whoami
dhbm
$ crontab -l
5,10,15,20,25,30,35,40,45,50,55 * * * * sh bakanddel.sh >/dev/null 2>&1
查看 root 的定时任务
$ sudo crontab -u root -l
no crontab for root
查看所有用户的定时任务
网上大多是以下方式
以root用户执行
cut -d: -f1 /etc/passwd|xargs -i sudo crontab -u {} -l
返回全部 user 的定时任务,包含了大量的系统账户,如下:
no crontab for root
no crontab for daemon
no crontab for bin
......
no crontab for www-data
no crontab for backup
......
no crontab for nobody
no crontab for systemd-network
......
no crontab for sshd
no crontab for systemd-coredump
5,10,15,20,25,30,35,40,45,50,55 * * * * sh bakanddel.sh >/dev/null 2>&1
......
no crontab for wzh
其实,我们主要关心普通登录账户的定时任务
cd /var/spool/cron/
$ ll
total 20
drwxr-xr-x 5 root root 4096 Apr 23 15:34 ./
drwxr-xr-x 4 root root 4096 Apr 23 15:33 ../
drwxrwx--T 2 daemon daemon 4096 Apr 23 15:34 atjobs/
drwxrwx--T 2 daemon daemon 4096 Nov 13 2018 atspool/
drwx-wx--T 2 root crontab 4096 Jun 24 09:30 crontabs/
$ sudo ls crontabs/
可以看到,只有 2 个 账户
dhbm wzh
活动日志一般都在 /var/log/
但是,我这里看不到 cron 相关的文件,难道是在别处?或者是名字不对?抑或根本没有记录?
参考:
https://www.cnblogs.com/ahuo/p/11366704.html
抄录一下人家的博客:
1). 修改rsyslog
sudo vim /etc/rsyslog.d/50-default.conf
找到
cron.* /var/log/cron.log
#将cron前面的注释符去掉
2). 重启rsyslog
sudo service rsyslog restart
3). sudo service cron restart
4). 查看crontab日志
less /var/log/cron.log
原来,日志文件确实在 /var/log/cron.log,只是 ubuntu 系统缺省是没有开启该日志服务
$ cat cron_dhbm
# tasks of dhbm , run at each 5 min
5,10,15,20,25,30,35,40,45,50,55 * * * * echo task of dhbm `date '+%Y%m%d %T'` >> /home/dhbm/task.txt
$ cat cron_wzh
#tasks of wzh , run at each 3 min
0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57 * * * * echo "I am tasks by wzh 20200624 ,ruan at `date '+%Y%m%d %T'`" >> /home/dhbm/task.txt
后续的错误处理过程中,发现重定向 >> /home/dhbm/task.txt 是不响应的,而且会产生错误日志
所以,最后的重定向到 >/dev/null 2>&1
修改后的任务内容如下:
$ cat cron_dhbm
# tasks of dhbm , run at each 5 min
5,10,15,20,25,30,35,40,45,50,55 * * * * echo task of dhbm `date '+%Y%m%d %T'` >/dev/null 2>&1
$ cat cron_wzh
#tasks of wzh , run at each 3 min
0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57 * * * * echo "I am tasks by wzh 20200624 ,ruan at `date '+%Y%m%d %T'`" >/dev/null 2>&1
实际环境下的任务
接上一篇:
shell 备份并删除几日内的历史文件
$ cat task_dhbm
# tasks of dhbm , run at 6:05 ,23:05
5 6,23 * * * sh bakanddel.sh >/dev/null 2>&1
首次运行 crontab -e 命令时,会弹出选项,让你选择一个编辑器
$ sudo crontab -e
no crontab for root - using an empty one
Select an editor. To change later, run ‘select-editor’.
Choose 1-4 [1]: 2
加上 sudo 或加上 -u 选项,会产生不同用户的任务
1). sudo crontab -e 编辑 root 的任务,
为什么要使用 root 用户?有的任务必须 root 身份吗?
2). crontab -e 编辑当前用户的任务
3). sudo crontab -e -u wzh 编辑其他用户的任务
以上编辑的任务分别放在
/var/spool/cron 目录下
$ sudo ls crontabs/
dhbm root wzh
在这里查看任何用户(包括当前用户)的任务,都需要 sudo
$ sudo cat crontabs/root
$ sudo cat crontabs/dhbm
$ sudo cat crontabs/wzh
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (cron_wzh installed on Wed Jun 24 19:40:01 2020)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
#tasks of wzh , run at each 3 min
0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57 * * * * echo "I am tasks by wzh 20200624 ,ruan at `date '+%Y%m%d %T'`" >> /home/dhbm/task.txt
$ whoami
dhbm
加载 dhbm 的定时任务
$ crontab cron_dhbm
加载 wzh 的定时任务
$ sudo crontab -u wzh cron_wzh
或者,以 wzh 账号登录之后 $ crontab cron_
查询一下任务
$ crontab -l
# tasks of dhbm , run at each 5 min
5,10,15,20,25,30,35,40,45,50,55 * * * * echo task of dhbm `date '+%Y%m%d %T'`
$ sudo crontab -l -u wzh
#tasks of wzh , run at each 3 min
0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57 * * * * echo "I am tasks by wzh 20200624 ,ruan at `date '+%Y%m%d %T'`" >> /home/dhbm/task.txt
No MTA installed, discarding output
参考:
http://www.pooy.net/ubuntu-open-crontab-logging-and-resolution-no-mta-installed-discarding-output-problem.html
重点抄录如下:
crontab执行脚本时是不会直接错误的信息输出,而是会以邮件的形式发送到你的邮箱里,这时候就需要邮件服务器了,如果你没有安装邮件服务器,它就会报这个错。如果是测试,可以用下面的办法来解决:
在每条定时脚本后面加入:
>/dev/null 2>&1
就可以解决No MTA installed, discarding output的问题。
造成的原因:
我写的任务为了查看方便,在最后即自己上了 >> /home/dhbm/task.txt
pam_unix(cron:session): session closed for user root
自己想试试怎么清空 cron.log
使用 sudo echo “” > /var/log/cron.log 总是失败
然后,就直接 sudo rm /var/log/cron.log
之后,就悲剧了!
/var/log/cron.log 死活不再产生新的记录了
sudo touch /var/log/cron.log 之后,也无济于事
$ sudo systemctl status cron
查看状态时发现以下错误
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-06-24 09:53:56 CST; 40s ago
Docs: man:cron(8)
Main PID: 1341 (cron)
Tasks: 1 (limit: 4621)
Memory: 696.0K
CGroup: /system.slice/cron.service
└─1341 /usr/sbin/cron -f
Jun 24 09:53:56 ubuntu2004-203 systemd[1]: Started Regular background program processing daemon.
Jun 24 09:53:56 ubuntu2004-203 cron[1341]: (CRON) INFO (pidfile fd = 3)
Jun 24 09:53:56 ubuntu2004-203 cron[1341]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
Jun 24 09:54:01 ubuntu2004-203 CRON[1356]: pam_unix(cron:session): session opened for user wzh by (uid=0)
Jun 24 09:54:01 ubuntu2004-203 CRON[1365]: (wzh) CMD (echo "I am tasks by wzh 20200624 ,ruan at `date '+)
Jun 24 09:54:01 ubuntu2004-203 CRON[1356]: (CRON) info (No MTA installed, discarding output)
Jun 24 09:54:01 ubuntu2004-203 CRON[1356]: pam_unix(cron:session): session closed for user wzh
参考:
https://blog.csdn.net/u010433704/article/details/103079928
抄录并翻译一下:
1). cd /etc/pam.d
sudo vim common-session-noninteractive
2). 找到以下内容
session required pam_unix.so
3). 在这一行之前加入一行:
session [success=1 default=ignore] pam_succeed_if.so service in cron quiet use_uid
4). 重启 cron 服务
sudo service cron restart
/var/log/cron.log 总是空 ( 死活不再产生新的记录 )
解决路线:
1). 想到可能是 cron.log 并不属于 root,也不属于当前用户
2). 但是,rm 之前没有注意到,也没有记录!
3). 尝试找了另外一台服务器,同样方式修改 rsyslog 之后,对比!
4). 另一台服务器准备好之前,想到反向操作一次,即:再次 rm /var/log/cron.log ,复原前面修改的 rsyslog ,并重启 cron 服务
5). 实在拿不准,干脆 reboot 之后,再来查看
6). 终于找到了问题所在
$ cd /var/log
$ ll cron*
-rw-r----- 1 syslog adm 366 Jun 24 18:51 cron.log
原来,这个 cron.log 属于 adm 组的 syslog 用户
$ cat /etc/passwd |grep syslog
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
$ cat /etc/group |grep adm
adm:x:4:syslog,dhbm
7). 这就简单了,重复一次前面的操作,然后,就看到了 cron.log 里面的活动日志记录!
如果任务必须 root 身份的话, 最好直接编写 root 账户的任务
如果是无需 root 身份的任务(例如:备份、删除),最好直接编写普通账户的任务
使用 crontab -e ,还是编写好单独的任务脚本再加载,看个人喜好!