第四章、计划任务

 

 

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  1600

         noon+4 days  

         5pmaugust 3 2016

         07190937  <---71909:37

         07190937  <---71909: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>   ctrl+D)退出并制订成功

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>   <---- ctrl + d  结束任务编辑

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  ,07都是代表星期天

*/5 2 */3 * *  不管是星期几,每月中,每隔3天的凌晨2,每隔5分钟执行一次

         51

         02:00,02:05,02:10

         53

         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.d5

 

          #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/