crontab定时任务

20200424 做一个每天定时备份的任务,同时,删除若干天以前的历史文件,只是完成了 shell 脚本,在操作 crontab 的时候,发现还是有好多知识点!

我的环境:
ubuntu 20.04
ubuntu 18.04

1、cron 预备知识

  1. 最简单的 crontab 使用方式
    直接编辑 crontab 文件
    $ sudo vim /etc/crontab

  2. 查找 systemctl 的 cron 命令
    $ systemctl list-unit-files --type=service | grep cron
    返回结果

    cron.service                           enabled         enabled   
    
  3. 查看 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
    
  4. 重启 cron 服务
    sudo systemctl restart cron
    或者
    sudo service cron restart

  5. 查看当前用户的定时任务
    $ whoami
    dhbm

    $ crontab -l

     5,10,15,20,25,30,35,40,45,50,55 * * * * sh bakanddel.sh >/dev/null 2>&1
    
  6. 查看 root 的定时任务
    $ sudo crontab -u root -l

    no crontab for root
    
  7. 查看所有用户的定时任务
    网上大多是以下方式
    以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
    

2、查看 cron 活动日志

活动日志一般都在 /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 系统缺省是没有开启该日志服务

3、编写当前用户的定时任务

$ 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 

4、 使用 crontab -e 编写定时任务

  1. 首次运行 crontab -e 命令时,会弹出选项,让你选择一个编辑器

    $ sudo crontab -e
    no crontab for root - using an empty one

    Select an editor. To change later, run ‘select-editor’.

    1. /bin/nano <---- easiest
    2. /usr/bin/vim.basic
    3. /usr/bin/vim.tiny
    4. /bin/ed

    Choose 1-4 [1]: 2

  2. 加上 sudo 或加上 -u 选项,会产生不同用户的任务
    1). sudo crontab -e 编辑 root 的任务,
    为什么要使用 root 用户?有的任务必须 root 身份吗?

    2). crontab -e 编辑当前用户的任务

    3). sudo crontab -e -u wzh 编辑其他用户的任务

  3. 以上编辑的任务分别放在
    /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
    

5、 加载定时任务

  1. $ whoami
    dhbm

  2. 加载 dhbm 的定时任务
    $ crontab cron_dhbm

  3. 加载 wzh 的定时任务
    $ sudo crontab -u wzh cron_wzh

    或者,以 wzh 账号登录之后 $ crontab cron_

  4. 查询一下任务

    $ 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

6、 错误处理

  1. 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

  1. 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
    
  2. /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 里面的活动日志记录!

7 、 总结

  1. 如果任务必须 root 身份的话, 最好直接编写 root 账户的任务

  2. 如果是无需 root 身份的任务(例如:备份、删除),最好直接编写普通账户的任务

  3. 使用 crontab -e ,还是编写好单独的任务脚本再加载,看个人喜好!

你可能感兴趣的:(日常记录,运维记录)