系统的延迟任务及定时任务

一.延迟任务


在系统中我们的维护工作大多数时在服务器行对闲置时进行
我们需要用延迟任务来解决自动进行的一次性的维护
延迟任务时一次性的,不会重复执行
当延迟任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者
(1)延迟任务的发起
在系统中我们可以使用 at 命令来发起延迟任务
at 命令执行是调用的是 atd 服务,即使系统最小化安装 atd 也会被安装到系统中
at 任务信息存放在系统中 /var/spool/at 目录中
at 任务的日志文件被存放到 /var/log/cron 中
at 任务执行时如果遇到系统处于关闭状态,那么在开启时 atd 任务会检测未执行的任务并且立即执行
延迟任务发起方法如下:

先创建一个查看延迟效果的监控命令,以/mnt举例;

[root@zh ~]# watch -n 1 ls /mnt

系统的延迟任务及定时任务_第1张图片

1.1at命令

使用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

系统的延迟任务及定时任务_第2张图片

使用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

系统的延迟任务及定时任务_第3张图片

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

系统的延迟任务及定时任务_第4张图片系统的延迟任务及定时任务_第5张图片

1.2at命令的参数详解

1.2.1.at -l 查看at命令

[root@zh ~]# at -l
15	Sat Nov 16 18:29:00 2024 a root

1.2.2.at -c 查看这个命令的详情参数

[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'

1.2.3.at -r 删除at命令

[root@zh ~]# at -r 15

1.2.4.其他关于at的命令参数


-m 当任务完成之后,即使没有标准输出,将给用户发送邮件
-d atrm 的别名 , 可以取消一个在 at 调度中的工作
-v 使用较明显的时间格式,列出 at 调度中的任务列表
-f 从文件中读取作作业

1.3 at命令的时间表示方法

1.3.1.HH:MM

表示在今天的 HH 小时 MM 分钟执行,如果今天的这个时间点已经过了,则明天执行

1.3.2.HH:MM YYYY-MM-DD

表示强制规定在某年某月的某一天的特殊时刻进行该工作

1.3.3.now + 2 minutes

表示从现在开始几分钟 minutes, hours, days, or weeks

1.4 延迟任务的安全优化


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 来解决自动进行的周期性的维护
定时任务类似手机闹钟,会重复执行
当定时任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者


2.1 发起用户级周期行任务


2.1.1定时任务发起


在系统中我们可以使用 crontab 命令来发起用户级定时任务
在系统中 /etc/cronfilename 是系统级定时任务,只有 root 用户可以发起
定时任务执行是调用的是 crond 服务,即使系统最小化安装 crond 也会被安装到系统中
定时任务信息存放在系统中 /var/spool/cron 目录中,存放文件和发起人名称一致
定时任务的日志文件被存放到 /var/log/cron 中
定时任务执行时如果遇到系统处于关闭状态,那么在开启时 crond 任务会检测未执行的任务并且立
即执行


2.1.2发起任务

2.1.2.1.crontab命令的执行格式     crontab –u 用户 –e
[root@zh xiaohua]# crontab -u root -e
2.1.2.2设置定时任务

回车进入编辑界面, * * * * * 表示时间指每天的每小时分钟做创建文档这个任务

* * * * * touch /mnt/file{1..10}
2.1.2.3crontab命令参数如下

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

2.2 发起系统级别的周期任务


2.2.1 系统级别crontab目录详解

/etc/cron.d  系统自定义周期任务
/etc/cron.daily  每天周期任务
/etc/cron.hourly 每小时周期任务
/etc/cron.monthly 每月周期任务
/etc/cron.weekly  每周周期任务


2.2.2 创建系统级周期任务

切换到/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时

系统的延迟任务及定时任务_第6张图片                  系统的延迟任务及定时任务_第7张图片

2.2.3 定时任务执行优化


定时任务在执行时首先会查看执行者是否在名单中
系统中默认只存在黑名单 /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

你可能感兴趣的:(服务器,linux,运维)