文章目录
1. at
1.1 at设定定时任务
实验环境为我的服务器server。
1)采用watch -n 1 ls -l /tmp/song/
监控命令,监控该过程
[root@server ~]# watch -n 1 "ls -l /tmp/song"
Every 1.0s: ls -l /tmp/song Sat Aug 8 04:11:30 2020
total 0 # 此目录下现在没有任何内容
2)重新开启一个终端,用date查看一下的当前时间
[root@server ~]# date
Sat Aug 8 04:12:20 CST 2020
3)at 时间 回车,此时就可以建立任务了 ctrl+d退出
[root@server ~]# date
Sat Aug 8 04:13:53 CST 2020
[root@server ~]# at 04:15 # 建立定时任务
at> touch /tmp/song/file1 # 建立一个文件在这个目录下
at> <EOT> # ctrl+D结束
job 1 at Sat Aug 8 04:15:00 2020
可以看到04:14时还没有建立这个文件:
Every 1.0s: ls -l /tmp/song Sat Aug 8 04:14:39 2020
total 0
4)到设定的时间查看
Every 1.0s: ls -l /tmp/song Sat Aug 8 04:15:01 2020
total 0
-rw-r--r-- 1 root root 0 Aug 8 04:15 file1 # 定时任务已经执行,文件已经建立成功
1.2 at查看定时任务
at -l | 列出定时任务 |
---|---|
at -c 2 | 查看序号为2的任务 |
at -r 3 | 删除序号为3的任务 |
1)首先设定两个定时任务
[root@server ~]# at 04:22
at> touch filesong # 任务内容
at> <EOT>
job 2 at Sat Aug 8 04:22:00 2020
[root@server ~]# at 04:23
at> rm -fr filesong # 任务内容
at> <EOT>
job 3 at Sat Aug 8 04:23:00 2020
2)查看定时任务
[root@server ~]# at -l # 查看任务列表
2 Sat Aug 8 04:22:00 2020 a root
3 Sat Aug 8 04:23:00 2020 a root
3)查看第二个定时任务
[root@server ~]# at -c 2
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
XDG_SESSION_ID=42; export XDG_SESSION_ID
HOSTNAME=server.example.com; export HOSTNAME
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
SSH_CLIENT=172.25.5.250\ 47136\ 22; export SSH_CLIENT
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=/root; export PWD
XMODIFIERS=@im=ibus; export XMODIFIERS
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.5.250\ 47136\ 172.25.5.10\ 22; export SSH_CONNECTION
LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR
cd /root || {
echo 'Execution directory inaccessible' >&2
exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER3670055b'
touch filesong #真正的任务内容,其他东西是执行定时任务时的环境变量
marcinDELIMITER3670055b
3)删除第三个定时任务
[root@server ~]# at -r 3
[root@server ~]# at -l # 任务列表中就只有第二条任务了
2 Sat Aug 8 04:22:00 2020 a root
1.3 at设定延时任务
1)设定延时任务
[root@server ~]# at now+2min
at> touch /tmp/song/file3
at> <EOT>
job 5 at Sat Aug 8 04:28:00 2020
[root@server ~]# at -l
5 Sat Aug 8 04:28:00 2020 a root
2)查看延时任务是否完成
Every 1.0s: ls -l /tmp/song Sat Aug 8 04:28:04 2020
total 0
-rw-r--r-- 1 root root 0 Aug 8 04:15 file1
-rw-r--r-- 1 root root 0 Aug 8 04:26 file2
-rw-r--r-- 1 root root 0 Aug 8 04:28 file3 # 所有的任务都是整点完成
1.4 at任务的黑白名单
/etc/at.deny
:黑名单,系统中默认存在,在此文件中出现的用户不能执行at
/etc/at.allow
:白名单,系统中默认不存在,在此文件中出现的普通用户能执行at,只有在名单中的用户可以,并且/etc/at.deny失效
也就是说先看deny,除了文件中的用户,其他用户都可以使用at命令。再看allow如果使用,deny中内容失效,并且只有allow中的用户可以使用at命令。
1)设定黑名单
[root@server ~]# vim /etc/at.deny # 先写at黑名单
[root@server ~]# cat /etc/at.deny
song # song和ru用户不能设定at任务
ru
2)测试一下
[root@server ~]# su - song # 切换到song用户
[song@server ~]$ at now+1min
You do not have permission to use at. # 不能使用延时任务
[song@server ~]$ exit
logout
[root@server ~]# su - ru # 切换到ru用户
[ru@server ~]$ at now+1min
You do not have permission to use at. # 不能使用延时任务
[ru@server ~]$ exit
logout
[root@server ~]# su - yan # 切换到yan用户
[yan@server ~]$ at now+1min # 可以设定延时任务
at> touch file1
at> <EOT>
job 6 at Sat Aug 8 04:35:00 2020
黑名单外的用户可以使用at,黑名单内不能使用。
3)编辑白名单
[root@server ~]# vim /etc/at.allow # 这是一个新文件,系统中本来没有
[root@server ~]# cat /etc/at.allow
song # 白名单中有song用户
4)测试
[root@server ~]# su - song
Last login: Sat Aug 8 04:34:04 CST 2020 on pts/1
[song@server ~]$ at now+1min # 白名单中的song用户可以使用at
at> touch aaa
at> <EOT>
job 7 at Sat Aug 8 04:40:00 2020
[song@server ~]$ exit
logout
[root@server ~]# su - ru
Last login: Sat Aug 8 04:34:35 CST 2020 on pts/1
[ru@server ~]$ at now+1min # 黑名单中的ru依旧不可以使用at
You do not have permission to use at.
[ru@server ~]$ exit
logout
[root@server ~]# su - yan
Last login: Sat Aug 8 04:34:51 CST 2020 on pts/1
[yan@server ~]$ at now+1min # 不再白名单也不在黑名单中的yan用户也不能使用at
You do not have permission to use at.
[yan@server ~]$ exit
logout
注意:
-
/etc/at.allow存在/etc/at.deny就失效
-
系统本来就没有/etc/at.allow,当这个文件建立之后即使是空的,其他普通用户也不能使用at命令了,此时只有超级用户是可以定时的
-
当song同时出现在allow和deny当中时,deny会失效,因此song可以使用at命令。
2.利用crontab命令设定系统定时任务
2.1 命令介绍
1)系统控制crontab的服务
[root@server ~]# systemctl start crond.service # 执行定时任务的时候,crond.service这个服务必须开启
[root@server ~]# systemctl status crond.service
crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled)
Active: active (running) since Fri 2020-08-07 10:51:49 CST; 18h ago
# 服务开启成功
Main PID: 551 (crond)
CGroup: /system.slice/crond.service
└─551 /usr/sbin/crond -n
Aug 07 10:51:49 study.example.com systemd[1]: Started Command Scheduler.
Aug 07 10:51:49 study.example.com crond[551]: (CRON) INFO (RANDOM_DELAY will b...)
Aug 07 10:51:49 study.example.com crond[551]: (CRON) INFO (running with inotif...)
Aug 08 04:53:48 server.example.com systemd[1]: Started Command Scheduler.
Hint: Some lines were ellipsized, use -l to show in full.
2)crontab 命令后面所跟的参数
crontab [选项]
选项:
e 表示编辑
u 表示用户
l 表示列出
r 表示删除
3)具体用法:
crontab -e -u root 为root用户创建计划任务
crontab -l -u root 列出root用户的计划任务
crontab -r -u root 删除root用户的计划任务
/var/spool/cron/用户名
定时任务是放在这个文件里面的
对应用户含有自己的定时任务文件
删除任务的同时文件也就没有了,删除文件的同时任务也就没有了
4)crontab 时间表示方式
分钟 时 日 月 星期几 | 具体时间 |
---|---|
* * * * * | 每分钟 |
*/2 * * * * | 每两分钟 |
*/2 07-17 * * * | 早7-晚5每两分钟 |
*/2 */2 * * * | 每隔2小时每两分钟 |
*/2 09-17 3,5 1 | 5月的每个周四以及三月1号 |
*/2 09-17 * * 5 | 每周周五早9晚5 |
2.2 设定定时任务
1)crond服务必须开启
[root@server ~]# systemctl start crond.service # 执行定时任务的时候,crond.service这个服务必须开启
[root@server ~]# systemctl status crond.service
crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled)
Active: active (running) since Fri 2020-08-07 10:51:49 CST; 18h ago
# 服务开启成功
Main PID: 551 (crond)
CGroup: /system.slice/crond.service
└─551 /usr/sbin/crond -n
Aug 07 10:51:49 study.example.com systemd[1]: Started Command Scheduler.
Aug 07 10:51:49 study.example.com crond[551]: (CRON) INFO (RANDOM_DELAY will b...)
Aug 07 10:51:49 study.example.com crond[551]: (CRON) INFO (running with inotif...)
Aug 08 04:53:48 server.example.com systemd[1]: Started Command Scheduler.
Hint: Some lines were ellipsized, use -l to show in full.
2)crontab -e -u root 为root用户创建定时任务
[root@server ~]# crontab -e -u root
# 这是时类似于vim的编辑方式
* * * * * /bin/echo hello
# 编辑结束后,会显示
[root@server ~]# crontab -e -u root
no crontab for root - using an empty one # root没有过定时任务
crontab: installing new crontab # 新建了一个定时任务表给root用户
3)crontab -l -u root列出root用户的定时任务
[root@server ~]# crontab -l -u root
* * * * * /bin/echo hello
4)cat /var/spool/cron/root在这个文件里面可以看到定时任务
[root@server ~]# cat /var/spool/cron/root
* * * * * /bin/echo hello
5)crontab -r -u root 删除root用户的定时任务
[root@server ~]# crontab -r -u root
[root@server ~]# cat /var/spool/cron/root # 对应文件也被删除
cat: /var/spool/cron/root: No such file or directory
总结:删除任务的同时文件也就没有了,删除文件的同时任务也就没有了
2.3 文件方式设定定时任务
文件方式:
系统中的定时任务都放在/etc/cron.d
目录下,我们查看这个目录下的文件
[root@server ~]# ll /etc/cron.d/
total 16
-rw-r--r--. 1 root root 128 Jan 28 2014 0hourly
-rw-r--r--. 1 root root 108 Mar 10 2014 raid-check
-rw-r--r--. 1 root root 235 Jan 27 2014 sysstat
-rw-r--r--. 1 root root 187 Jan 28 2014 unbound-anchor
每个文件都可以使用vim的方式打开:
[root@server ~]# vim /etc/cron.d/sysstat
# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# 0 * * * * root /usr/lib64/sa/sa1 600 6 &
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A
所以我们也可以使用文件的形式执行定时任务。
2.3.1 定时执行一个目录下的所有脚本
1)定时任务多,将定时任务放在一个目录下:
[root@server ~]# mkdir /songcron # 创建个人定时文件目录
[root@server ~]# cd /songcron/
[root@server songcron]# vim test.sh # 编写定时脚本
2)编写定时脚本
[root@server songcron]# vim test.sh # 编写定时脚本
[root@server songcron]# cat test.sh
#!/bin/bash
touch /mnt/file{1..10} # 在/mnt/下建立10个文件
chmod +x /mnt/file* # 并且给这些文件执行权限
3)设定定时任务
[root@server ~]# crontab -e -u root
* * * * * root run-parts /songcron/
# * * * * * username + action 动作较少时直接写用户名字和动作
4)查看定时任务
[root@server ~]# crontab -e -u root
no crontab for root - using an empty one
crontab: installing new crontab
[root@server ~]# crontab -l -u root
* * * * * root run-parts /songcron/
2.3.2 文件方式设定
1)在目录/etc/cron.d
下建立自己的定时任务文件:
[root@server ~]# touch /etc/cron.d/filetest
2)向文件中写定时任务:
[root@server ~]# vim /etc/cron.d/filetest
[root@server ~]# cat /etc/cron.d/filetest
* * * * * root touch /mnt/filesong{1..5}
# * * * * * username action 动作较少时直接写用户名字和动作
2.4 crontab的黑白名单
与at一模一样不演示了。
/etc/cron.deny
:系统中默认存在,在此文件中出现的用户不能执行crontab
/etc/cron.allow
:系统中默认不存在,在此文件中出现的普通用户能执行crontab ,只有在名单中的用户可以,并且/etc/at.deny失效
这两个名单都不会影响/etc/cron.d/目录中定时任务的发起及执行,因为这个目录是系统级的定时任务。
3. 系统中临时文件的管理方式
临时文件具有生命周期,是生命周期结束以后会被清空
所有临时文件的清空管理都在目录:cd /usr/lib/tmpfiles.d/
在这个目录下建立自己的配置文件,来管理自己的临时文件目录:
d /mnt/song 777 root root 8s (这个目录是没有的)
目录 目录名称 权限 所有人 所有组 生命周期 这个目录的属性
生命周期是目录下面的文件的生命周期,目录的作用是作用于文件。
1)监控自己的临时文件目录:
[root@server ~]# watch -n 1 "ls -l /mnt;ls -l /mnt/song"
Every 1.0s: ls -l /mnt/;ls -l /mnt/song Sat Aug 8 05:44:40 2020
total 0
ls: cannot access /mnt/song: No such file or directory
2) 建立自己的配置文件:
[root@server ~]# cd /usr/lib/tmpfiles.d/
[root@server tmpfiles.d]# vim filesong.conf #编辑自己的临时文件目录
[root@server tmpfiles.d]# cat filesong.conf
d /mnt/song 777 root root 60s
目录 目录名称 权限 所有人 所有组 生命周期
3)systemd-tmpfiles --create /usr/lib/tmpfiles.d/*
自动建立/mnt/song
[root@server ~]# systemd-tmpfiles --create /usr/lib/tmpfiles.d/*
# watch中看到song目录出现
Every 1.0s: ls -l /mnt/;ls -l /mnt/song Sat Aug 8 05:45:55 2020
total 0
drwxrwxrwx 2 root root 6 Aug 8 05:45 song
total 0
4)临时目录下建立几个临时文件
[root@server ~]# touch /mnt/song/test{1..3}
total 0
drwxrwxrwx 2 root root 42 Aug 8 05:47 song
total 0
-rw-r--r-- 1 root root 0 Aug 8 05:47 test1 # 临时文件已经存在
-rw-r--r-- 1 root root 0 Aug 8 05:47 test2
-rw-r--r-- 1 root root 0 Aug 8 05:47 test3
4)按照周期清空临时目录下的临时文件
[root@server ~]# systemd-tmpfiles --clean /usr/lib/tmpfiles.d/*
Every 1.0s: ls -l /mnt/;ls -l /mnt/song Sat Aug 8 05:48:55 2020
total 0
drwxrwxrwx 2 root root 6 Aug 8 05:47 song
total 0
当没有执行clean时,临时文件周期到了也不会自动消失。
clean以后,目录下的文件的生命周期到了以后,才会被清除