技术流ken

运维拯救世界

Linux计划任务及压缩归档(week2_day1)–技术流ken

计划任务介绍

 

我们可以通过一些设置。来让电脑定时提醒我们该做什么事了。或者我们提前设置好,告诉电脑你几点做什么几点做什么,这种我们就叫它定时任务。而遇到一些需要执行的事情或任务。我们也可以通过命令来告诉电脑一会临时把这个工作给做一下

总结:在我们LINUX中,我们可以通过crontab和at这两个东西来实现这些功能的

计划任务的作用:是做一些周期性的任务,在生产中的主要用来定期备份数据

 

计划任务的安排方式分两种:

一种是定时性的,也就是例行。就是每隔一定的周期就要重复来做这个事情

一种是突发性的,就是这次做完了这个事,就没有下一次了,临时决定,只执行一次的任务

 

at和crontab这两个命令:

at:它是一个可以处理仅执行一次就结束的指令

crontab:它是会把你指定的工作或任务,比如:脚本等,按照你设定的周期一直循环执行下去

 

at一次性计划任务使用

 

at语法格式:at 时间

 

  1. 下载at程序

[root@ken ~]# yum install at -y

 

  1. 启动atd服务

[root@ken ~]# systemctl restart atd

[root@ken ~]# ps aux | grep atd

root 1166 0.0 0.1 25904 944 ? Ss 17:52 0:00 /usr/sbin/at -f root 1168 0.0 0.1 112704 956 pts/0 S+ 17:52 0:00 grep –color=auto atd

 

  1. 设置at计划任务

[root@ken ~]# at 10:00 #如果是上午时间,后面加上am,比如9:20am

at> touch /tmp/test1 #输入你要执行的命令 at> <EOT> #按ctrl+d保存

job 1 at Fri Mar 1 10:00:00 2019

[root@ken ~]# at -l #查看计划任务 1 Fri Mar 1 10:00:00 2019 a root

[root@ken ~]# atq #查看计划任务 1 Fri Mar 1 10:00:00 2019 a root

 

  1. 删除计划任务atrm

[root@ken ~]# at -l #第一步查看计划任务,获取前面编号

1 Fri Mar 1 10:00:00 2019 a root

[root@ken ~]# atrm 1 #删除计划任务加上编号

[root@ken ~]# at -l #再次查看计划任务发现已经删除

 

  1. at计划任务的特殊写法

[root@ken ~]# at 20:00 2018-10-1 在某天

[root@ken ~]# at now +10min 在 10分钟后执行

[root@ken ~]# at 17:00 tomorrow 明天下午5点执行

[root@ken ~]# at 6:00 pm +3 days 在3天以后的下午6点执行

 

6.查看at计划任务的详细信息

at -c jobid

[root@ken html]# at 10:00
at> touch kk
at> <EOT>
job 2 at Tue May 14 10:00:00 2019
[root@ken html]# at -c 2

 

crontab定时任务的使用

 

语法:#crontab -u  -e

常用选项:

-l:list,列出指定用户的计划任务列表

-e:edit,编辑指定用户的计划任务列表

-u:user,指定的用户名,如果不指定,则表示当前用户

-r:remove,删除指定用户的计划任务列表

 

  1. 查看进程是否启动

[root@ken ~]# ps aux | grep crond

root 621 0.0 0.3 126284 1600 ? Ss 17:46 0:00 /usr/sbin/crond -n root 1194 0.0 0.1 112704 956 pts/0 S+ 18:05 0:00 grep –color=auto crond

 

  1. 查看计划任务

[root@ken ~]# crontab -l

no crontab for root

 

  1. 编写计划任务

计划任务的规则语法格式,以行为单位,一行为一个计划:

分 时 日 月 周 需要执行的命令

执行的命令建议写成绝对路径的格式!

 

例如:如果想要每天的0点0分执行reboot指令,则可以写成

0 0 * * * reboot

 

取值范围(常识):

分:0~59

时:0~23

日:1~31

月:1~12

周:0~7,0和7表示星期天

 

四个符号:

*:表示取值范围中的每一个数字

-:做连续区间表达式的,要想表示1~7,则可以写成:1-7

/:表示每多少个,例如:想每10分钟一次,则可以在分的位置写:*/10

,:表示多个取值,比如想在1点,2点6点执行,则可以在时的位置写:1,2,6

 

 

查看相关文件列表

# which crontab
rpm -qf /usr/bin/crontab —-查看属于那个软件包
# rpm -ql crontabs —-查看软件包带来的文件
rpm -ql cronie
/var/spool/cron 用户级别的计划任务存放目录(以用户命名)
/etc/cron.deny
/usr/bin/crontab 用户级别的命令,系统级别计划任务通过修改配置文件来设置
/usr/sbin/crond 二进制的命令

/etc/cron.d/ —-里面通常存放用来设定除了每天/每周/每月之外的定时任务,比如说每小时周期执行的任务和其他任何定时任务。
/etc/cron.d/0hourly 系统每小时第一分钟需要执行的任务
/etc/cron.deny 用户拒绝列表(在该文件中的用户不能使用cron服务)
/etc/crontab 该文件的作用相当于/etc/cron.d/下面的某一个文件,可以定义系统计划任务。
/var/spool/cron 这个目录用来存放各个用户自己设定的定时任务,普通用户没有权限直接访问,必须通过crontab 命令(setuid)
/etc/cron.monthly/ 存放系统每个月需要执行的脚本
/etc/cron.weekly/ 存放系统每周需要执行的脚本
/etc/cron.daily/ 存放系统每天需要执行的脚本
/etc/cron.hourly/ 存放系统每小时需要执行的脚本

 

思考

如果系统断电或者宕机,错过任务执行的时间,怎么办?

可以使用anacron工具(下面介绍)。

 

anacron 任务

是cron服务的扩展,配合cron服务一起使用,当系统断电或者宕机,错过任务执行的时间时,系统启动后它会再次执行未执行的任务。
配置文件:/etc/anacrontab

#period in days delay in minutes job-identifier command
命令执行的频率(天数) 延迟时间(分钟) 任务描述 要执行的命令
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly

说明:对于每个计划任务,anacrontab先判断在period(执行频率)期间内是否被执行了,如果没执行则等待delay(延迟时间),再次执行该任务。
一般情况下该文件不用修改,知道原理就可以。

总结:
1、如果你有很多任务需要每天|周|月重复执行,并且希望系统能自动把漏掉的任务补回来。那么你可以将你的脚本存放到系统相应的目录下面/etc/cron.{daily,weekly,monthly},并赋予可执行权限。
2、以上需要系统定时去调用的任务就叫系统级别的定时任务。

 

run-parts

cron用这个工具来执行某个目录下所有的可执行脚本,定时任务中的每小时/每天/每周/每月任务就是通过这个工具来触发的。
通过修改配置文件制定计划任务:
/etc/cron.d/中的文件的范例:
# cat /etc/cron.d/0hourly
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly
* * * * * 用户名 命令 脚本文件

run-parts /目录
可执行的脚本文件
没有权限解决办法:
方法1、用权限命令chmod +x
方法2、01 * * * * root bash(或者sh) run-parts /etc/cron.hourly
—-bash解释器直接解释脚本文件

方法2表示含义:每小时的第一分钟,以root用户执行/etc/cron.hourly目录下的脚本

 

制定系统计划任务的两种方式

方法一:自己编写计划任务文件
# crontab -e –创建计划任务。如果有很多的话可以写在一起,如果要删除其中一条计划任务的话可以进去这里直接删除或者注释即可,默认是root用户创建的计划任务。

方法二:将自己的计划任务放到相应的系统任务目录里
系统自己的计划任务:/etc/cron.{daily,weekly,monthly}
—-直接进去这个目录创建一个文件再创建周期计划
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly
* * * * * 用户名 命令 脚本文件
run-parts
可执行的脚本文件

 

cron使用限制

/etc/cron.deny ——只拒绝哪些用户不能他用crontab,默认存在空文件
/etc/cron.allow ——允许哪些用户使用crontab

如果同一个用户即在拒绝里又在允许里,默认允许优先。

 

[root@ken-node1 ~]# cat /etc/cron.deny 
ken
[root@ken-node1 ~]# su - ken
Last login: Thu Jun  6 22:50:37 CST 2019 on pts/0
[ken@ken-node1 ~]$ crontab -e
You (ken) are not allowed to use this program (crontab)
See crontab(1) for more information

 

 

思考

如果我用crontab -e写了晚上8:30去关机,但是我18点下课就手动关机了,第二天来9点开机,它会不会延迟一段时间又关机呢?
不会。只有在/etc/cron week daily 这类的文件里写的任务才会补救任务,其余方法(crontap)不会自动补救

 

 

删除计划任务两种方式

方法一: crontab -r

[root@ken ~]# crontab -l * * * * * echo “123” >> /root/ken.txt

[root@ken ~]# crontab -r

[root@ken ~]# crontab -l no crontab for root

注意:在计划任务中,默认的最小单位就是分,不能再小了。

 

方法二:

注释掉

 

练习题

 

问题1:每月1、10、22日的4:45重启network服务

 

问题2:每周六、周日的1:10重启network服务

 

问题3:每天18:00至23:00之间每隔30分钟重启network服务

 

问题4:每隔两天的上午8点到11点的第3和第15分钟执行一次重启

 

案例:真实测试案例,每1分钟往root家目录中的ken.txt中输一个123,为了看到效果使用追加输出

 

[root@ken ~]# crontab -e #编写计划任务

* * * * * echo “123” >> /root/ken.txt

[root@ken ~]# tail -f ken.txt #查看计划任务执行结果 123 123

 

 

压缩归档

 

  1. 掌握归档的定义:归档(archiving)就是将许多文件(或目录)打包成一个文件。
  2. 了解归档的目的:归档的目的就是方便备份、还原及文件的传输操作。
  3.  掌握tar命令的功能:将多个文件(也可能包括目录,因为目录本身也是文件)放在一起存放到一个磁带或磁盘归档文件中。并且将来可以根据需要只还原归档文件中的某些指定的文件。
  4. 掌握tar命令的常用选项:
  • c:创建一个新的tar文件。
  • t:列出tar文件中目录的内容。
  • x:从tar文件中抽取文件。
  • f:指定归档文件或磁带(也可能是软盘)设备(一般都要选)。
  • v:显示所打包的文件的详细信息,v是verbose的第1个字母。
  • z:使用gzip压缩算法来压缩打包后的文件。
  • j:使用bzip2压缩算法来压缩打包后的文件(文件压缩的更小)
  • r:添加文件值tar包
  • u: 更新tar包中的某个文件
  • -C指定解压到某个特定目录
  • –exclude: 排除某个文件

 

常用选项组合:

压缩归档:czvf

解压:xzvf

 

 

-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

# tar -cf all.tar *.jpg
这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。

# tar -rf all.tar *.gif
这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。   #注意如果是一个压缩的包是不能把文件添加进去的,报如下的错

[root@ken-node1 ken]# tar rf jj.tar.gz 11.txt 
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now

 

# tar -uf all.tar logo.gif
这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

# tar -tf all.tar
这条命令是列出all.tar包中所有文件,-t是列出文件的意思

# tar -xf all.tar
这条命令是解出all.tar包中所有文件,-t是解开的意思

 

注意

tar打包时,去掉某些子目录或者指定文件,使用 -exclude {dirname,filename}

比如我们要打包/home/www网站全站,放在/home目录下,除了一些比如db_m(phpmyadmin)之类的,本地有就不需要

#tar zcvf /home/bk0406-1717.tar.gz /home/www –exclude /home/www/db_m –exclude /home/www/images –exclude /home/docs –exclude=/home/www/config.inc.PHP

这里需要注意的是,exclude 后面的目录不能带 /  带了 /就会失效

 

  1. 压缩归档

[root@ken ~]# mkdir test

[root@ken ~]# cd test

[root@ken test]# touch {1..10}.txt

[root@ken test]# tar czvf test.tar.gz ./* ./10.txt ./1.txt ./2.txt ./3.txt ./4.txt ./5.txt ./6.txt ./7.txt ./8.txt ./9.txt [root@ken test]# ls 10.txt 2.txt 4.txt 6.txt 8.txt test.tar.gz 1.txt 3.txt 5.txt 7.txt 9.txt

 

  1. 解压

[root@ken test]# rm -rf {1..10}.txt

[root@ken test]# ls test.tar.gz

[root@ken test]# tar xzvf test.tar.gz ./10.txt ./1.txt ./2.txt ./3.txt ./4.txt ./5.txt ./6.txt ./7.txt ./8.txt ./9.txt [root@ken test]# ls 10.txt 2.txt 4.txt 6.txt 8.txt test.tar.gz 1.txt 3.txt 5.txt 7.txt 9.txt

 

可以加上-C制定解压到那个目录

[root@ken test]# tar xvf test.tar.gz -C /tmp

 

[root@ken test]# ls /tmp

10.txt 2.txt 4.txt 6.txt 8.txt ks-script-8jIJc_ yum.log 1.txt 3.txt 5.txt 7.txt 9.txt vmware-root

 

 

 

1、*.tar 用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz和*.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e解压
9、*.zip 用 unzip 解压

 

Crontab练习题

  1. 每周一到周六的凌晨3点20分,运行tar命令对/etc/目录进行存档另存,存储位置为/backups/etc-YYYY-MM-DD.tar.gz
  2. 每周日凌晨2点30分,运行cp命令对/etc/fstab文件进行备份,存储位置为/backup/fstab-YYYY-MM-DD-hh-mm-ss;
  3. 每天晚上12点,取得/proc/meminfo文件中所有以S或M开头的行,追加至/statistics/meminfo.txt文件中,且每天的消息之前,要加上类似===============分隔线;
  4. 每月每天凌晨3点30分和中午12点20分执行test.sh脚本
  5. 每月每天每隔6小时的每30分钟执行test.sh脚本
  6. 每月每天早上8点到下午18点每隔2小时的每30分钟执行test.sh脚本
  7. 每月每天晚上21点30分执行test.sh脚本
  8. 每月1号、10号、22号凌晨4点45分执行test.sh脚本
  9. 8月份周一、周日凌晨1点10分执行test.sh脚本
  10. 每月每天每小时整点执行test.sh脚本
  11. 每天晚上 12 点,打包站点目录/var/www/html 备份到/data 目录下。每次备份按时间生成不同的备份包
  12. 一月一号的4点重启smb
  13. 每小时执行/etc/cron.hourly目录内的脚本
  14. 每月的4号与每周一到周三的11点重启smb
  15. 晚上11点到早上7点之间,每隔一小时重启smb
  16. 每一小时重启smb
  17. 每星期六的晚上11 : 00 pm重启smb
  18. 每天18 : 00至23 : 00之间每隔30分钟重启smb
  19. 每周六、周日的1 : 10重启smb
  20. 每月1、10、22日的4 : 45重启smb

发表评论

电子邮件地址不会被公开。