美文网首页
4-13-4 Linux中的计划作业 --- crontab(四

4-13-4 Linux中的计划作业 --- crontab(四

作者: 捌千里路雲和月 | 来源:发表于2021-11-23 00:51 被阅读0次

1、/var/log/cron:记录了crontab 命令执行时有关信息的日志文件。

  • ①、查看 crontab 时的日志信息。
[root@localhost ~]# crontab -l    ## 查看当然用户(root)的 crontab 任务
no crontab for root
[root@localhost ~]# 
[root@localhost ~]# crontab -lu torres    ## 查看 torres 用户的 crontab 任务
no crontab for torres
[root@localhost ~]# 
[root@localhost ~]# tail /var/log/cron    ## 列出 cron 日志
Sep 30 14:06:12 localhost crontab[1544]: (root) END EDIT (root)
Sep 30 14:06:33 localhost crontab[1553]: (root) LIST (root)
Sep 30 14:06:56 localhost crontab[1563]: (root) LIST (root)
Sep 30 14:07:01 localhost crond[1004]: (root) RELOAD (/var/spool/cron/root)
Sep 30 14:07:01 localhost CROND[1567]: (root) CMD (date >> mydate.txt)
Sep 30 14:07:26 localhost crontab[1572]: (root) BEGIN EDIT (root)
Sep 30 14:07:30 localhost crontab[1572]: (root) END EDIT (root)
Sep 30 14:07:33 localhost crontab[1574]: (root) DELETE (root)
Sep 30 14:27:37 localhost crontab[1578]: (root) LIST (root)    ## <---- root 查看 crontab 的记录
Sep 30 14:31:54 localhost crontab[1584]: (root) LIST (torres)    ## <---- root 查看 torres 用户 crontab 的记录
[root@localhost ~]# 

  • ②、创建 crontab 时的日志信息。
[root@localhost ~]# crontab -e    ## 编辑当前用户(root)的 crontab 任务
no crontab for root - using an empty one

* * * * * date >> mydate.txt    ## 每分钟输出 date 到 mydate.txt 文件
                                                                                             
~                                                                                                      
~                                                                                                      
~                                                                                                      
:wq    ## 保存并退出

no crontab for root - using an empty one
crontab: installing new crontab
[root@localhost ~]# ll    ## 等待一分钟后,生成 mydate.txt 文件
total 4
-rw-r--r--. 1 root root 58 Sep 30 15:06 mydate.txt    ## <---- 生成的 mydate.txt
drwxr-xr-x. 4 root root 36 Sep 11 08:53 test
[root@localhost ~]# 
[root@localhost ~]# tail /var/log/cron    ## 列出 cron 日志
Sep 30 14:07:33 localhost crontab[1574]: (root) DELETE (root)
Sep 30 14:27:37 localhost crontab[1578]: (root) LIST (root)
Sep 30 14:31:54 localhost crontab[1584]: (root) LIST (torres)
Sep 30 15:01:01 localhost CROND[1599]: (root) CMD (run-parts /etc/cron.hourly)
Sep 30 15:01:01 localhost run-parts(/etc/cron.hourly)[1599]: starting 0anacron
Sep 30 15:01:01 localhost run-parts(/etc/cron.hourly)[1608]: finished 0anacron
Sep 30 15:03:42 localhost crontab[1610]: (root) BEGIN EDIT (root)    ## { ...
Sep 30 15:05:22 localhost crontab[1610]: (root) REPLACE (root)      ##  root 创建 crontab 的指令
Sep 30 15:05:22 localhost crontab[1610]: (root) END EDIT (root)    ## ...}
Sep 30 15:06:01 localhost CROND[1616]: (root) CMD (date >> mydate.txt)     ## <---- 执行 date >> mydate.txt 指令
[root@localhost ~]# 

[root@localhost ~]# crontab -eu torres     ## root 编辑 torres 用户的 crontab 任务
no crontab for torres - using an empty one
## 每分钟输出一句 root control torres 到 torres 的家目录,生成的文件是 crontabFiles.txt  
* * * * * echo "root control torres" >> crontabFiles.txt                                                                                              
~                                                                                                      
~                                                                                                      
~                                                                                                      
:wq

no crontab for torres - using an empty one
crontab: installing new crontab
[root@localhost ~]# 
[root@localhost ~]#
 
## --------- 等待 1 分钟后,torres 用户可以查看到  crontabFiles.txt 文件
[torres@localhost ~]$ 
[torres@localhost ~]$ ll
total 4
-rw-r--r--. 1 torres torres 40 Sep 30 15:22 crontabFiles.txt
[torres@localhost ~]$ 
[torres@localhost ~]$ cat crontabFiles.txt     ## 已有内容输出
root control torres
root control torres
[torres@localhost ~]$ 

## --------- root 用户列出 cron 日志
## 从日志前面两行可以看出 root 对 torres 进行了 crontab 的编辑以及完成了编辑。
## 剩下的 8 行分别列出了 root 的 crontab 和 torres 的 crontab 每分钟执行指令的情况。
[root@localhost ~]# 
[root@localhost ~]# tail /var/log/cron    ## 列出 cron 日志
Sep 30 15:20:18 localhost crontab[1674]: (root) REPLACE (torres)    
Sep 30 15:20:18 localhost crontab[1674]: (root) END EDIT (torres)
Sep 30 15:21:01 localhost CROND[1710]: (torres) CMD (echo "root control torres" >> crontabFiles.txt)
Sep 30 15:21:01 localhost CROND[1711]: (root) CMD (date >> mydate.txt)
Sep 30 15:22:01 localhost CROND[1718]: (root) CMD (date >> mydate.txt)
Sep 30 15:22:01 localhost CROND[1719]: (torres) CMD (echo "root control torres" >> crontabFiles.txt)
Sep 30 15:23:01 localhost CROND[1733]: (root) CMD (date >> mydate.txt)
Sep 30 15:23:01 localhost CROND[1734]: (torres) CMD (echo "root control torres" >> crontabFiles.txt)
Sep 30 15:24:01 localhost CROND[1743]: (root) CMD (date >> mydate.txt)
Sep 30 15:24:01 localhost CROND[1744]: (torres) CMD (echo "root control torres" >> crontabFiles.txt)

  • ③、删除 crontab 时的日志信息。
## torres 用户删除 crontab 任务
[torres@localhost ~]$ 
[torres@localhost ~]$ crontab -r
[torres@localhost ~]$ 

## root 用户删除 crontab 任务
[root@localhost ~]# crontab -r
[root@localhost ~]# 
[root@localhost ~]# tail /var/log/cron    ## 列出 cron 日志
Sep 30 15:28:01 localhost CROND[1792]: (torres) CMD (echo "root control torres" >> crontabFiles.txt)
Sep 30 15:28:01 localhost CROND[1793]: (root) CMD (date >> mydate.txt)
Sep 30 15:29:01 localhost CROND[1801]: (root) CMD (date >> mydate.txt)
Sep 30 15:29:01 localhost CROND[1802]: (torres) CMD (echo "root control torres" >> crontabFiles.txt)
Sep 30 15:30:01 localhost CROND[1811]: (torres) CMD (echo "root control torres" >> crontabFiles.txt)
Sep 30 15:30:01 localhost CROND[1810]: (root) CMD (date >> mydate.txt)
Sep 30 15:31:01 localhost CROND[1819]: (root) CMD (date >> mydate.txt)
Sep 30 15:31:01 localhost CROND[1820]: (torres) CMD (echo "root control torres" >> crontabFiles.txt)
Sep 30 15:31:14 localhost crontab[1824]: (torres) DELETE (torres)    ## <---- 删除了 torres 用户的 crontab 任务
Sep 30 15:31:24 localhost crontab[1826]: (root) DELETE (root)    ## <---- 删除了 root 用户的 crontab 任务
[root@localhost ~]# 


  • ④、编辑 /etc/crontab 时的 /var/log/cron 日志信息。
    root 用户编辑 /etc/crontab 制定每分钟输出 date 到 rootdate.txt 文件。
[root@localhost ~]# vim /etc/crontab 

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * * * * root date >> rootdate.txt
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq

  • /var/log/cron 记录如下:
[root@localhost ~]# tail /var/log/cron
## 系统加载  /etc/crontab
Oct 19 10:32:01 localhost crond[600]: (*system*) RELOAD (/etc/crontab)   
## 记录每次 root 执行了 date >> rootdate.txt 命令
Oct 19 10:32:01 localhost CROND[1789]: (root) CMD (date >> rootdate.txt)
Oct 19 10:33:01 localhost CROND[1795]: (root) CMD (date >> rootdate.txt)
Oct 19 10:34:01 localhost CROND[1800]: (root) CMD (date >> rootdate.txt)
Oct 19 10:35:01 localhost CROND[1807]: (root) CMD (date >> rootdate.txt)
Oct 19 10:36:01 localhost CROND[1813]: (root) CMD (date >> rootdate.txt)
Oct 19 10:37:01 localhost CROND[1818]: (root) CMD (date >> rootdate.txt)
Oct 19 10:38:01 localhost CROND[1825]: (root) CMD (date >> rootdate.txt)
Oct 19 10:39:01 localhost CROND[1830]: (root) CMD (date >> rootdate.txt)
Oct 19 10:40:01 localhost CROND[1839]: (root) CMD (date >> rootdate.txt)
[root@localhost ~]# 

  • 如 /etc/crontab 文件的指令错误,/var/log/cron 也会有记录。下面修改一下 /etc/crontab 文件,把指令中的 root 去除,也就是不指定用户执行命令。
[root@localhost ~]# 
[root@localhost ~]# vim /etc/crontab 

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * * * * date >> rootdate.txt    ## 没有指定用户
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq

## ---------- /var/log/cron 的记录如下:

[root@localhost ~]# tail /var/log/cron
Oct 19 10:39:01 localhost CROND[1830]: (root) CMD (date >> rootdate.txt)
Oct 19 10:40:01 localhost CROND[1839]: (root) CMD (date >> rootdate.txt)
Oct 19 10:41:01 localhost CROND[1845]: (root) CMD (date >> rootdate.txt)
Oct 19 10:42:01 localhost CROND[1850]: (root) CMD (date >> rootdate.txt)
Oct 19 10:43:01 localhost CROND[1872]: (root) CMD (date >> rootdate.txt)
Oct 19 10:44:01 localhost CROND[1877]: (root) CMD (date >> rootdate.txt)
## 系统加载  /etc/crontab
Oct 19 10:45:01 localhost crond[600]: (*system*) RELOAD (/etc/crontab)
## 提示报错 getpwnam() failed
Oct 19 10:45:01 localhost crond[600]: (date) ERROR (getpwnam() failed)
Oct 19 10:46:01 localhost crond[600]: (date) ERROR (getpwnam() failed)
Oct 19 10:47:01 localhost crond[600]: (date) ERROR (getpwnam() failed)
[root@localhost ~]# 
                                  
  • 修改一下 /etc/crontab 文件,把代表时间区间的 5 个 * 改为 4 个 *,看看 /var/log/cron 会怎么显示。
[root@localhost ~]# vim /etc/crontab 

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * * * root  date >> rootdate.txt    ## <---- 4 星号
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq

## ---------- /var/log/cron 的记录如下:

[root@localhost ~]# tail /var/log/cron
Oct 19 11:46:01 localhost crond[599]: (*system*) RELOAD (/etc/crontab)
Oct 19 11:46:02 localhost crond[599]: (CRON) bad day-of-week (/etc/crontab)    ## 提示 bad day-of-week 日期有问题
[root@localhost ~]# 

  • 修改一下 /etc/crontab 文件,把代表时间区间的 5 个 * 改为 3 个 *,看看 /var/log/cron 会怎么显示。
[root@localhost ~]# 
[root@localhost ~]# vim /etc/crontab 

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * * root  date >> rootdate.txt    ## <---- 3 星号
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq        

## ---------- /var/log/cron 的记录如下:

[root@localhost ~]# tail /var/log/cron
Oct 19 11:34:01 localhost crond[599]: (*system*) RELOAD (/etc/crontab)
Oct 19 11:34:01 localhost crond[599]: (CRON) bad month (/etc/crontab)    ## 提示 bad month (月份有问题)
[root@localhost ~]# 
                     
  • 修改一下 /etc/crontab 文件,把代表时间区间的 5 个 * 改为 2 个 *,看看 /var/log/cron 会怎么显示。
[root@localhost ~]# 
[root@localhost ~]# vim /etc/crontab 

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * root  date >> rootdate.txt    ## <---- 2 星号
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq

## ---------- /var/log/cron 的记录如下:

[root@localhost ~]# tail /var/log/cron
Oct 19 11:50:01 localhost crond[599]: (*system*) RELOAD (/etc/crontab)
Oct 19 11:50:01 localhost crond[599]: (CRON) bad day-of-month (/etc/crontab)    ## 提示 bad day-of-month 日期有问题
[root@localhost ~]# 

  • 修改一下 /etc/crontab 文件,把代表时间区间的 5 个 * 改为 1 个 *,看看 /var/log/cron 会怎么显示。
[root@localhost ~]# 
[root@localhost ~]# vim /etc/crontab 

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* root  date >> rootdate.txt    ## <---- 1 星号
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq

## ---------- /var/log/cron 的记录如下:

[root@localhost ~]# tail /var/log/cron
Oct 19 12:26:01 localhost crond[599]: (*system*) RELOAD (/etc/crontab)
Oct 19 12:26:01 localhost crond[599]: (CRON) bad hour (/etc/crontab)    ## 提示 bad hour (小时有问题)
[root@localhost ~]# 

  • 修改一下 /etc/crontab 文件,把代表时间区间的 5 个 * 全部不要,看看 /var/log/cron 会怎么显示。
[root@localhost ~]# vim /etc/crontab 

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
root  date >> rootdate.txt    ## 没有星号
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq 

## ---------- /var/log/cron 的记录如下:

[root@localhost ~]# tail /var/log/cron
Oct 19 12:31:01 localhost crond[599]: (*system*) RELOAD (/etc/crontab)
Oct 19 12:31:01 localhost crond[599]: (CRON) bad minute (/etc/crontab)     ## 提示 bad minute (分钟有问题)
[root@localhost ~]# 
                        
  • 综上测试记录,crontab 命令和 /etc/crontab 文件执行计划任务,/var/log/cron 都能查到对应的记录。针对不同的情况都会给出对应的提示。

2、/etc/crontab:配置文件

[root@localhost ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

[root@localhost ~]# 

  • ①、从配置文件中可以看到 # 号注释里也有对 5个 * 星号区间的解释。

  • ②、CentOS7 的 /etc/crontab 有 3 个配置文件,分别是:SHELL=/bin/bash、PATH=/sbin:/bin:/usr/sbin:/usr/bin、MAILTO=root

  • ③、SHELL=/bin/bash:系统使用的 SHELL,也就是系统使用的操作界面。这里是 bash。

  • ④、PATH=/sbin:/bin:/usr/sbin:/usr/bin:环境变量,crontab 可执行命令的范围。crontab 执行的命令都是从这几个路径中执行。如果命令不在这些环境当中,crontab 将不会执行。如自己编写的脚本不在环境变量当中,可把脚本的环境变量添加到 PATH 当中,也可以在编辑 crontab 任务时写上脚本的全路径再执行。

  • ④-①:例如,经常使用的 touch、echo、date...这些系统命令,可以通过 which 查看一下它们的路径。它们的路径都是 /usr/bin/ 下。这个路径在 crontab 的 PATH 当中。所以,当编辑 " * * * * * date >> mydate.txt " ,date 可用。

[root@localhost ~]# 
[root@localhost ~]# which touch
/usr/bin/touch
[root@localhost ~]# which echo
/usr/bin/echo
[root@localhost ~]# which date
/usr/bin/date
[root@localhost ~]# 

  • ④-②:假设 PATH 中没有的路径,/etc/crontab 即使设定了计划任务也不会执行。例如一些自定义的脚本。
[root@localhost ~]# 
[root@localhost ~]# vim /etc/crontab    ## 编辑 /etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin    ## <---- 假如没有脚本的路径,即使设置了 crontab 任务也不会执行
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed                                                                                  
~                                                                                                      
~                                                                                                      
~                                                                                                      
:wq    ## 保存并退出                                        
  • ④-③、自定义脚本在 /etc/crontab 计划没有指定路径。/etc/crontab 编辑计划指令后不能正常执行 crontab 指令时,系统会提示发了一封 mail 到 /var/spool/mail/ 下的用户目录。mail 的内容会记载指令执行时的信息,从中也有 command not found 命令未找到等相关信息。
    案例如下:
[root@localhost ~]# 
[root@localhost ~]# vim date.sh    ## 创建一个 date.sh 脚本

date >> mydate.txt    ## 内容:输出 date 到 mydate.txt 文件                                                                                      
~                                                                                                             
~                                                                                                             
~                                                                                                             
:wq    ## 保存并退出       

[root@localhost ~]# chmod 744 date.sh    ## date.sh 脚本文件增加拥有者 x 可执行权限 
[root@localhost ~]# 
[root@localhost ~]# ll
total 4
-rwxr--r--. 1 root root 19 Oct  1 10:53 date.sh    ## date.txt 拥有者已经有 x 可执行权限。
[root@localhost ~]# 
[root@localhost ~]# vim /etc/crontab    ## 编辑 /etc/crontab 文件

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * * * * root date.sh    ## root 用户每分钟执行 date.sh 脚本
~                                                                                        
~                                                                                        
~                                                                                        
~                                                                                        
~                                                                                        
:wq    ## 保存并退出

## 相隔一段时间,执行任意操作都会弹一条 
## " You have new mail in /var/spool/mail/root " 的信息。
[root@localhost ~]# date    
Fri Oct  1 11:01:36 CST 2021
You have new mail in /var/spool/mail/root    ## <---- 弹出发送 mail 的信息
[root@localhost ~]# 
[root@localhost ~]# ll    ## 此时,即使已经到了 crontab 指令执行的时间,也没有生成 mydate.txt 的文件
total 4
-rwxr--r--. 1 root root 19 Oct  1 10:53 date.sh
[root@localhost ~]# 

## 根据提示查看 /var/spool/mail/root 文件
[root@localhost ~]# tail /var/spool/mail/root 
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: <20211001030301.1001860003EE@localhost.localdomain>
Date: Fri,  1 Oct 2021 11:03:01 +0800 (CST)

## 发现有这么一条提示:没有找到 date.sh 命令。
/bin/sh: date.sh: command not found    

[root@localhost ~]# 
          
  • ④-④、遇到 crontab 不能执行脚本时,可以先单独调试一下脚本文件,看看能否运行起来。
[root@localhost ~]# ll    ## 现时 root 家目录下只有 date.sh 脚本文件,没有其他文件
total 4
-rwxr--r--. 1 root root 19 Oct  1 11:38 date.sh
[root@localhost ~]# 
[root@localhost ~]# ./date.sh    ## 当前目录下执行 date.sh 脚本文件 
[root@localhost ~]# 
[root@localhost ~]# ll
total 8
-rwxr--r--. 1 root root 19 Oct  1 11:38 date.sh
-rw-r--r--. 1 root root 29 Oct  1 12:29 mydate.txt    ## 生成了 mydate.txt 文件
[root@localhost ~]# 
[root@localhost ~]# cat mydate.txt    ## 查看 mydate.txt 可以正常输出 date 内容 
Fri Oct  1 12:29:06 CST 2021
[root@localhost ~]# 

  • 综上测试,单独调试 date.sh 脚本文件是没有问题的,能够正常输出。
  • ④-⑤、/etc/crontab 不能正常调用脚本文件,可以把脚本的全路径写到 /etc/crontab 中。
[root@localhost ~]# vim /etc/crontab    ## 编辑  /etc/crontab 文件

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * * * * root /root/date.sh    ## 把 date.sh 脚本文件的所在路径写全
~                                                                                        
~                                                                                        
~                                                                                        
~                                                                                        
~                                                                                        
:wq!    ## 保存并退出

[root@localhost ~]# ll    ## 稍等 crontab 的执行时间后,mydate.txt 已经成功生成
total 8
-rwxr--r--. 1 root root  19 Oct  1 11:38 date.sh
-rw-r--r--. 1 root root 203 Oct  1 13:15 mydate.txt    ## <---- 成功生成 mydate.txt 文件
[root@localhost ~]# 
[root@localhost ~]# cat mydate.txt    ## 查看 mydate.txt 已经有内容输出   
Fri Oct  1 13:09:01 CST 2021
Fri Oct  1 13:10:01 CST 2021
Fri Oct  1 13:11:01 CST 2021
Fri Oct  1 13:12:01 CST 2021
Fri Oct  1 13:13:01 CST 2021
Fri Oct  1 13:14:01 CST 2021
Fri Oct  1 13:15:01 CST 2021
[root@localhost ~]# 

  • ④-⑥、或者把执行文件 date.sh 的父路径都写到 /etc/crontab 的 PATH 环境变量中,这样在执行自定脚本的时候只需在命令行写上文件名 date.sh 也可以执行。
[root@localhost ~]# 
[root@localhost ~]# vim /etc/crontab 

SHELL=/bin/bash

## 把自定义脚本的父路径写到 PATH,案例路径是 root 目录下,所以在 PATH 中添加 :/root/
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/root/   
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * * * * root date.sh    ## date.sh 文件的路径写到了 PATH 后,命令行只需写上文件名 date.sh
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq    ##  保存并退出     


[root@localhost ~]# 
[root@localhost ~]# ll
total 8
-rwxr--r--. 1 root root 19 Oct 19 14:07 date.sh
-rw-r--r--. 1 root root 58 Oct 19 14:13 mydate.txt    ## <---- 稍等一段时间,成功生成 mydate.txt 文件
[root@localhost ~]#  
[root@localhost ~]# 
[root@localhost ~]# cat mydate.txt    ## 查看 mydate.txt 已经有内容输出 
Tue Oct 19 14:12:01 CST 2021
Tue Oct 19 14:13:01 CST 2021
[root@localhost ~]# 
                       
  • ⑤、MAILTO=root:发送邮件到给 root 用户。默认情况下,crontab 任务 如遇到执行失败会发送邮件到 /var/spool/mail/ 下对应用户名文件。(详情可以查看:4-13-2 Linux中的计划作业 --- crontab(三、maill 的去向))

3、/var/spool/cron:记录使用 crontab 命令的用户信息。

  • 当用户使用 crontab 命令来创建计划任务后,该任务就会记录到 /var/spool/cron 下以用户名为命名方式的目录中。
  • 例:
    现时 /var/spool/cron/ 目录下没有文件
[root@localhost ~]# cd /var/spool/cron/
[root@localhost cron]# ll
total 0

  • root 用户通过 crontab 命令分别为自身 和 普通用户 torres 创建计划任务。当创建完成后再到 /var/spool/cron/ 目录查看,就会有 root 和 torres 两个文件。
[root@localhost cron]# crontab -e    ## root 创建 crontab 计划任务
no crontab for root - using an empty one

* * * * * date >> rootdate.txt                                                                                                                                                 
~                                                                                      
~                                                                                      
~                                                                                      
:wq

[root@localhost cron]# crontab -eu torres    ## root 为 torres 创建计划任务
no crontab for torres - using an empty one

* * * * * date >> /home/torres                                                                       
~                                                                                      
~                                                                                      
~                                                                                      
:wq

## 计划任务创建完成后,/var/spool/cron/ 目录下有 root 和 torres 两个文件 
[root@localhost cron]# ll    
total 8
-rw-------. 1 root root 31 Oct 19 14:35 root
-rw-------. 1 root root 31 Oct 19 14:36 torres
[root@localhost cron]# 

  • 通过 cat 查看这两个文件的内容会发现就是刚才 crontab -e 编辑的内容。也就是说 crontab 命令就是调用 /var/spool/cron/ 目录下对应用户名的文件。
[root@localhost cron]# ll
total 8
-rw-------. 1 root root 31 Oct 19 14:35 root
-rw-------. 1 root root 31 Oct 19 14:36 torres
[root@localhost cron]# 
[root@localhost cron]# cat root 
* * * * * date >> rootdate.txt    ## root 编辑的内容
[root@localhost cron]# 
[root@localhost cron]# cat torres 
* * * * * date >> /home/torres    ## root 为 torres 编辑的内容
[root@localhost cron]# 

  • 实际上也可以通过编辑 /var/spool/cron/ 目录下对应用户名的文件进行命令的修改。
[root@localhost cron]# 
[root@localhost cron]# vim root    ## 编辑  /var/spool/cron/root 文件

* * * * * date >> rootdate.txt
* * * * * cal >> rootcal.txt     ## 增加一条,每分钟输出一次日历到 rootcal.txt 文件                                                                
~                                                                                      
~                                                                                      
~                                                                                      
:wq    

[root@localhost cron]# cd 
[root@localhost ~]# ll
total 16
-rwxr--r--. 1 root root   19 Oct 19 14:07 date.sh
-rw-r--r--. 1 root root 1653 Oct 19 15:08 mydate.txt
-rw-r--r--. 1 root root  300 Oct 19 15:08 rootcal.txt    ## 生成的 rootcal.txt 文件
-rw-r--r--. 1 root root  986 Oct 19 15:08 rootdate.txt
[root@localhost ~]# 
[root@localhost ~]# cat rootcal.txt    ## rootcal.txt 文件的内容 
    October 2021    
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
    October 2021    
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
[root@localhost ~]# 
                   
  • 当执行 crontab -r 的时候, /var/spool/cron/ 目录下的文件也会被删除。没有对应的用户名文件,就等于不会执行 crontab。
[root@localhost ~]# 
[root@localhost ~]# ll /var/spool/cron    ## 现时还有 root 和 torres 文件
total 8
-rw-------. 1 root root 60 Oct 19 15:06 root
-rw-------. 1 root root 31 Oct 19 14:36 torres
[root@localhost ~]# 
[root@localhost ~]# crontab -r    ## crontab -r 后删除了 root 文件
[root@localhost ~]# 
[root@localhost ~]# ll /var/spool/cron
total 4
-rw-------. 1 root root 31 Oct 19 14:36 torres    ## 只剩下 torres 文件
[root@localhost ~]# 
[root@localhost ~]# crontab -ru torres    ## crontab -ru 把 torres 也删除
[root@localhost ~]# 
[root@localhost ~]# ll /var/spool/cron/    ## /var/spool/cron/ 已经没有文件

total 0
[root@localhost ~]# 
[root@localhost ~]# crontab -l    ## 查看 root 自身已经没有 crontab 任务
no crontab for root
[root@localhost ~]# crontab -lu torres    ## 查看 torres 也已经没有 crontab 任务
no crontab for torres
[root@localhost ~]# 

  • 综上测试,用户使用了 crontab 命令后,他的任务会记录到 /var/spool/cron/用户名。另外,运行的每一项指令会被记录到 /var/log/cron 日志文件中。

4、crond 服务每分钟检测一次,所以 cron 线程会每分钟读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容。因此,当编辑完 /etc/crontab 与 /var/spool/cron 保存后,cron 的配置就会自动运行。

5、如果编辑完 /etc/crontab 或 执行 crontab 命令后没有马上执行计划任务,可以重启 systemctl restart crond.service,再观察执行情况。

[root@localhost ~]# 
[root@localhost ~]# systemctl restart crond.service
[root@localhost ~]# 

相关文章

网友评论

      本文标题:4-13-4 Linux中的计划作业 --- crontab(四

      本文链接:https://www.haomeiwen.com/subject/nhsenltx.html