4-13-1 Linux中的计划作业 --- crontab(二、/etc/crontab 文件操作)

  • 4-13 记录了用 crontab 命令创建计划任务。这节 4-13-1 记录用 /etc/crontab 配置文件创建计划任务。
  • 学习 /etc/crontab 配置文件创建计划任务。
  • 一、/etc/crontab 配置文件的内容。
[root@localhost ~]# vim /etc/crontab    ## 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    ## <---- 命令格式模板

~                                                                                                      
~                                                         
  • 有 3 个变量,分别是:SHELL=/bin/bash、PATH=/sbin:/bin:/usr/sbin:/usr/bin、MAILTO=root

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

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

  • ③、MAILTO=root:发送邮件到给 root 用户。当 /etc/crontab 文件中的命令发生错误时,邮件会发送到 root。可以将这个 mail 改成外置帐号。

  • ④、文档中最后一行是命令格式模板:* * * * * user-name command to be executed

命令格式 图解
  • 二 、 /etc/crontab 文档的权限是 -rw-r--r-- ,正常情况下不要修改权限。必须用 root 的身份编辑这个文件。


    /etc/crontab 文档的权限

  • 三、/etc/crontab 文件制定计划任务实例:
  • ①、制定 root 用户每分钟输出 date 到 mydate.txt 文件。
  • vim 编辑 /etc/crontab,输入 * * * * * root date >> mydate.txt,wq! 保存文件。
[root@localhost ~]# 
[root@localhost ~]# vim /etc/crontab    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 >> mydate.txt    ## <---- 输入的内容                                                                  
~                                                                                                      
~                                                                                                      
~                                                                                                      
:wq                                        
* * * * * root date >> mydate.txt 命令图解
  • 等待一段时间后 ll 查看 root 目录已有 mydate.txt 文件。cat 可以查看到 dete 每一分钟输出的数据
[root@localhost ~]# ll
total 4
-rw-r--r--. 1 root root 522 Oct  8 13:30 mydate.txt
[root@localhost ~]# 
[root@localhost ~]# cat mydate.txt 
Fri Oct  8 13:13:01 CST 2021
Fri Oct  8 13:14:01 CST 2021
Fri Oct  8 13:15:02 CST 2021
Fri Oct  8 13:16:01 CST 2021
Fri Oct  8 13:17:01 CST 2021
Fri Oct  8 13:18:01 CST 2021
Fri Oct  8 13:19:01 CST 2021
Fri Oct  8 13:20:01 CST 2021
Fri Oct  8 13:21:01 CST 2021
Fri Oct  8 13:22:01 CST 2021
Fri Oct  8 13:23:01 CST 2021
Fri Oct  8 13:24:01 CST 2021
Fri Oct  8 13:25:01 CST 2021
Fri Oct  8 13:26:01 CST 2021
Fri Oct  8 13:27:01 CST 2021
Fri Oct  8 13:28:01 CST 2021
Fri Oct  8 13:29:01 CST 2021
Fri Oct  8 13:30:01 CST 2021
[root@localhost ~]# 

## crontab -l 查看不到 /etc/cronta 配置文件制定的 crontab 计划任务
[root@localhost ~]# crontab -l    
no crontab for root
[root@localhost ~]# 

  • 值得留意的是 /etc/cronta 配置文件制定的计划任务,用 crontab -l 查看不到制定的内容。 /etc/cronta 配置文件 和 crontab 命令不是同一模式的制定方式。

  • ②、制定 torres 普通用户每 5 分钟在自家目录下创建一个 root-directory 目录。
[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 >> mydate.txt
*/5 * * * * torres touch root-directory     ## <---- 输入的内容   
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq                                          
  • torres 用户每隔 5 分钟生成一个 root-directory,由于同名目录所以每生成一次,时间会更新一次。
[torres@localhost ~]$ ll
total 0
-rw-r--r--. 1 torres torres 0 Oct  8 15:15 root-directory
[torres@localhost ~]$ ll
total 0
-rw-r--r--. 1 torres torres 0 Oct  8 15:20 root-directory
[torres@localhost ~]$ ll
total 0
-rw-r--r--. 1 torres torres 0 Oct  8 15:25 root-directory
[torres@localhost ~]$ ll
total 0
-rw-r--r--. 1 torres torres 0 Oct  8 15:30 root-directory
[torres@localhost ~]$ 


③、用脚本形式制定 user1 普通用户每 2 分钟输出一次 date 到 user1date.txt 文件。

  • vim 编辑脚本文件 user1.txt。输入 date >> user1date.txt。
[root@localhost ~]# 
[root@localhost ~]# vim user1.sh    ## vim 编辑 user1.sh 脚本    

date >> user1date.txt    ## 脚本内容:输出 date 到 user1date.txt 文件                                                                              
~                                                                                                 
~                                                                                                 
~                                                                                                 
:wq!       
                   
[root@localhost ~]# ll
total 4
-rw-r--r--. 1 root root 22 Oct 11 16:25 user1.sh      ## 脚本文件
[root@localhost ~]# 
         
  • 新建出来的 user1.sh 脚本文件没有 x 执行权限。需要赋予 x 执行权限。755,拥有者具有对文件的可读、可写、可执行三种权限,所属组 和 其他人具有可读、可执行的权限。
[root@localhost ~]# 
[root@localhost ~]# ll
total 4
-rw-r--r--. 1 root root 22 Oct 11 16:25 user1.sh
[root@localhost ~]# 
[root@localhost ~]# chmod 755 user1.sh 
[root@localhost ~]# 
[root@localhost ~]# ll
total 4
-rwxr-xr-x. 1 root root 22 Oct 11 16:25 user1.sh    # 拥有者、所属组、其他人都具有可执行权限
[root@localhost ~]# 

  • vim 编辑 /etc/crontab 文件。输入 */2 * * * * user1 /root/user1.sh。值得注意的是,user1 调用 user1.sh 脚本文件时,需要把全路径写上。因为 PATH=/sbin:/bin:/usr/sbin:/usr/bin 环境变量没有配置自定义脚本的路径,如果不写上全路径,程序会找不到可执行的脚本文件而导致调用失败。
[root@localhost ~]# 
[root@localhost ~]# vim /etc/crontab    ## 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
*/2 * * * * user1 /root/user1.sh    ## user1 用户每两分钟调用一次 root 的 user1.sh 脚本
~                                                                                      
~                                                                                      
~                                                                                      
:wq!    ## 保存并退出                                
  • 等待一段时间, user1 用户下并没有出现 user1date.txt 文件。
user1@localhost ~]$ 
[user1@localhost ~]$ ll    ## user1 家目录没有文件
total 0
[user1@localhost ~]$ 

  • 切换到 root 目录查看原因,随意输入内容就会弹出一句 You have new mail in /var/spool/mail/root 。这种情况一般是 /etc/crontab 内的指令发生错误时,会将错误信息发送到 /var/spool/mail/root。它会根据指令设定的执行时限作为反馈,也就是指令每分钟执行一次脚本,那么只要有错误时,每分钟执行完指令都会反馈一次 You have new mail in /var/spool/mail/root 。
## 每分钟按 enter 回车键都会收到提示信息
[root@localhost ~]# 
You have new mail in /var/spool/mail/root
[root@localhost ~]# 
You have new mail in /var/spool/mail/root
[root@localhost ~]# 
You have new mail in /var/spool/mail/root
[root@localhost ~]# 

  • tail 查看 /var/spool/mail/root 最后 10 行信息。得到 /bin/bash: /root/usr1.sh: Permission denied 没有访问 /root/user1.sh 的权限。
[root@localhost ~]# 
[root@localhost ~]# tail /var/spool/mail/root 
X-Cron-Env: 
X-Cron-Env: 
X-Cron-Env: 
X-Cron-Env: 
X-Cron-Env: 
Message-Id: <[email protected]>
Date: Mon, 11 Oct 2021 17:00:01 +0800 (CST)

/bin/bash: /root/user1.sh: Permission denied    ## 没有 /root/user1.sh 权限

[root@localhost ~]# 

  • 虽然 user1.sh 已经设置了权限为其他人有 x 可执行权限。但它的路径是在 root 目录下。root 目录的权限是 dr-xr-x---,对于其他人没有任何权限。所以当 user1 用户调用 /root/user1.sh 会提示没有权限。
[root@localhost ~]# ll
total 4
-rwxr-xr-x. 1 root root 22 Oct 11 16:25 user1.sh
[root@localhost ~]# pwd
/root
[root@localhost ~]# 
[root@localhost ~]# ll /
total 20
lrwxrwxrwx.   1 root root    7 Mar 22  2021 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 Jun 17 09:37 boot
drwxr-xr-x.   3 root root   20 Mar 18  2021 data
drwxr-xr-x.  19 root root 3160 Oct 11 08:32 dev
drwxr-xr-x.  90 root root 8192 Oct 11 17:03 etc
drwxr-xr-x.   2 root root    6 Jun 29 11:22 fdfsd
drwxr-xr-x.   5 root root   42 Oct 11 15:21 home
lrwxrwxrwx.   1 root root    7 Mar 22  2021 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Mar 22  2021 lib64 -> usr/lib64
drwxr-xr-x.   3 root root   19 Apr  2  2021 media
drwxr-xr-x.   5 root root   42 Mar 22  2021 mnt
drwxr-xr-x.   5 root root   45 Jul 23 11:09 opt
dr-xr-xr-x. 151 root root    0 Oct 11 08:31 proc
dr-xr-x---.   3 root root  187 Oct 11 17:03 root    ## <---- root 目录的其他人项中没有任何权限
drwxr-xr-x.  25 root root  720 Oct 11 08:32 run
lrwxrwxrwx.   1 root root    8 Mar 22  2021 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root    0 Oct 11 08:31 sys
drwxr-xr-x.   2 root root    6 Jun 29 11:26 test目录分别创建
drwxr-xr-x.   2 root root    6 Jun 29 11:27 test目录分别创建demo1,demo2,demo3三个文件夹
drwxrwxrwt.  12 root root 4096 Oct 11 17:06 tmp
drwxr-xr-x.  13 root root  155 Mar 22  2021 usr
drwxr-xr-x.  19 root root  267 Mar 22  2021 var
drwxr-xr-x.   2 root root    6 Jun 29 11:22 新建一个test文件夹
[root@localhost ~]# 

  • 通过 user1 用户访问 root 目录时,得以证实没有权限访问。
[user1@localhost ~]$
[user1@localhost ~]$ ll /root/
ls: cannot open directory /root/: Permission denied
[user1@localhost ~]$ 

  • 把 user1.sh 文件 mv 剪贴到 /home/user1/ 目录下,也就是 user1 的家目录。然后 vim /etc/crontab 修改 user1.sh 的路径。
[root@localhost ~]# 
[root@localhost ~]# ll
total 4
-rwxr-xr-x. 1 root root 22 Oct 11 16:25 user1.sh
[root@localhost ~]# 
[root@localhost ~]# mv user1.sh /home/user1/    ## 剪贴 user1.sh 到 /home/user1/ 目录下
[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
*/2 * * * * user1 /home/user1/user1.sh    ## 修改 user1.sh 的路径
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq    ## 保存并退出
                               
  • 等待几分钟,user1 用户已经生成了 user1date.txt 文件,通过 cat 查看文件内容是 /etc/crontab 制定的每 2 分钟输出一次 date。
## user1 用户
[user1@localhost ~]$ 
[user1@localhost ~]$ ll
total 8
-rw-r--r--. 1 user1 user1 29 Oct 11 17:10 user1date.txt
-rwxr-xr-x. 1 root  root  22 Oct 11 16:25 user1.sh
[user1@localhost ~]$ 
[user1@localhost ~]$ cat user1date.txt 
Mon Oct 11 17:10:01 CST 2021
Mon Oct 11 17:12:01 CST 2021
[user1@localhost ~]$ 

  • root 用户也可以访问 /home/user1/ 目录下的 user1date.txt 文件。
## root 用户
[root@localhost ~]# 
[root@localhost ~]# ll /home/user1/
total 8
-rw-r--r--. 1 user1 user1 58 Oct 11 17:12 user1date.txt
-rwxr-xr-x. 1 root  root  22 Oct 11 16:25 user1.sh
[root@localhost ~]# 
[root@localhost ~]# cat /home/user1/user1date.txt 
Mon Oct 11 17:10:01 CST 2021
Mon Oct 11 17:12:01 CST 2021
[root@localhost ~]# 

  • 以上例子主要记录了 /etc/crontab 制定命令时,执行的用户指定为普通用户。

④、同样的原理,普通用户编写的脚本文件,root 用户编辑 /etc/crontab 时也可以调用脚本文件。

  • user1 用户编写脚本,输出 "i am user1" 到 /home/user1/user1.txt 文件
[user1@localhost ~]$ ll
total 0
[user1@localhost ~]$ vim user1.sh

echo "i am user1" >> /home/user1/user1.txt    ## 输入的内容
                                                                                                                                                                   
~                                                                                      
~                                                                                      
~                                                                                      
:wq    ## 保存并退出

[user1@localhost ~]$ ll
total 4
-rw-rw-r--. 1 user1 user1 41 Oct 12 11:39 user1.sh    ## 生成的 user1.sh 文件
[user1@localhost ~]$ 

  • user1 用户编辑 /etc/crontab 文件,由于权限问题不能保存文件。
[user1@localhost ~]$ 
[user1@localhost ~]$ vim /etc/crontab    ## user1 用户编辑  /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
* * * * * user1 /home/user1/user1.sh
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
"/etc/crontab"
"/etc/crontab" E212: Can't open file for writing    ## 保存的时候提示无法打开文件写入,只能 q! 退出 
Press ENTER or type command to continue
                  
  • /etc/crontab 文件权限 -rw-r--r--,只有 root 用户可以进行读写。
[user1@localhost ~]$ 
[user1@localhost ~]$ ll /etc/crontab 
-rw-r--r--. 1 root root 488 Oct 12 11:46 /etc/crontab    ## 除 root 外,其他人没有写 /etc/crontab 的权限
[user1@localhost ~]$ 

  • user1.sh 文件权限 -rw-rw-r--,拥有者、所属组、其他人都没有 x 执行权限。需要拥有者能够有执行权限,chmod u+x 增加拥有者 x 执行权限。文件拥有者为 user1 用户。
[root@localhost ~]# ll /home/user1/
total 4
-rw-rw-r--. 1 user1 user1 41 Oct 12 11:39 user1.sh
[root@localhost ~]# 
[root@localhost ~]# chmod u+x /home/user1/user1.sh    ## user1.sh 文件拥有者添加 x 执行权限
[root@localhost ~]# 
[root@localhost ~]# ll /home/user1/user1.sh 
-rwxrw-r--. 1 user1 user1 41 Oct 12 11:39 /home/user1/user1.sh

  • root 用户编辑 /etc/crontab 文件。
[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
* * * * * user1 /home/user1/user1.sh    ## 执行用户是 user1,调用 /home/user1/user1.sh 脚本

~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq    ## 保存并退出                              
  • 稍等一会,user1 用户的家目录已经生成 user1.txt 文件。cat user.txt 也可以看到正确输出。
[user1@localhost ~]$ ll
total 8
-rwxrw-r--. 1 user1 user1 43 Oct 12 13:48 user1.sh
-rw-r--r--. 1 user1 user1 33 Oct 12 13:54 user1.txt
[user1@localhost ~]$ 
[user1@localhost ~]$ cat user1.txt
i am user1
i am user1
i am user1
[user1@localhost ~]$ 

  • 以上例子主要记录了普通用户编写的脚本文件,需要通过 root 编辑 /etc/crontab 文件进行调用。普通用户没有编辑 /etc/crontab 文件的权限。

⑤、添加脚本的路径到 /etc/crontab 的环境变量,制定执行命令时不需要写全路径。

[root@localhost ~]# 
[root@localhost ~]# vim rootdate.sh    ## root 用户创建 rootdate.sh 脚本

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

[root@localhost ~]# 
[root@localhost ~]# vim /etc/crontab    ## 编辑  /etc/crontab 文件

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/root/    ## 把脚本文件的父路径写到环境变量中,:/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 rootdate.sh    ## 脚本的父路径已经添加到环境变量,这里只需要写脚本名。
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq    ## 保存并退出                         
  • 稍等一会,root 的家目录如期生成 rootdate.txt 文件。cat 可以查看到预期每隔一分钟 date 的输出。
[root@localhost ~]# 
[root@localhost ~]# ll
total 8
-rwxr--r--. 1 root root  21 Oct 13 08:56 rootdate.sh
-rw-r--r--. 1 root root 319 Oct 13 09:08 rootdate.txt    ## 生成的 rootdate.txt    
[root@localhost ~]# 
[root@localhost ~]# cat rootdate.txt    ## rootdate.txt 内容 
Wed Oct 13 08:58:01 CST 2021
Wed Oct 13 08:59:01 CST 2021
Wed Oct 13 09:00:01 CST 2021
Wed Oct 13 09:01:01 CST 2021
Wed Oct 13 09:02:01 CST 2021
Wed Oct 13 09:03:02 CST 2021
Wed Oct 13 09:04:01 CST 2021
Wed Oct 13 09:05:01 CST 2021
Wed Oct 13 09:06:01 CST 2021
Wed Oct 13 09:07:01 CST 2021
Wed Oct 13 09:08:01 CST 2021
Wed Oct 13 09:09:01 CST 2021
[root@localhost ~]# 


⑥、编辑 /etc/crontab 文件,多用户输出。

  • 登录 root 用户 和 3 个普通用户 (user1、torres、x)


    多用户登录界面
  • 编辑 /etc/crontab
[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    ## <---- root 用户每分钟输出 date 到 rootdate.txt

* * * * * user1 date >> user1date.txt     ## <---- user1 用户每分钟输出 date 到 user1date.txt

* * * * * torres date >> torresdate.txt    ## <---- torres 用户每分钟输出 date 到 torresdate.txt

* * * * * x date >> xdate.txt     ## <---- x 用户每分钟输出 date 到 xdate.txt

:wq!                                                         
  • 稍等几分钟,通过 cat 查看各用户文件的输出情况


    各用户输出情况

⑦、用脚本完成输出数据到不同用户的家目录。

  • vim 编辑各用户脚本。内容都是每分钟输出 date 到指定的用户文件。
## root 用户脚本
[root@localhost ~]# vim rootdate.sh

date >> rootdate.txt    ## 输出 date 到 root 用户家目录下,生成 rootdate.txt 记录数据                                                                        
~                                                                                      
~                                                                                      
~                                                                                      
:wq!                  
## user1 用户脚本
[root@localhost ~]# vim user1date.sh

date >> /home/user1/user1date.txt     ## 输出 date 到 user1 用户家目录下,生成 user1date.txt 记录数据                                                          
~                                                                                      
~                                                                                      
~                                                                                      
:wq!                                 
## torres 用户脚本
[root@localhost ~]# vim torresdate.sh

date >> /home/torres/torresdate.txt    ## 输出 date 到 torres 用户家目录下,生成 torresdate.txt 记录数据                                                                
~                                                                                      
~                                                                                      
~                                                                                      
:wq!

## x 用户脚本
[root@localhost ~]# vim xdate.sh    

date >> /home/x/xdate.txt    ## 输出 date 到 x 用户家目录下,生成 xdate.txt 记录数据                                                                  
~                                                                                      
~                                                                                      
~                                                                                      
:wq!

  • 新建的脚本文件没有 x 执行权限。
[root@localhost ~]# 
[root@localhost ~]# ll
total 16
-rw-r--r--. 1 root root 21 Oct 13 15:34 rootdate.sh
-rw-r--r--. 1 root root 23 Oct 13 15:35 torresdate.sh
-rw-r--r--. 1 root root 22 Oct 13 15:35 user1date.sh
-rw-r--r--. 1 root root 18 Oct 13 15:36 xdate.sh
[root@localhost ~]# 

  • 为脚本创建拥有者 x 的执行权限,拥有者为 root。
## 所有脚本权限 u 拥有者添加 x 执行权限
[root@localhost ~]# 
[root@localhost ~]# chmod u+x rootdate.sh    ## 添加文件拥有者 x 可执行权限 
[root@localhost ~]# chmod u+x torresdate.sh 
[root@localhost ~]# chmod u+x user1date.sh 
[root@localhost ~]# chmod u+x xdate.sh 
[root@localhost ~]# 
[root@localhost ~]# ll
total 16
-rwxr--r--. 1 root root 21 Oct 13 15:34 rootdate.sh    ## 拥有者已具有可执行权限
-rwxr--r--. 1 root root 23 Oct 13 15:35 torresdate.sh
-rwxr--r--. 1 root root 22 Oct 13 15:35 user1date.sh
-rwxr--r--. 1 root root 18 Oct 13 15:36 xdate.sh
[root@localhost ~]# 

  • root 用户 vim 编辑 /etc/crontab,调用对应的用户脚本。注:这次把脚本文件的父路径添加到 PATH 环境变量当中,所以调用时只需写脚本名。
[root@localhost ~]# 
[root@localhost ~]# vim /etc/crontab 

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/root/    ## 脚本的父路径添加到环境变量中 :/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 rootdate.sh    ## 只需写脚本文件名
* * * * * root torresdate.sh
* * * * * root user1date.sh
* * * * * root xdate.sh
~                                                                                      
~                                                                                      
:wq    ## 保存并退出      
                  
  • 脚本调用成功后,各用户的家目录下会生成对应的文件记录 date 数据。
## root 家目录
[root@localhost ~]# ll
total 20
-rwxr--r--. 1 root root  21 Oct 13 15:34 rootdate.sh
-rw-r--r--. 1 root root 174 Oct 13 15:59 rootdate.txt
-rwxr--r--. 1 root root  36 Oct 13 15:45 torresdate.sh
-rwxr--r--. 1 root root  34 Oct 13 15:45 user1date.sh
-rwxr--r--. 1 root root  26 Oct 13 15:46 xdate.sh
[root@localhost ~]# 
[root@localhost ~]# cat rootdate.txt 
Wed Oct 13 15:54:01 CST 2021
Wed Oct 13 15:55:01 CST 2021
Wed Oct 13 15:56:01 CST 2021
Wed Oct 13 15:57:02 CST 2021
Wed Oct 13 15:58:01 CST 2021
Wed Oct 13 15:59:01 CST 2021
Wed Oct 13 16:00:01 CST 2021
Wed Oct 13 16:01:01 CST 2021
[root@localhost ~]# 

## user1 家目录
[user1@localhost ~]$ 
[user1@localhost ~]$ ll
total 4
-rw-r--r--. 1 root root 232 Oct 13 16:01 user1date.txt
[user1@localhost ~]$ 
[user1@localhost ~]$ cat user1date.txt 
Wed Oct 13 15:54:01 CST 2021
Wed Oct 13 15:55:01 CST 2021
Wed Oct 13 15:56:01 CST 2021
Wed Oct 13 15:57:02 CST 2021
Wed Oct 13 15:58:01 CST 2021
Wed Oct 13 15:59:01 CST 2021
Wed Oct 13 16:00:01 CST 2021
Wed Oct 13 16:01:01 CST 2021
[user1@localhost ~]$ 

## torres 家目录
[torres@localhost ~]$ ll
total 4
-rw-r--r--. 1 root root 232 Oct 13 16:01 torresdate.txt
[torres@localhost ~]$ 
[torres@localhost ~]$ cat torresdate.txt 
Wed Oct 13 15:54:01 CST 2021
Wed Oct 13 15:55:01 CST 2021
Wed Oct 13 15:56:01 CST 2021
Wed Oct 13 15:57:02 CST 2021
Wed Oct 13 15:58:01 CST 2021
Wed Oct 13 15:59:01 CST 2021
Wed Oct 13 16:00:01 CST 2021
Wed Oct 13 16:01:01 CST 2021
[torres@localhost ~]$ 

## x 家目录
[x@localhost ~]$ ll
total 4
-rw-r--r--. 1 root root 232 Oct 13 16:01 xdate.txt
[x@localhost ~]$ 
[x@localhost ~]$ cat xdate.txt 
Wed Oct 13 15:54:01 CST 2021
Wed Oct 13 15:55:01 CST 2021
Wed Oct 13 15:56:01 CST 2021
Wed Oct 13 15:57:02 CST 2021
Wed Oct 13 15:58:01 CST 2021
Wed Oct 13 15:59:01 CST 2021
Wed Oct 13 16:00:01 CST 2021
Wed Oct 13 16:01:01 CST 2021
[x@localhost ~]$ 


⑧、root 用户制定备份各用户数据。

  • 首先,root 目录下新建一个备份目录 backup_dates,backup_dates 目录内新建 root_dates、user1_dates、torres_dates 和 x_dates 目录。分别用来存储 root、user1、torres 和 x 用户的数据。
[root@localhost ~]# 
[root@localhost ~]# mkdir backup_dates    ## 备份目录
[root@localhost ~]# 
[root@localhost ~]# cd backup_dates/
[root@localhost backup_dates]# 
[root@localhost backup_dates]# mkdir root_dates    ## 各用户资料的备份目录
[root@localhost backup_dates]# mkdir user1_dates
[root@localhost backup_dates]# mkdir torres_dates
[root@localhost backup_dates]# mkdir x_dates
[root@localhost backup_dates]# 
[root@localhost backup_dates]# ll
total 0
drwxr-xr-x. 2 root root 6 Oct 13 16:13 root_dates
drwxr-xr-x. 2 root root 6 Oct 13 16:13 torres_dates
drwxr-xr-x. 2 root root 6 Oct 13 16:13 user1_dates
drwxr-xr-x. 2 root root 6 Oct 13 16:13 x_dates
[root@localhost backup_dates]# 

  • root 编辑 backdates.sh 脚本。脚本内容是同步各用户家目录下的所有数据到 /root/backup_dates/ 目录下各个对应的目录。
[root@localhost ~]# 
[root@localhost ~]# vim backdates.sh

## root 家目录下的所有文件同步到 /root/backup_dates/root_dates 目录。
rsync -a /root/* /root/backup_dates/root_dates 

## user1 家目录下的所有文件同步到 /root/backup_dates/user1_dates    
rsync -a /home/user1/* /root/backup_dates/user1_dates

## torres 家目录下的所有文件同步到 /root/backup_dates/torres_dates
rsync -a /home/torres/* /root/backup_dates/torres_dates

## x 家目录下的所有文件同步到 /root/backup_dates/x_dates
rsync -a /home/x/* /root/backup_dates/x_dates                                                                    
~                                                                                      
~                                                                                      
~                                                                                      
:wq    ## 保存并退出                    
  • root 编辑 /etc/crontab,制定 10 月13 日 17 点整调用 backdates.sh 脚本。
[root@localhost ~]# 
[root@localhost ~]# vim /etc/crontab 

SHELL=/bin/bash
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 rootdate.sh
* * * * * root torresdate.sh
* * * * * root user1date.sh
* * * * * root xdate.sh
0 17 13 10 * root backdates.sh    ## 10 月 13 日 17 点整调用 backdates.sh 脚本
~                                                                                      

:wq    ## 保存并退出                                    
  • 等待到了17点整。backup_dates 目录下的 root_dates/、torres_dates/、 user1_dates/ 和 x_dates/ 目录都已经保存了对应用户家目录下的数据。
[root@localhost backup_dates]# 
[root@localhost backup_dates]# ll root_dates/    ## root 用户家目录的备份数据
total 24
-rwxr--r--. 1 root root  203 Oct 13 16:42 backdates.sh
drwxr-xr-x. 6 root root   78 Oct 13 16:13 backup_dates
-rwxr--r--. 1 root root   21 Oct 13 15:34 rootdate.sh
-rw-r--r--. 1 root root 1943 Oct 13 17:00 rootdate.txt
-rwxr--r--. 1 root root   36 Oct 13 15:45 torresdate.sh
-rwxr--r--. 1 root root   34 Oct 13 15:45 user1date.sh
-rwxr--r--. 1 root root   26 Oct 13 15:46 xdate.sh
[root@localhost backup_dates]# 
[root@localhost backup_dates]# ll torres_dates/    ## torres 用户家目录的备份数据
total 4
-rw-r--r--. 1 root root 1943 Oct 13 17:00 torresdate.txt
[root@localhost backup_dates]# 
[root@localhost backup_dates]# ll user1_dates/    ## user1 用户家目录的备份数据
total 4
-rw-r--r--. 1 root root 1943 Oct 13 17:00 user1date.txt
[root@localhost backup_dates]# 
[root@localhost backup_dates]# ll x_dates/     ## x 用户家目录的备份数据
total 4
-rw-r--r--. 1 root root 1943 Oct 13 17:00 xdate.txt
[root@localhost backup_dates]# 

⑨、run-parts,读取目录下所有可执行文件。

  • root 目录创建 sh 目录,用来存储所有 .sh 脚本文件。在 sh 目录下创建 4个脚本文件。脚本内容:输出 date ,分别保存到 root、user1、torres、x 的家目录。
[root@localhost ~]# mkdir sh    ## 创建 sh 目录
[root@localhost ~]# 
[root@localhost ~]# cd sh    ## 进入 sh 目录
[root@localhost sh]# 
[root@localhost sh]# vim rootdate.sh    ## 编辑 rootdate.sh 的脚本 

date >> /root/rootdate.txt    ## 输出 date 到  /root/rootdate.txt 文件                                                
~                                                                                      
~                                                                                      
~                                                                                      
:wq    ## 保存并退出                    
  • 编辑 user1date.sh 脚本, 输出 date 到 /home/user1/user1date.txt 文件
[root@localhost sh]# vim user1date.sh

date >> /home/user1/user1date.txt                                                                   
~                                                                                      
~                                                                                      
~                                                                                      
:wq                                     
  • 编辑 torresdate.sh 脚本, 输出 date 到 /home/torres/torresdate.txt 文件
[root@localhost sh]# vim torresdate.sh

date >> /home/torres/torresdate.txt                                               
~                                                                                      
~                                                                                      
~                                                                                      
:wq                                        
  • 编辑 xdate.sh 脚本, 输出 date 到 /home/x/xdate.txt 文件
[root@localhost sh]# vim xdate.sh

date >> /home/x/xdate.txt                                     
~                                                                                      
~                                                                                      
~                                                                                      
:wq                           
  • 为脚本文件赋予拥有者 x 的执行权限。
[root@localhost sh]# 
[root@localhost sh]# chmod u+x rootdate.sh 
[root@localhost sh]# chmod u+x user1date.sh 
[root@localhost sh]# chmod u+x torresdate.sh 
[root@localhost sh]# chmod u+x xdate.sh 
[root@localhost sh]# 
[root@localhost sh]# ll
total 16
-rwxr--r--. 1 root root 27 Oct 15 09:24 rootdate.sh
-rwxr--r--. 1 root root 36 Oct 15 09:26 torresdate.sh
-rwxr--r--. 1 root root 34 Oct 15 09:25 user1date.sh
-rwxr--r--. 1 root root 26 Oct 15 09:26 xdate.sh
[root@localhost sh]# 

  • vim 编辑 /etc/crontab 文件。用 run-parts 调用 /root/sh 目录所有的执行文件。
[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 run-parts /root/sh    ## run-parts 调用 /root/sh 目录下的所有执行文件
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
~                                                                                      
:wq                                     
  • 等待一段时间,root 用户的家目录生成了 rootdate.txt 文件,cat rootdate.txt 文件看到 date 的输出内容。
[root@localhost ~]# ll
total 4
-rw-r--r--. 1 root root 58 Oct 15 09:32 rootdate.txt
drwxr-xr-x. 2 root root 82 Oct 15 09:26 sh
[root@localhost ~]# 
[root@localhost ~]# cat rootdate.txt 
Fri Oct 15 09:31:01 CST 2021
Fri Oct 15 09:32:01 CST 2021
Fri Oct 15 09:33:01 CST 2021
Fri Oct 15 09:34:01 CST 2021
Fri Oct 15 09:35:01 CST 2021
Fri Oct 15 09:36:02 CST 2021
Fri Oct 15 09:37:01 CST 2021
Fri Oct 15 09:38:01 CST 2021
Fri Oct 15 09:39:01 CST 2021
Fri Oct 15 09:40:01 CST 2021
[root@localhost ~]# 

  • torres 用户的家目录生成了 torresdate.txt 文件,cat torresdate.txt 文件看到 date 的输出内容。
[torres@localhost ~]$ ll
total 4
-rw-r--r--. 1 root root 58 Oct 15 09:32 torresdate.txt
[torres@localhost ~]$ cat torresdate.txt 
Fri Oct 15 09:31:01 CST 2021
Fri Oct 15 09:32:01 CST 2021
Fri Oct 15 09:33:01 CST 2021
Fri Oct 15 09:34:01 CST 2021
Fri Oct 15 09:35:01 CST 2021
Fri Oct 15 09:36:02 CST 2021
Fri Oct 15 09:37:01 CST 2021
Fri Oct 15 09:38:01 CST 2021
Fri Oct 15 09:39:01 CST 2021
Fri Oct 15 09:40:01 CST 2021
[torres@localhost ~]$ 

  • user1 用户的家目录生成了 user1date.txt 文件,cat user1date.txt 文件看到 date 的输出内容。
[user1@localhost ~]$ ll
total 4
-rw-r--r--. 1 root root 58 Oct 15 09:32 user1date.txt
[user1@localhost ~]$ cat user1date.txt 
Fri Oct 15 09:31:01 CST 2021
Fri Oct 15 09:32:01 CST 2021
Fri Oct 15 09:33:01 CST 2021
Fri Oct 15 09:34:01 CST 2021
Fri Oct 15 09:35:01 CST 2021
Fri Oct 15 09:36:02 CST 2021
Fri Oct 15 09:37:01 CST 2021
Fri Oct 15 09:38:01 CST 2021
Fri Oct 15 09:39:01 CST 2021
Fri Oct 15 09:40:01 CST 2021
[user1@localhost ~]$ 

  • x 用户的家目录生成了 xdate.txt 文件,cat xdate.txt 文件看到 date 的输出内容。
[x@localhost ~]$ ll
total 4
-rw-r--r--. 1 root root 58 Oct 15 09:32 xdate.txt
[x@localhost ~]$ cat xdate.txt 
Fri Oct 15 09:31:01 CST 2021
Fri Oct 15 09:32:01 CST 2021
Fri Oct 15 09:33:01 CST 2021
Fri Oct 15 09:34:01 CST 2021
Fri Oct 15 09:35:01 CST 2021
Fri Oct 15 09:36:02 CST 2021
Fri Oct 15 09:37:01 CST 2021
Fri Oct 15 09:38:01 CST 2021
Fri Oct 15 09:39:01 CST 2021
Fri Oct 15 09:40:01 CST 2021
[x@localhost ~]$ 

  • 以上记录了通过 run-parts 调用目录所有的执行文件的例子。

你可能感兴趣的:(4-13-1 Linux中的计划作业 --- crontab(二、/etc/crontab 文件操作))