Linux学习之路-Linux-at及cron命令【7】---20171215
ntpdate 命令
[root@Centos6~]#ntpdate 172.18.0.1 -------->ntpdate 命令跟服务器同步时间
18 Dec 21:16:25 ntpdate[7932]: step time server 172.18.0.1 offset 412750.511124 sec
[root@Centos6~]#date
2017年 12月 18日 星期一 21:16:35 CST
[root@Centos6~]#ll /usr/bin/at
-rwsr-xr-x. 1 root root 54464 3月 22 2017 /usr/bin/at -------->具有SUID权限
cron 命令
- 周期性任务计划:cron
相关的程序包:
- cronie: 主程序包,提供crond守护进程及相关辅助工具
Cronie包含在预定时间运行指定程序的标准UNIX守护进程crond和相关工具。 它是原来的vixie-cron的一个分支,并具有像使用pam和SELinux一样的安全和配置增强功能
- cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
anacron是cronie的一部分,用于定期运行的工作,没有确切的执行时间。anacron的默认设置执行每日,每周和每月的工作,但是anacron允许设置任意的工作周期。使用anacron可以运行周期性作业,即使系统经常关闭,也可以随机执行作业执行时间,以更好地利用多个系统之间共享的资源
- crontabs:包含CentOS提供系统维护任务
fedora主要使用这个包来通过cron来执行文件。crontabs软件包包含root crontab文件和目录。将需要安装cron守护进程以从crontabs运行作业。cron守护程序(如cronie或fcron)会检查crontab文件以查看特定命令何时执行。 如果命令被安排,它执行它们。Crontabs处理一个基本的系统功能,所以它应该安装在系统上
[root@Centos6~]#cat /etc/crontab ----------->查看系统计划任务文件内容格式 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin ---------->PATH变量路径,所以建议可执行程序建议写全完整路径 MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 11 10 * * * L wall hello [root@Centos6~]#cat /var/log/cron ----------->查看日志文件 ........ Dec 19 10:11:01 Centos6 crond[2056]: (*system*) RELOAD (/etc/crontab) Dec 19 10:11:01 Centos6 CROND[8922]: (L) CMD (wall hello)
- 注意:命令执行的日期可以由两个字段指定 - 日期和星期几。如果两个字段都受限制(即不是 * ),则当任一字段与当前时间匹配时,将运行该命令。
例如,“30 4 1,15 * 5”将会在每个月的1号和15号以及每个星期五的凌晨4点30分执行命令。
如果就想既是1,15号并且是星期5,就需要在计划任务后加脚本,在脚本内判断是否是星期5,如果是星期五在执行脚本,这样就能达到既是1,15号并且是星期5的需求[root@Centos6~]#day=`date +%w`;[ "$day" = "2" ] && echo 2 ---------->判断今天是否是星期2 2
- 计划任务时间表示法
1) 特定值:给定时间点有效取值范围内的值
2) */10 给定时间点上有效取值范围内的所有值 表示“每...”
3) 离散取值 :1,3,4
4) 连续取值 :1-5
5) 在指定时间范围上:定义步长 /#: #即为步长
6) 用'@'字符修正:
@reboot: 重启后运行一次。
@yearly: 每年运行一次,即。 0 0 1 1
@annually:每年运行一次,即。 0 0 1 1
@monthly: 每月运行一次,即。 0 0 1
@周: 每周运行一次,即。 0 0 0
@daily: 每天运行一次, 即。 0 0
@hourly: 每小时运行一次,即。 0
示例: 0 /3 * centos /bin/echo “howdy”;/usr/bin/wall “welcome!” --------->每3小时echo和wall命令[root@Centos6app]#vim /etc/crontab 0 1 * * * root /bin/tar Jcf /app/backup`date +\%F -d "-1 day"`.tar.xz /etc &>/dev/null ------->%需要转义 [root@Centos6app]#ll -h -rw-r--r--. 1 root root 6.2M 12月 19 01:00 backup2017-12-18.tar.xz [root@Centos6app]#cat /var/log/cron Dec 19 01:00:01 Centos6 CROND[10418]: (root) CMD (/bin/tar Jcf /app/backup`date +%F -d "-1 day"`.tar.xz /etc &>/dev/null) **注意:对于cron任务来讲,% 有特殊用途;如果在命令中要使用 %, 则需要转义,将 % 放置于单引号中,则可不用转义**
- 确保crond守护处于运行状态:
CentOS 7:systemctl status crond
CentOS 6:service crond status[root@Centos7~]#service crond status -------这条旧命令其实引用的就是/bin/systemctl status crond.service 这条命令 Redirecting to /bin/systemctl status crond.service ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 5h ago Main PID: 955 (crond) CGroup: /system.slice/crond.service └─955 /usr/sbin/crond -n [root@Centos7~]#systemctl status crond.service atd ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 5h ago Main PID: 955 (crond) CGroup: /system.slice/crond.service └─955 /usr/sbin/crond -n 12月 17 16:21:13 Centos7.L systemd[1]: Started Command Scheduler. 12月 17 16:21:13 Centos7.L systemd[1]: Starting Command Scheduler... 12月 17 16:21:13 Centos7.L crond[955]: (CRON) INFO (RANDOM_DELAY will be scaled with f...d.) 12月 17 16:21:14 Centos7.L crond[955]: (CRON) INFO (running with inotify support) ● atd.service - Job spooling tools Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled) Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 5h ago Main PID: 958 (atd) CGroup: /system.slice/atd.service └─958 /usr/sbin/atd -f 12月 17 16:21:13 Centos7.L systemd[1]: Started Job spooling tools. 12月 17 16:21:13 Centos7.L systemd[1]: Starting Job spooling tools... Hint: Some lines were ellipsized, use -l to show in full.
系统的计划任务
- anacron系统
运行计算机关机时cron不运行的任务,CentOS6以后版本 取消anacron服务,由crond服务管理
对笔记本电脑、台式机、工作站、偶尔要关机的服务器及其 它不一直开机的系统很重要对很有用
配置文件:/etc/anacrontab,负责执行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly中系统任务。字段1:如果在这些日子里没有运行这些任务......
字段2:在重新引导后等待这么多分钟后运行它
字段3:任务识别器,在日志文件中标识
字段4:要执行的任务由/etc/cron.hourly/0anacron执行
当执行任务时,更新/var/spool/anacron/cron.daily 文件 的时间戳[root@Centos6anacron]#cat /etc/anacrontab --------> 查看anacrontab配置文件信息 #/etc/anacrontab: configuration file for anacron #See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root #the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 #the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly`
/etc/crontab ----------> 计划任务的总配置文件,只有root用户可以直接使用
[root@Centos6~]#ll /etc/crontab
-rw-r--r--. 1 root root 456 12月 19 01:02 /etc/crontab
/etc/cron.d/ 配置文件 ----------->计划任务配置文件存放的位置,不建议全部都在/etc/crontab 文件中修改,以免因任务过多,导致错乱
[root@Centos6profile.d]#ll /etc/cron.d/
-rw-r--r--. 1 root root 113 8月 24 2016 0hourly
-rw-------. 1 root root 108 1月 26 2017 raid-check
-rw-------. 1 root root 235 3月 22 2017 sysstat
/etc/cron.hourly/ -----------> 每小时需要执行的计划任务存放位置,0anacron脚本就是anacron服务的配置文件,
[root@Centos6~]#ll /etc/cron.hourly/ 因关机没有执行的计划任务,开机后每小时检查一次,然后继续执行相关计划任务
-rwxr-xr-x. 1 root root 409 8月 24 2016 0anacron
[root@Centos6~]#cat /etc/cron.hourly/0anacron
#!/bin/bash
# Skip excecution unless the date has changed from the previous run
if test -r /var/spool/anacron/cron.daily; then
day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
exit 0;
fi
# Skip excecution unless AC powered
if test -x /usr/bin/on_ac_power; then
/usr/bin/on_ac_power &> /dev/null
if test $? -eq 1; then
exit 0
fi
fi
/usr/sbin/anacron -s
/etc/cron.daily/ ----------->系统每天要执行的计划任务,这些计划任务都是软件安装时自动形成的脚本,需要系统每天执行的任务就会放到这个文件夹内
[root@Centos6profile.d]#ll /etc/cron.daily/
-rwx------. 1 root root 118 3月 22 2017 cups
-rwx------. 1 root root 180 7月 10 2003 logrotate
-rwx------. 1 root root 927 3月 22 2017 makewhatis.cron
-rwx------. 1 root root 189 1月 26 2015 mlocate.cron
-rwxr-xr-x. 1 root root 2126 7月 19 2013 prelink
-rwxr-xr-x. 1 root root 563 11月 23 2013 readahead.cron
-rwxr-xr-x. 1 root root 433 11月 7 2015 tmpwatch
/etc/cron.weekly/ -----------> 每星期需要执行的计划任务存放位置
/etc/cron.monthly/ -----------> 每月期需要执行的计划任务存放
[root@Centos6profile.d]#ll /etc/cron
cron.d/ cron.deny cron.monthly/ cron.weekly/
cron.daily/ cron.hourly/ crontab
管理临时文件
- CentOS6使用/etc/cron.daily/tmpwatch定时清除临时文件
- CentOS7使用systemd-tmpfiles-setup服务实现
- 配置文件
/etc/tmpfiles.d/.conf
/run/tmpfiles.d/.conf
/usr/lib/tmpfiles/*.conf - /usr/lib/tmpfiles.d/tmp.conf
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d - 命令:
systemd-tmpfiles –clean|remove|create configfile
corntab 命令:用户cron计划任务
- crontab命令定义,每个用户都有专用的cron任务文件
/var/spool/cron/USERNAME
- crontab命令:
用法:crontab [-u user] [-l | -r | -e] [-i]
常用选项
-l: 列出所有任务;
-e: 编辑任务;
-r: 移除所有任务; -i:同-r一同使用,以交互式模式移除指定任务
-u user: 仅root可运行,指定用户管理cron任务 - 控制用户执行计划任务: /etc/cron.{allow,deny}
[root@Centos6~]#ls /var/spool/cron/L --------->普通用户存放cron计划任务配置文件的位置 /var/spool/cron/L [root@Centos6~]#crontab -l -u L --------->-l 选项只能查看自己的配置文件信息,如果需要查询他人的,需要加-u 选项 * * * * * wall hello ---------> **配置内容不需要增加用户信息这项** [root@Centos6cron]#ll /usr/bin/crontab ---------->**crontab 命令具有SUID权限** -rwsr-xr-x. 1 root root 51784 8月 24 2016 /usr/bin/crontab [root@Centos6anacron]#vim /etc/profile.d/env.sh --------> 默认crontab -e 配置内容使用的vi软件,不具有vim功能,故可以修改默认的软件设置。 export EDITOR=vim [root@Centos6~]#ll /var/spool/cron/ -d drwx------. 2 root root 4096 12月 19 14:55 /var/spool/cron/
at 命令
- at、batch 命令是从标准输入或指定的文件中读取,将在稍后执行的命令
- batc命令将在系统负载水平下降到特定水平时执行命令
- atq 命令列出用户的待处理作业,除非用户是超级用户;在这种情况下,每个人的工作都被列出来了。
- atrm 命令删除由工作号码标识的工作
[root@Centos6~]#chkconfig --list atd --------> Centos6 上查看at命令是否开机自动启动
atd 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
[root@Centos6~]#runlevel
5 3
[root@Centos6~]#chkconfig atd on -------->如果不是开机启动,就用这条命令设置为开机启动
[root@Centos7~]#systemctl is-enabled atd.service --------->Centos7 上查看at命令是否开机启动
enabled
[root@Centos7~]#systemctl enable atd
- 执行方式:
- 1)交互式 2)输入重定向 3)at –f 文件
- 依赖与atd服务,需要启动才能实现at任务
- at队列存放在/var/spool/at目录中
[root@Centos7~]#systemctl status atd
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 4h ago
Main PID: 958 (atd)
CGroup: /system.slice/atd.service
└─958 /usr/sbin/atd -f ----------> 调用的就是/usr/sbin/atd 这个程序,958就是PID
[root@Centos7~]#ps aux | grep atd
root 958 0.0 0.0 25856 916 ? Ss 16:09 0:00 /usr/sbin/atd -f
[root@Centos6~]#at 21:25 ---------->交互式用法
at> wall ready to off work
at> <EOT>
job 1 at 2017-12-18 21:25
[root@Centos6~]#at -l
1 2017-12-18 21:25 a root
[root@Centos6~]#ls /var/spool/at/ -l
-rwx------. 1 root root 3232 12月 18 21:21 a000010180ede5 --------->执行后就会自动删除文件
drwx------. 2 daemon daemon 4096 3月 22 2017 spool
[root@Centos6~]#at 21:27
at> hostname --------->计划任务无法打印标准输出内容,执行成功后的信息以邮件方式发给发起者
at> <EOT>
job 3 at 2017-12-18 21:27
[root@Centos6~]#hostname
Centos6.L
You have mail in /var/spool/mail/root
[root@Centos6~]#mail
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 root Mon Dec 18 21:27 14/421 "Output from your job 3"
& 1
Message 1:
From root@Centos6.L Mon Dec 18 21:27:01 2017
Return-Path: <root@Centos6.L>
X-Original-To: root
Delivered-To: root@Centos6.L
Subject: Output from your job 3
To: root@Centos6.L
Date: Mon, 18 Dec 2017 21:27:01 +0800 (CST)
From: root@Centos6.L (root)
Status: R
Centos6.L ---------> at命令执行成功的信息,所以计划任务以及脚本建议标准输出直接到&>/dev/null
&
[root@Centos6~]#at 21:37 <<EOF --------->在脚本中可以使用这样方法输入配置
> wall Good night! --------->但建议把脚本的路径添加上,因为默认的PASH变量路径可能有一定出入
> EOF
job 5 at 2017-12-18 21:37
[root@Centos6~]#at -c 5 --------->查看at计划任务的信息
#!/bin/sh
# atrun uid=0 gid=0
..........
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin; export PATH ------->变量地址
${SHELL:-/bin/sh} << 'marcinDELIMITER3692b1dd'
wall Good night!
marcinDELIMITER3692b1dd
[root@Centos6~]#echo -e "wall at job3\nwall at jobs4\nwall at jobs5"| at 21:45
job 6 at 2017-12-18 21:45
[root@Centos6~]#at -l
6 2017-12-18 21:45 a root
[root@Centos6~]#at -c 6
........
wall at job3
wall at jobs4
wall at jobs5
[root@Centos6~]#at 21:48 -m ----------->发送邮件确认
at> how are you
at> <EOT>
job 7 at 2017-12-18 21:48
[root@Centos6~]#at -l
7 2017-12-18 21:48 a root
[root@Centos6~]#mail
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/root": 2 messages 1 new
>N 2 root Mon Dec 18 21:48 14/453 "Output from your job 7"
& 2
......
Subject: Output from your job 7 --------->来自第7个计划任务
- at.allow (白名单)、at.deny(黑名单)
超级用户可以在任何情况下使用这些命令。对于其他用户,使用的权限由文件/etc/at.allow和/etc/at.deny确定
如果文件/etc/at.allow存在,则只允许在其中提及的用户名在
如果/etc/at.allow不存在,则检查/etc/at.deny,然后允许在其中未提及的每个用户名使用at
如果不存在,则只允许超级用户使用 at 命令,一个空的/etc/at.deny意味着每个用户都可以使用这些命令,这是默认配置
[root@Centos6~]#cat /etc/at.deny ---------->默认黑名单为空,所有用户都可以用at命令制定计划任务
[root@Centos6~]#cat /etc/at.allow ---------->默认没有白名单这个文件,如果使用需要手工创建
cat: /etc/at.allow: 没有那个文件或目录
-
常用参数
-m 当任务被完成之后,将给用户发送邮件,即使没有标准输出
-M 永远不会发送邮件给用户
-f 从指定的文件读取作业而不是标准输入
-l 是atq的别名
-r 是atrm的别名
-d 是atrm的别名
-v 显示在阅读作业之前作业将被执行的时间。显示的时间将采用格式“Thu Feb 20 14:50:00 1997”
-c 将命令行上列出的作业捕获到标准输出(查看具体的作业任务) - 示例
- at命令接受HH:MM形式的时间在一天的特定时间托管一个工作。(如果时间已经过去,则假定是第二天)。
- 也可以指定午夜,中午或下午茶时间(下午4点),并且可以在上午或下午晚间。
- 也可以通过在选择年份的月份名称日期中给出日期,或者给出MMDDYY或MM / DD / YY或DD.MM.YY或YYYY的日期来说明工作将在哪一天运行-MM-DD。
- 日期的规格必须遵循当天的规格。也可以给出像现在这样的时间+计算时间单位,其中时间单位可以是几分钟,几小时,几天或几周,
HH:MM 02:00
在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
HH:MM YYYY-MM-DD 02:00 2016-09-20
规定在某年某月的某一天的特殊时刻进行该项任务
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrowHH:MM[am|pm] + number [minutes|hours|days|weeks]
在某个时间点再加几个时间后才进行该项任务
now + 5 minutes
02pm + 3 days
at和crontab 对比
- 一次性作业使用 at
- 重复性作业使用crontab
Create at time crontab -e List at -l crontab -l Details at -c jobnum N/A Remove at -d jobnum crontab -r Edit N/A crontab -e
- 没有被重定向的输出会被邮寄给用户
- 根用户能够修改其它用户的作业
- 注意:运行结果的标准输出和错误以邮件通知给相关用户
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null - 对于cron任务来讲,%有特殊用途;如果在命令中要使用%, 则需要转义,将%放置于单引号中,则可不用转义
* 1) 如何在秒级别运行任务?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
* 2) 如何实现每7分钟运行一次任务?
* sleep命令:
sleep NUMBER[SUFFIX]...
SUFFIX:
s: 秒, 默认 m: 分
h: 小时
d: 天
并行运行
- 同时运行多个进程,提高效率
方法1
vi all.sh f1.sh& f2.sh& f3.sh&
方法2
(f1.sh&);(f2.sh&);(f3.sh&)
方法3
{ f1.sh& f2.sh& f3.sh& }
1、每天的2点和12点整,将/etc备份至/testdir/backup目 录中,保存的文件名称格式为“etcbak-yyyy-mm-dd-HH.tar.xz”
0 2,12 * * * root /bin/tar Jcf /testdir/backup/etcbak`date +\%Y-\%m-\%d-\%H`.tar.xz /etc &>/dev/null
2、每周2, 4, 7备份/var/log/messages文件至/logs目录中 ,文件名形如“messages-yyyymmdd”
0 0 * * 2,4,7 root /bin/tar Jcf /logs/messages-`date +\%F` /var/log/messages &>/dev/null
3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
0 */2 * * * root cat /proc/meminfo | egrep "^S|^M" >> /tmp/meminfo.txt
4、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现 任何分区利用率高于80%,就执行wall警报
*/10 0 * * 1-5 root /app/disk.sh -------->因命令内容过多,建议写到一个简单脚本中,脚本内容如下
/app/disk.sh
disk=`df | grep "/dev/sd" | sort -r | head -n1`
[ "$disk" > 80% ] && wall "disk will be full"