第四章、计划任务
4.1 使用at定义一次性的计划任务
$ sudo systemctl is-enabled atd.service 开机运行
enabled
$ sudo systemctl status atd.service 保证该服务是已经运行了的
atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled)
Active: active (running) since 六 2014-07-1909:04:06 CST; 27min ago
定义时间:
now+5min
teatimetomorrow 明天下午4点 16:00
noon+4 days
5pmaugust 3 2016
07190937 <---7月19日09:37
07190937 <---7月19日09:37没写年份就是今年,如果17年,则0719093717
编辑任务
# at -t 07190937
at> wall "can you see me?"
at>
job 1 at Sat Jul 19 09:37:00 2014
# echo "date > ~/myjob" | atnow +3min
我的操作
[student@desktop0Desktop]$ date
Sun Jun 25 15:12:13CST 2017
[student@desktop0Desktop]$
[student@desktop0Desktop]$ at -t 06251515
at> wall "canyou see me "
at>
job 1 at Sun Jun 2515:15:00 2017
[student@desktop0Desktop]$
[student@desktop0Desktop]$ atq 查看当前任务
1 Sun Jun 25 15:15:00 2017 a student
[student@desktop0Desktop]$ date
Sun Jun 25 15:14:46CST 2017
[student@desktop0Desktop]$
Broadcast message [email protected] (Sun Jun 25 15:15:01 2017):
can you see me
[student@desktop0Desktop]$
再来一次操作:
[student@desktop0Desktop]$ at now +2min
at> wall "canyou see me this time"
at>
job 2 at Sun Jun 2515:18:00 2017
[student@desktop0Desktop]$ atq
2 Sun Jun 25 15:18:00 2017 a student
[student@desktop0Desktop]$ date
Sun Jun 25 15:16:48CST 2017
[student@desktop0Desktop]$
计划生成的文件
[root@desktop0 ~]# ls/var/spool/at/a00002017d0e76
/var/spool/at/a00002017d0e76
[root@desktop0 ~]# ls/var/spool/at/
a00002017d0e76 spool
at –c 4
vim var/spool/at/a00002017d0e76
atq
atrm 4
======================================================
定义任务的队列: a-z ,A-Z, 更大的字母执行优先级更高
a队列默认给at , b队列默认给batch(当系统负载小于0.8的时候自动执行)
查看负载
[root@desktop0 /]#uptime
15:36:25 up 3:07, 2 users, load average: 0.01, 0.06, 0.06
[root@desktop0 /]#
Batch马上执行(负载小于0.8)
# at -q g teatime tomorrow
# at -q b 16:05 tomorrow
如果任务比较复杂,命令比较多,可以把操作编辑成shell脚本:
# at -t 07190950 -f /path/to/app.sh
# atq 查看用at定义的计划任务
1 SatJul 19 09:37:00 2014 a root
# at -t 07190950
at> echo "log into file" >/tmp/log.txt
at> echo "can you see me?">> /tmp/log.txt
at>
job 2 at Sat Jul 19 09:50:00 2014
# at -c 2 查看编号为2的任务的具体代码
# atrm 2 删除编号为2的任务
[root@desktop0 ~]#echo "date >/myjob" | at now+3min
job 3 at Sun Jun 2515:31:00 2017
[root@desktop0 ~]#atq
3 Sun Jun 25 15:31:00 2017 a root
[root@desktop0 ~]#date
Sun Jun 25 15:29:00CST 2017
[root@desktop0 ~]# at-c 3
#!/bin/sh
# atrun uid=0 gid=0
# mail student 0
umask 22
XDG_VTNR=1; exportXDG_VTNR
XDG_SESSION_ID=1;export XDG_SESSION_ID
HOSTNAME=desktop0.example.com;export HOSTNAME
SHELL=/bin/bash;export SHELL
HISTSIZE=1000; exportHISTSIZE
USER=root; exportUSER
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:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin;export PATH
PWD=/root; export PWD
LANG=en_US.UTF-8;export LANG
HISTCONTROL=ignoredups;export HISTCONTROL
SHLVL=1; export SHLVL
XDG_SEAT=seat0;export XDG_SEAT
HOME=/root; exportHOME
LOGNAME=root; exportLOGNAME
LESSOPEN=\|\|/usr/bin/lesspipe.sh\%s; export LESSOPEN
cd /root || {
echo 'Execution directory inaccessible'>&2
exit 1
}
${SHELL:-/bin/sh}<< 'marcinDELIMITER21901fb4'
date >/myjob
marcinDELIMITER21901fb4
[root@desktop0 ~]# ls/home/student/myjob
ls: cannot access/home/student/myjob: No such file or directory
[root@desktop0 ~]#atq
3 Sun Jun 25 15:31:00 2017 a root
[root@desktop0 ~]#
验证结果
[root@desktop0 /]# cat myjob
Sun Jun 25 15:31:01 CST 2017
[root@desktop0 /]#
先编辑一个文件,再显示出来
[root@desktop0 /]# at now +1min -f /myjob
job 7 at Sun Jun 25 15:42:00 2017
[root@desktop0 /]#
cat myjob
echo "123"
echo "abc"
echo "can you see my, i am in my job"
[root@desktop0 /]# at now +1min -f /myjob
job 11 at Sun Jun 25 15:48:00 2017
[root@desktop0 /]# atq
4 Sun Jun 2515:37:00 2017 b root
11 Sun Jun 2515:48:00 2017 a root
[root@desktop0 /]# date
Sun Jun 25 15:47:04 CST 2017
[root@desktop0 /]# at -c 11
#!/bin/sh
# atrun uid=0 gid=0
# mail student 0
umask 22
XDG_VTNR=1; export XDG_VTNR
XDG_SESSION_ID=1; export XDG_SESSION_ID
HOSTNAME=desktop0.example.com; export HOSTNAME
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
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:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin;export PATH
PWD=/; export PWD
LANG=en_US.UTF-8; export LANG
HISTCONTROL=ignoredups; export HISTCONTROL
SHLVL=1; export SHLVL
XDG_SEAT=seat0; export XDG_SEAT
HOME=/root; export HOME
LOGNAME=root; export LOGNAME
LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
OLDPWD=/home; export OLDPWD
cd / || {
echo 'Execution directory inaccessible'>&2
exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER019ea5a8'
echo "123"
echo "abc"
echo "can you see my, i am in my job"
marcinDELIMITER019ea5a8
[root@desktop0 /]# date
Sun Jun 25 15:47:30 CST 2017
4.2 crond指定周期性的计划任务: 在指定的时间重复执行
保证服务开机是自动启动,并且当前状态也是运行状态:
# systemctl is-enabled crond
enabled
[root@desktop0 ~]# systemctl status crond
crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled)
Active: active (running) since Sat 2014-07-19 09:19:39 CST; 27min ago
MainPID: 546 (crond)
如果不是开机启动的,可以手工设定为开机自动启动:
# systemctl enable crond
如果当前是inactive状态的,需要马上启动该服务:
# systemctl start crond
每个用户默认清情况下,都可以使用命令crontab设定计划任务
# crontab -e
* * * * * date >> /tmp/date.txt 每分钟
*/5 * * * * echo "uplooking" >> /tmp/upl.txt 每5分钟执行一次
0 13 * * * /sbin/init 0 每天下午13点整
30 02 1,15 * * echo "crond jobs" >> /tmp/uplooking.txt 每个月1号,15号执行一次
时间的语法还有:
*/2 每2???
1,2,5
1-14
1-5,10-15
时间的取值范围:
分钟 0-59
小时 0-23
日 1-31
月 1-12
星期 0-7 ,0和7都是代表星期天
*/5 2 */3 * * 不管是星期几,每月中,每隔3天的凌晨2点,每隔5分钟执行一次
5月1日
02:00,02:05,02:10
5月3日
02:00,02:05,02:10,...02:58
# crontab -l 查看自己的计划任务
# crontab -l -u student 管理员可以查看其他帐号的任务
# crontab -r 删除当前用户的所有计划任务
可以通过查看日志,判断计划任务是否被顺利执行
# vim /var/log/cron
...
# cat /etc/cron.deny <----一个用户名一行,表示那些用户不能使用crontab命令编辑计划任务
student
# vim /etc/cron.allow 该文件默认是没有,里面指定了哪些用户可以使用命令制定计划任务。如果该文件存在,那么cron.deny就会失效
student
同时root可以直接编辑 /etc/crontab文件制定任务
# vim /etc/crontab
* * * * * root date >> /tmp/date.txt
*/2 * * * * student echo "i am student" >> /tmp/student.txt
*/5 * * * * root echo "uplooking" > /dev/null
^^^^^ 必须指定执行该任务的身份
* * * * * date >> ~/mycrondjob.txt
分钟 小时 天 月 星期
[root@desktop0 /]# cat ~/mycrondjob.txt
Sun Jun 25 16:48:02 CST 2017
Sun Jun 25 16:49:01 CST 2017
[root@desktop0 /]# crontab -l
* * * * * date >> ~/mycrondjob.txt
[root@desktop0 /]# cat ~/mycrondjob.txt
Sun Jun 25 16:48:02 CST 2017
Sun Jun 25 16:49:01 CST 2017
[root@desktop0 /]# cat/var/spool/cron/root 会产生相应的文件
*/2 * * * * date >>~/mycrondjob.txt
4.3 管理临时文件
开机运行服务systemd-tmpfiles-setup,该服务调用以下命令:
systemd-tmpfiles--create --remove 读取以下配置文件:
/usr/lib/tmpfiles.d/*.conf,/run/tmpfiles.d/*.conf, and /etc/tmpfiles.d/*.conf
删除需要删除的文件、目录,创建需要的目录、文件,修复权限等
在长期开机运行的系统中,rhel7会有一个systemd-tmpfiles-clean.timer单元模块保证定义执行以下命令对临时文件进行管理:systemd启动后,15分钟后将运行systemd-tmpfiles-clean服务,并且每24小时候重复执行
systemd-tmpfiles--clean 该命令不会创建或修改文件目录,只会删除超过指定时间未被访问过的文件
语法:tmpfiles.d(5)
#Type Path Mode UID GID AgeArgument
d /run/user 0755 root root 10d -
d 目录不存在则创建
systemd-tmpfiles--create --remove 目录不存在会自动创建,如果目录存在,不管文件是否过期,都不会清空目录
systemd-tmpfiles--clean 目录不存在也不会创建,如果目录存在,只会删除目录里超过指定时间未被访问过的文件
D 创建目录或者清空目录
systemd-tmpfiles--create --remove 目录不存在会创建,如果目录存在,不管文件是否过期,都会被清空
systemd-tmpfiles--clean 目录不存在也不会创建,如果目录存在,只会删除目录里超过指定时间未被访问过的文件
例子:
d/run/systemd/seats 0755 root root - 目录不存在会自动建立,目录存在,不会自动清空目录 (除非最后一列 - 以时间代替)
D/home/student 0700 student student 1d 目录不存在会自动建立,目录存在,会清空目录,当systemd-tmpfiles —-clean 会删除已经超过一天没有改变的文件
练习1:
更改/tmp/目录的临时文件默认管理选项。把配置文件从/usr/lib/tmpfiles.d/tmp.conf 拷贝到 /etc/tmpfiles.d/ ,并且把目录的管理周期从10天修改成5天
# cp /usr/lib/tmpfiles.d/tmp.conf/etc/tmpfiles.d/
# vim /etc/tmpfiles.d/tmp.conf
d /tmp 1777 root root 5d <---把原来的10d修改成5d
编辑完毕,执行该命令,让其应用新的配置选项
# systemd-tmpfiles --clean tmp.conf
练习:
假设 lee 服务(程序)会调用 临时目录/run/lee,要求该目录下的内容超过30秒未被访问都会被删除,而且该目录只有root可以读写
1、定义一个配置文件
# vim /etc/tmpfiles.d/lee.conf
d /run/lee 0700 root root 30s
测试
# systemd-tmpfiles --create lee.conf
--create发现目录不存在,就会自动创建,如果目录存在,会判断权限是否正确,不正确会自动纠正
创建一个文件
# touch /run/lee/test
等待30秒
# sleep 30s
手工执行该命令,并且根据指定的配置文件进行管理临时文件
# systemd-tmpfiles --clean lee.conf
# ls /run/lee/