在系统中我们的维护工作大多数时在服务器行对闲置时进行
我们需要用延迟任务来解决自动进行的一次性的维护
延迟任务时一次性的,不会重复执行
当延迟任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者
(1)延迟任务的发起
在系统中我们可以使用 at 命令来发起延迟任务
at 命令执行是调用的是 atd 服务,即使系统最小化安装 atd 也会被安装到系统中
at 任务信息存放在系统中 /var/spool/at 目录中
at 任务的日志文件被存放到 /var/log/cron 中
at 任务执行时如果遇到系统处于关闭状态,那么在开启时 atd 任务会检测未执行的任务并且立即执行
延迟任务发起方法如下:
先创建一个查看延迟效果的监控命令,以/mnt举例;
[root@zh ~]# watch -n 1 ls /mnt
使用at 时间命令在14:05分创建file1到file10文件
[root@zh ~]# at 14:05
warning: commands will be executed using /bin/sh
at> touch /mnt/file{1..10}
at>
job 7 at Sat Nov 16 14:05:00 2024
使用at时间命令在18:15删除/mnt下的所有文件
[root@zh ~]# at 18:15
warning: commands will be executed using /bin/sh
at> rm -rf /mnt/*
at>
job 8 at Sat Nov 16 18:15:00 2024
at now+1min,在下一分钟整点创建file1到file10文件
[root@zh ~]# at now+1min
warning: commands will be executed using /bin/sh
at> touch /mnt/file{1..10}
at>
job 10 at Sat Nov 16 18:18:00 2024
[root@zh ~]# at -l
15 Sat Nov 16 18:29:00 2024 a root
[root@zh ~]# at -c 15
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
SHELL=/bin/bash; export SHELL
HISTCONTROL=ignoredups; export HISTCONTROL
HISTSIZE=1000; export HISTSIZE
HOSTNAME=zh; export HOSTNAME
PWD=/root; export PWD
LOGNAME=root; export LOGNAME
XDG_SESSION_TYPE=tty; export XDG_SESSION_TYPE
MOTD_SHOWN=pam; export MOTD_SHOWN
HOME=/root; export HOME
LANG=zh_CN.UTF-8; export LANG
LS_COLORS=rs=0:di=01\;34:ln=01\;36:mh=00:pi=40\;33:so=01\;35:do=01\;35:bd=40\;33\;01:cd=40\;33\;01:or=40\;31\;01:mi=01\;37\;41:su=37\;41:sg=30\;43:ca=30\;41:tw=30\;42:ow=34\;42:st=37\;44:ex=01\;32:\*.tar=01\;31:\*.tgz=01\;31:\*.arc=01\;31:\*.arj=01\;31:\*.taz=01\;31:\*.lha=01\;31:\*.lz4=01\;31:\*.lzh=01\;31:\*.lzma=01\;31:\*.tlz=01\;31:\*.txz=01\;31:\*.tzo=01\;31:\*.t7z=01\;31:\*.zip=01\;31:\*.z=01\;31:\*.dz=01\;31:\*.gz=01\;31:\*.lrz=01\;31:\*.lz=01\;31:\*.lzo=01\;31:\*.xz=01\;31:\*.zst=01\;31:\*.tzst=01\;31:\*.bz2=01\;31:\*.bz=01\;31:\*.tbz=01\;31:\*.tbz2=01\;31:\*.tz=01\;31:\*.deb=01\;31:\*.rpm=01\;31:\*.jar=01\;31:\*.war=01\;31:\*.ear=01\;31:\*.sar=01\;31:\*.rar=01\;31:\*.alz=01\;31:\*.ace=01\;31:\*.zoo=01\;31:\*.cpio=01\;31:\*.7z=01\;31:\*.rz=01\;31:\*.cab=01\;31:\*.wim=01\;31:\*.swm=01\;31:\*.dwm=01\;31:\*.esd=01\;31:\*.jpg=01\;35:\*.jpeg=01\;35:\*.mjpg=01\;35:\*.mjpeg=01\;35:\*.gif=01\;35:\*.bmp=01\;35:\*.pbm=01\;35:\*.pgm=01\;35:\*.ppm=01\;35:\*.tga=01\;35:\*.xbm=01\;35:\*.xpm=01\;35:\*.tif=01\;35:\*.tiff=01\;35:\*.png=01\;35:\*.svg=01\;35:\*.svgz=01\;35:\*.mng=01\;35:\*.pcx=01\;35:\*.mov=01\;35:\*.mpg=01\;35:\*.mpeg=01\;35:\*.m2v=01\;35:\*.mkv=01\;35:\*.webm=01\;35:\*.webp=01\;35:\*.ogm=01\;35:\*.mp4=01\;35:\*.m4v=01\;35:\*.mp4v=01\;35:\*.vob=01\;35:\*.qt=01\;35:\*.nuv=01\;35:\*.wmv=01\;35:\*.asf=01\;35:\*.rm=01\;35:\*.rmvb=01\;35:\*.flc=01\;35:\*.avi=01\;35:\*.fli=01\;35:\*.flv=01\;35:\*.gl=01\;35:\*.dl=01\;35:\*.xcf=01\;35:\*.xwd=01\;35:\*.yuv=01\;35:\*.cgm=01\;35:\*.emf=01\;35:\*.ogv=01\;35:\*.ogx=01\;35:\*.aac=01\;36:\*.au=01\;36:\*.flac=01\;36:\*.m4a=01\;36:\*.mid=01\;36:\*.midi=01\;36:\*.mka=01\;36:\*.mp3=01\;36:\*.mpc=01\;36:\*.ogg=01\;36:\*.ra=01\;36:\*.wav=01\;36:\*.oga=01\;36:\*.opus=01\;36:\*.spx=01\;36:\*.xspf=01\;36:; export LS_COLORS
SSH_CONNECTION=192.168.94.1\ 59823\ 192.168.94.100\ 22; export SSH_CONNECTION
XDG_SESSION_CLASS=user; export XDG_SESSION_CLASS
LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
USER=root; export USER
SHLVL=1; export SHLVL
XDG_SESSION_ID=4; export XDG_SESSION_ID
XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR
SSH_CLIENT=192.168.94.1\ 59823\ 22; export SSH_CLIENT
which_declare=declare\ -f; export which_declare
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share; export XDG_DATA_DIRS
PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin; export PATH
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus; export DBUS_SESSION_BUS_ADDRESS
MAIL=/var/spool/mail/root; export MAIL
SSH_TTY=/dev/pts/1; export SSH_TTY
cd /root || {
echo 'Execution directory inaccessible' >&2
exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER5a6da16c'
[root@zh ~]# at -r 15
-m 当任务完成之后,即使没有标准输出,将给用户发送邮件
-d atrm 的别名 , 可以取消一个在 at 调度中的工作
-v 使用较明显的时间格式,列出 at 调度中的任务列表
-f 从文件中读取作作业
表示在今天的 HH 小时 MM 分钟执行,如果今天的这个时间点已经过了,则明天执行
表示强制规定在某年某月的某一天的特殊时刻进行该工作
表示从现在开始几分钟 minutes, hours, days, or weeks
at 任务在执行时首先会查看执行者是否在名单中
系统中默认只存在黑名单 /etc/at.deny ,写入此文件中的用户会被禁止使用 at 任务
在系统中可以手动建立白名单 /etc/at.allow, 当此文件出现黑名单不会被检测
白名单出现只有 root 用户和白名单用户可以执行 at 任务
如果系统中没有黑白名单那么只有 root 用户可以执行任务
黑白名单为用户列表,每个用户一行
at命令黑白名单
切换到etc目录查看at.deny,将xiaohua用户加入黑名单
[root@zh ~]# cd /etc
[root@zh etc]# echo xiaohua > at.deny
切换到xiaohua用户,使用at命令为拒绝
[root@zh ~]# su xiaohua
[xiaohua@zh root]$ at 18:36
You do not have permission to use at.
创建at.allow文件,将xiaohua用户加入白名单中,切换到xiaohua用户
[root@zh ~]# cd /etc
[root@zh etc]# touch at.allow
[root@zh etc]# echo xiaohua > at.allow
[root@zh etc]# cat at.allow
xiaohua
此时可以使用at命令
[root@zh etc]# su xiaohua
[xiaohua@zh etc]$ at 18:38
warning: commands will be executed using /bin/sh
at>
和延迟任务类似,我们可以用 crontab 来解决自动进行的周期性的维护
定时任务类似手机闹钟,会重复执行
当定时任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者
在系统中我们可以使用 crontab 命令来发起用户级定时任务
在系统中 /etc/cronfilename 是系统级定时任务,只有 root 用户可以发起
定时任务执行是调用的是 crond 服务,即使系统最小化安装 crond 也会被安装到系统中
定时任务信息存放在系统中 /var/spool/cron 目录中,存放文件和发起人名称一致
定时任务的日志文件被存放到 /var/log/cron 中
定时任务执行时如果遇到系统处于关闭状态,那么在开启时 crond 任务会检测未执行的任务并且立
即执行
[root@zh xiaohua]# crontab -u root -e
回车进入编辑界面, * * * * * 表示时间指每天的每小时分钟做创建文档这个任务
* * * * * touch /mnt/file{1..10}
1.crontab -l
查看用户下crontab命令下的文件内容
[root@zh ~]# crontab -u root -l
* * * * * touch /mnt/file{1..10}
2.crontab -r
删除某个用户的crontab文件
[root@zh ~]# crontab -u root -r
/etc/cron.d | 系统自定义周期任务 |
/etc/cron.daily | 每天周期任务 |
/etc/cron.hourly | 每小时周期任务 |
/etc/cron.monthly | 每月周期任务 |
/etc/cron.weekly | 每周周期任务 |
切换到/etc/cron.d目录,创建文件clean_mnt
[root@zh ~]# cd /etc/cron.d
[root@zh cron.d]# vim clean_mnt
写入 19:5 分删除file1-file10
5 19 * * * root rm -rf /mnt/file{1..10}
以/mnt下为例,该目录下有file1-file10 在19:05时
定时任务在执行时首先会查看执行者是否在名单中
系统中默认只存在黑名单 /etc/cron.deny ,写入此文件中的用户会被禁止使用定时任务
在系统中可以手动建立白名单 /etc/cron.allow, 当此文件出现黑名单不会被检测
白名单出现只有 root 用户和白名单用户可以执行定时任务
如果系统中没有黑白名单那么只有 root 用户可以执行任务
黑白名单为用户列表,每个用户一行
黑白名单只针对用户级定时任务进行限制
切换到etc目录查看cron.deny,将xiaohua用户加入黑名单
[root@zh ~]# cd /etc
[root@zh etc]# echo xiaohua > cron.deny
[root@zh etc]# cat cron.deny
xiaohua
切换至xiaohua用户使用crontab命令被拒绝
[root@zh etc]# su xiaohua
[xiaohua@zh etc]$ crontab -e
You (xiaohua) are not allowed to use this program (crontab)
See crontab(1) for more information
在/etc创建cron.allow文件,并写入xiaohua
[root@zh etc]# echo xiaohua > cron.allow
[root@zh etc]# cat cron.allow
xiaohua
切换至xiaohua用户使用crontab命令被允许
[root@zh etc]# su xiaohua
[xiaohua@zh etc]$ cd
[xiaohua@zh ~]$ crontab -e
no crontab for xiaohua - using an empty one
crontab: installing new crontab