1.管理定期任务cron
1.概念
- cron设备管理必须按计划定期重复运行的程序
- 后台程序crond每分钟唤醒一次,以运行计划的任何任务用户使用crontab命令计划个人任务
- 系统管理员可以在系统范围配置文件中设置任务
- 单个用户使用名称为crontab(cron表)的文本文件登记任务
- crontab这个命令所设置的任务将会循环的一直执行下去,可循环的时间为分钟、小时、每周、每月或每年等
- crontab除了可以使用命令执行外,亦可编辑 /etc/crontab来支持
- 可以让crontab生效的服务是crond
- 这种计划任务的种类是例行性的,就是每隔一定的周期要来办的事项
2.crontab
crontab -l | 列出查看crontab的任务内容 |
---|---|
crontab -e | 编辑crontab的任务内容 |
crontab -r | 删除所有的crontab的任务内容 |
crontab -u username -l/-e/-r | 只有root才能执行此任务,即帮其他使用者建立/删除crontab计划任务 |
crontab -r -i | 删除时询问是否删除 |
[root@localhost Desktop]# crontab -l ##查看任务内容
* * * * * rm -rf /mnt/*
[root@localhost Desktop]# cat /var/spool/cron/root ##查看任务内容
* * * * * rm -rf /mnt/*
[root@localhost Desktop]# crontab -e -u root ##root用户编辑任务内容
no crontab for root - using an empty one
crontab: installing new crontab
##编辑的内容为 : * * * * * rm -rf /mnt/*
[root@localhost Desktop]# crontab -r ##删除任务
[root@localhost Desktop]# crontab -l ##查看任务内容
no crontab for root ##已删除
[root@localhost Desktop]# crontab -l ##查看任务内容
* * * * * rm -rf /mnt/*
[root@localhost Desktop]# crontab -r -i ##删除任务并询问是否删除
crontab: really delete root's crontab? yes ##输入yes
[root@localhost Desktop]# crontab -l ##查看任务内容
no crontab for root ##已删除
3.cron时间表示方式
- 使用crontab -e进入到 vi 的编辑页面,每项任务都是一行
- 编辑完成后输入【:wq】退出并保存
- 每项任务的格式都具有六个字段
- 格式为 * * * * * 命令
分钟 | 0~59 |
---|---|
小时 | 0~23 |
日期 | 1~31 |
月份 | 1~12 |
周 | 0~7 |
命令 | 需要执行的命令 |
* (星号) | 代表任何时刻都接受 |
,(逗号) | 代表分隔时段 |
-(减号) | 代表一段时间范围内 |
/n(斜线) | n代表数字,即是每隔n单位间隔的意思 |
- eg:
05 * * * * | 每小时整点过5分钟 |
---|---|
05 02 * * * | 每天2:05am |
30 08 01 * * | 每月第一天08:30am |
00 07 25 12 * | 12月25日7:00am |
30 16 * * 5 | 每个星期五4:30pm |
*/5 * * * * | 每5分钟(0、5、10…50、55) |
*/10 9-17 1,15 * * | 每月的1号和15号9:00am至5:00pm之间每隔10分钟(在5:00pm不会运行,最后一次运行是在4:50pm) |
4.crontab注意事项:
- 属于系统的任务通常保存在 /etc/crontab文件中而不是使用crontab -e编辑保存在个人文件中
- 比较好的做法是用文本编辑器创建crontab文件并保存到 /etc/cron.d中(避免更新系统软件包cronie时出现问题)
- /etc/cron.d/crontab文件在日期说明后另加一个字段,表示将运行作业的用户
- 对于每天、每周或每月运行一次的脚本,可以直接将其设置为可执行文件,并保存在 **/etc/cron.{daily,weeky,monthly}**中相应目录下
- 这些任务由 /etc.anacrontab 配置的系统 anacron 服务运行
- anacron是cron的集成组件,用于更好的管理作业,并确保在作业
5.crond服务读取配置文件的位置
- 一般来说,crond默认有3个地方会执行脚本配置文件,分别为:
- /etc/crontab,与系统运行有关
- /etc/cron.d/*,与系统运行有关
- /var/spool/cron/*,跟用户自己的任务有关
6.cron权限设定
- 在系统中默认所有用户可以设定cron
- 用户黑名单:/etc/cron.deny将不可以使用crontab的帐号写入其中,未记录到此文件中的用户就可以使用crontab
- 用户白名单:/etc/cron.allow将可以使用crontab的帐号写入其中,不在此文件内的用户就不可以使用crontab
- /etc/cron.allow优先级高于 /etc/cron.deny
- 系统默认保留 /etc/cron.deny
2.延时任务at
1.概念
- at是个可以处理仅执行一次就结束的命令
- 在执行at时,必须要有atd这个服务的支持
- 在某些linux中,atd可能默认并没有启动,那么at这个命令就会失效
- 这种计划任务的方式是突发性的,就是这次做完以后就没有的任务
- 使用at命令产生所要运行的任务时,在输入at命令之后,按【Enter】并继续输入任务中包含的其他命令,任务可由多条命令组成,在完成要运行的命令时,在单独出现的一行按【Ctrl+d】完成任务
- at命令必须指定任务运行的时间
2.at
at 时间 | 在此时间时执行此任务,若该时间已过,则明天的此时间执行 |
---|---|
at -l | 列出目前系统中所有该使用者的at计划 |
at -c 任务序号 | 查看任务中的命令并立即执行该任务 |
at -r/-d 任务序号 | 取消此序号的任务 |
at now+1min | 在某时间点之后1分钟执行 |
atq | 用法同at -l |
atrm + jobnumber | 用法同at -r |
[root@localhost mnt]# ls ##显示/mnt/中的文件
file1 file2 file3 file4 file5
[root@localhost mnt]# date ##显示当前时间
Wed Oct 30 18:09:14 EDT 2019
[root@localhost mnt]# at 18:11 ##在18:11时执行删除/mnt/中任何文件的命令
at> rm -rf /mnt/*
at> <EOT>
job 1 at Wed Oct 30 18:11:00 2019
[root@localhost mnt]# ls ##显示/mnt/中的文件,已删除
[root@localhost mnt]# ls ##显示/mnt/中的内容
file1 file2 file3 file4 file5
[root@localhost mnt]# at now+10minutes ##在10分钟后执行此命令
at> rm -rf /mnt/*
at> <EOT>
job 4 at Wed Oct 30 18:31:00 2019
[root@localhost mnt]# at now+20minutes ##在20分钟后执行此命令
at> touch text{1..3}
at> <EOT>
job 5 at Wed Oct 30 18:41:00 2019
[root@localhost mnt]# at -l ##显示任务
4 Wed Oct 30 18:31:00 2019 a root
5 Wed Oct 30 18:41:00 2019 a root
[root@localhost mnt]# at -r 4 ##取消任务4
[root@localhost mnt]# at -l ##显示任务
5 Wed Oct 30 18:41:00 2019 a root ##任务5依然存在
[root@localhost mnt]# ls ##查看/mnt/内容
file1 file2 file3 file4 file5
[root@localhost mnt]# at now+1min ##在1分钟后执行此命令
at> rm -rf /mnt/*
at> <EOT>
job 6 at Wed Oct 30 18:28:00 2019
[root@localhost mnt]# at -l ##查看任务
6 Wed Oct 30 18:28:00 2019 a root
[root@localhost mnt]# at -c 6 ##执行任务6
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
XDG_SESSION_ID=14; export XDG_SESSION_ID
HOSTNAME=localhost; export HOSTNAME
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
SSH_CLIENT=172.25.254.79\ 59388\ 22; export SSH_CLIENT
OLDPWD=/root; export OLDPWD
SSH_TTY=/dev/pts/1; export SSH_TTY
USER=root; export USER
LS_COLORS=rs=0:di=38\;5\;27:ln=38\;5\;51:mh=44\;38\;5\;15:pi=40\;38\;5\;11:so=38\;5\;13:do=38\;5\;5:bd=48\;5\;232\;38\;5\;11:cd=48\;5\;232\;38\;5\;3:or=48\;5\;232\;38\;5\;9:mi=05\;48\;5\;232\;38\;5\;15:su=48\;5\;196\;38\;5\;15:sg=48\;5\;11\;38\;5\;16:ca=48\;5\;196\;38\;5\;226:tw=48\;5\;10\;38\;5\;16:ow=48\;5\;10\;38\;5\;21:st=48\;5\;21\;38\;5\;15:ex=38\;5\;34:\*.tar=38\;5\;9:\*.tgz=38\;5\;9:\*.arc=38\;5\;9:\*.arj=38\;5\;9:\*.taz=38\;5\;9:\*.lha=38\;5\;9:\*.lz4=38\;5\;9:\*.lzh=38\;5\;9:\*.lzma=38\;5\;9:\*.tlz=38\;5\;9:\*.txz=38\;5\;9:\*.tzo=38\;5\;9:\*.t7z=38\;5\;9:\*.zip=38\;5\;9:\*.z=38\;5\;9:\*.Z=38\;5\;9:\*.dz=38\;5\;9:\*.gz=38\;5\;9:\*.lrz=38\;5\;9:\*.lz=38\;5\;9:\*.lzo=38\;5\;9:\*.xz=38\;5\;9:\*.bz2=38\;5\;9:\*.bz=38\;5\;9:\*.tbz=38\;5\;9:\*.tbz2=38\;5\;9:\*.tz=38\;5\;9:\*.deb=38\;5\;9:\*.rpm=38\;5\;9:\*.jar=38\;5\;9:\*.war=38\;5\;9:\*.ear=38\;5\;9:\*.sar=38\;5\;9:\*.rar=38\;5\;9:\*.alz=38\;5\;9:\*.ace=38\;5\;9:\*.zoo=38\;5\;9:\*.cpio=38\;5\;9:\*.7z=38\;5\;9:\*.rz=38\;5\;9:\*.cab=38\;5\;9:\*.jpg=38\;5\;13:\*.jpeg=38\;5\;13:\*.gif=38\;5\;13:\*.bmp=38\;5\;13:\*.pbm=38\;5\;13:\*.pgm=38\;5\;13:\*.ppm=38\;5\;13:\*.tga=38\;5\;13:\*.xbm=38\;5\;13:\*.xpm=38\;5\;13:\*.tif=38\;5\;13:\*.tiff=38\;5\;13:\*.png=38\;5\;13:\*.svg=38\;5\;13:\*.svgz=38\;5\;13:\*.mng=38\;5\;13:\*.pcx=38\;5\;13:\*.mov=38\;5\;13:\*.mpg=38\;5\;13:\*.mpeg=38\;5\;13:\*.m2v=38\;5\;13:\*.mkv=38\;5\;13:\*.webm=38\;5\;13:\*.ogm=38\;5\;13:\*.mp4=38\;5\;13:\*.m4v=38\;5\;13:\*.mp4v=38\;5\;13:\*.vob=38\;5\;13:\*.qt=38\;5\;13:\*.nuv=38\;5\;13:\*.wmv=38\;5\;13:\*.asf=38\;5\;13:\*.rm=38\;5\;13:\*.rmvb=38\;5\;13:\*.flc=38\;5\;13:\*.avi=38\;5\;13:\*.fli=38\;5\;13:\*.flv=38\;5\;13:\*.gl=38\;5\;13:\*.dl=38\;5\;13:\*.xcf=38\;5\;13:\*.xwd=38\;5\;13:\*.yuv=38\;5\;13:\*.cgm=38\;5\;13:\*.emf=38\;5\;13:\*.axv=38\;5\;13:\*.anx=38\;5\;13:\*.ogv=38\;5\;13:\*.ogx=38\;5\;13:\*.aac=38\;5\;45:\*.au=38\;5\;45:\*.flac=38\;5\;45:\*.mid=38\;5\;45:\*.midi=38\;5\;45:\*.mka=38\;5\;45:\*.mp3=38\;5\;45:\*.mpc=38\;5\;45:\*.ogg=38\;5\;45:\*.ra=38\;5\;45:\*.wav=38\;5\;45:\*.axa=38\;5\;45:\*.oga=38\;5\;45:\*.spx=38\;5\;45:\*.xspf=38\;5\;45:; export LS_COLORS
MAIL=/var/spool/mail/root; export MAIL
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin; export PATH
PWD=/mnt; export PWD
LANG=en_US.UTF-8; export LANG
HISTCONTROL=ignoredups; export HISTCONTROL
SHLVL=1; export SHLVL
HOME=/root; export HOME
LOGNAME=root; export LOGNAME
SSH_CONNECTION=172.25.254.79\ 59388\ 172.25.254.80\ 22; export SSH_CONNECTION
LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR
cd /mnt || {
echo 'Execution directory inaccessible' >&2
exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER443554d4'
rm -rf /mnt/*
marcinDELIMITER443554d4
[root@localhost mnt]# ls ##查看/mnt/中的内容,显示删除成功
[root@localhost mnt]# touch text{1..5} ##建立文件
[root@localhost mnt]# ls ##显示内容
text1 text2 text3 text4 text5
[root@localhost mnt]# at now+10minutes ##在10分钟之后执行
at> rm -rf /mnt/*
at> <EOT>
job 7 at Wed Oct 30 19:40:00 2019
[root@localhost mnt]# atq ##显示任务
7 Wed Oct 30 19:40:00 2019 a root
[root@localhost mnt]# at now+20minutes ##在20分钟后执行
at> touch file
at> <EOT>
job 8 at Wed Oct 30 19:51:00 2019
[root@localhost mnt]# atq ##显示任务
7 Wed Oct 30 19:40:00 2019 a root
8 Wed Oct 30 19:51:00 2019 a root
3.注意:
- 在将某一次at作业设置运行之后,可以通过使用atq命令列出任务编号及次数
- at还可以在一个任务里输入多条命令
- at的执行与终端环境无关,而所有标准输出/标准错误输出都会发送到执行者的mailbox中
4.at权限设定
- 用户黑名单:/etc/at.deny 写在这个文件中的用户不能使用at
- 用户白名单:/etc/at.allow 写在这个文件中的用户才能使用at
- 白名单不存在需要建立,黑名单系统默认存在
- /etc/at.allow 优先级高于 /etc/at.deny
- 黑白名单对root用户没有限制
3.临时文件管理
- 系统中的 /usr/lib/tmpfiles.d 文件标示了服务的临时文件的存放位置
- vim /usr/lib/tmpfiles.d/file.conf #在/usr/lib/tmpfiles.d/中编辑文件file.conf,设置临时文件的策略
- d /mnt/aaa 1777 root root 10s #文件file.conf的内容
- systemd-tmpfiles --create /usr/lib/tmpfiles.d/* #以此策略为原则建立目录
- systemd-tmpfiles --clean /usr/lib/tmpfiles.d/* #清除以此策略为原则的目录下达到生命周期的文件
- 注意:当某文件没有达到生命周期时,则不能被清除
[root@localhost ~]# cd /usr/lib/tmpfiles.d/ ##切换到目录/usr/lib/tmpfiles.d/
[root@localhost tmpfiles.d]# vim aaa.conf ##编辑文件aaa.conf
[root@localhost tmpfiles.d]# systemd-tmpfiles --create /usr/lib/tmpfiles.d/* ##建立目录
[root@localhost tmpfiles.d]# touch /mnt/aaa/file1 ##建立文件file1
[root@localhost tmpfiles.d]# ls -lR /mnt/ ##显示/mnt/中的内容
/mnt/:
total 0
drwxrwxrwt 2 root root 18 Oct 30 20:32 aaa
/mnt/aaa:
total 0
-rw-r--r-- 1 root root 0 Oct 30 20:32 file1 ##file1存在
[root@localhost tmpfiles.d]# systemd-tmpfiles --clean /usr/lib/tmpfiles.d/* ##清除到达生命周期的文件
[root@localhost tmpfiles.d]# ls -lR /mnt/ ##显示/mnt/的内容,清除成功
/mnt/:
total 0
drwxrwxrwt 2 root root 6 Oct 30 20:32 aaa
/mnt/aaa:
total 0
[root@localhost tmpfiles.d]# touch /mnt/aaa/file2 ##建立文件file2
[root@localhost tmpfiles.d]# ls -lR /mnt/ ##显示/mnt/的内容
/mnt/:
total 0
drwxrwxrwt 2 root root 18 Oct 30 20:34 aaa
/mnt/aaa:
total 0
-rw-r--r-- 1 root root 0 Oct 30 20:34 file2 ##file2存在
[root@localhost tmpfiles.d]# systemd-tmpfiles --clean /usr/lib/tmpfiles.d/* ##清除没有达到生命周期的文件
[root@localhost tmpfiles.d]# ls -lR /mnt/ ##显示/mnt/的内容
/mnt/:
total 0
drwxrwxrwt 2 root root 18 Oct 30 20:34 aaa
/mnt/aaa:
total 0
-rw-r--r-- 1 root root 0 Oct 30 20:34 file2 ##file2存在,清除未成功