任务计划命令
mail,at,batch,crond,sleep
邮件服务工作模式:
发 代理 -> stmp --> smtp --> 投递代理 --> 邮筒 --> pop3,imap4 <-- 代理 <-- 收
at,mail,batch,cron 命令均建议用完整路径或在脚本中定义 PATH
特点:
mail -s '主题' [email protected] 发邮件
batch 根据负载选定命令执行时间
at HH:MM am|pm [YYYY-MM-DD] 到点支行内容中的命令
内容生成:
mail 不支持 - f FILE 生成内容。 at 支持 -f FILE 运行文件中的命令
支持管道: echo "STRING" | COMMAND
支行输入重定向: COMMAND < file
普通 ctrl + d
1)到点下载 (at) 或内核决策下载(batch)
2)定期备份 (crontab)
3) 磁盘满了给 root 发 mail(mail -s'' root)
每晚 0 点检查磁盘是否容量是否达到 40%
- 0 0 * * * root / bin / echo - e "$(/bin/df -hP | /bin/grep -v ^Filesystem | /bin/awk -v percent=40 '{split($5,ARRAY,"\ % "); if (ARRAY[1] >= percent){A[$NF]++}}END {for (i in A) {print i}}') \n amost full" | / bin / mail - s 'hello xue' root
sleep #{s,m,h}
周期性任务计划位置: /etc/crontab, /var/spool/cron/USERNAME(普通用户不可读写)
格式:
/etc/crontab
* * * * * username command
/var/spool/cron/USERNAME
* * * * * command
邮件服务
mail 监听端口 53/127.0.0.1 监听在本机只能本机的用户通信
smtp: 邮件传输协议:发邮件服务, 支持投递代理
pop3: 邮局协议:收邮件服务
imap4: 收邮件服务
工作模式:
1、发邮件:本地客户端代理 (foxmail,uplook) 发邮件,直接发送邮件给 smtp 服务器,smtp 解析目标域名,将邮件发给对方的发邮件服务器(smtp)
2、收邮件:本地的发邮件服务器 (smtp) 通过投递代理将邮件投递至对应用户的邮筒中,对方用户用本地代理 (foxmail,uplook,linux 雷鸟) 接收邮件,连接收邮件服务器 (pop3,imap4) 并检索邮筒,取出邮件
邮筒:(更强大:mail dir , mail box)
/var/spool/mail/USERNAME
发邮件命令
mail -s '主题' [email protected]
邮件正文格式
1、交互写完,Ctrl + d
2、非交互, mail -s '主题' < file
3、非交互, echo "内容" | mail -s '主题' [email protected]
查看邮件:
# mail 查看所有邮件
# num 查看指定号码邮件
退出: q
使用示例
1、方法一
1)给 root 发邮件
# mail -s 'hello' [email protected]
hello everyone.. ## 输入邮件正文
EOT ## 输入完毕,。"Ctrl + d" 提交操作
2)mail 查看邮件
# mail
>N 1 root Thu Aug 24 21:58 18/617 "hello"
3)显示第一封邮件
& 1
hello everyone.. ## 邮件的具体内容
2、方法二
1)给 root 发邮件
# echo '内容' | mail -s '标题' [email protected]
2)mail 查看邮件
# su - gentoo -c 'mail'
>>N 1 root Thu Aug 24 22:04 18/625 "标题"
3)显示第一封邮件
& 1
内容
4)管理员不能接收 普通用户的邮件
3、方法三
1)给 root 发邮件
# echo timezone > /tmp/file
# mail -s '标题' [email protected] < /tmp/file
2)mail 查看邮件
# su - gentoo -c 'mail'
1 root Thu Aug 24 22:04 19/636 "标题"
>N 2 root Thu Aug 24 22:17 18/630 "标题"
3)显示第二封邮件
& 2
timezone
4)管理员不能普通用户的邮件
& 2
> 1 root Thu Aug 24 21:58 19/628 "hello"
at,batch,crond 实现方式
1、at: 在确定时间点执行一次
2、batch:在负载小时执行
3、crontab 或 / etc/crontab: 在确定时间点执行 N 次
目的:重复的事情,将来某时刻要做的事情,可以通过周期任务计划完成
1)如果有自己喜欢的电影,公司服务器,晚上访问量小,带宽使用小,此时用个 at 让晚上下载一个 "战狼 2",第二天来看。或白天用 batch 命令,下载,让内核决定什么时候下载。
2)如何每天 0 点对数据库备份或 etc 目录备份。对于每天重复的事情 crontab 可以解决
3) 磁盘满了给 root 发 mail
at 命令
at [OPTIONS...] TIME
- TIME:
- HH:MM [AM|PM] [YYYY-MM-DD]
- now +#{minutes,hours,days,weeks}
- today,tomorrow
- -t [[CC]YY]MMDDDhhmm
- midnight,noon,teatime (4pm)
- 选项:
- -q QUEUE 小写队列由at模式执行,大写队列由batch模式执行。[a-z][A-Z]
- # at -q b TIME (at)
- # at -q B (batch)
- -l 相当于 atq 列出等待运行的作业
- -d job_num 相当于 atrm 删除指定的作业
- -c job_num 显示指定作业执行结果及相关变量
- -f FILE 从文件读取命令
- -m 默认发邮件,即使没有输出也发邮件
- -M 不发邮件给用户
- -v 显示任务何时执行
- 注意:
- 1、at 中的PATH不是继承bash中的PATH:
- 1)命令给出完整路径。
- 2)at运行脚本,脚本中定义PATH,用不完整的路径。
- 2、如果/etc/at.allow文件存在,(白名单)仅有定义在此文件中的用户可以使用at
- 如果at.allow不存在:
- /etc/at.deny存在:(黑名单)仅定义在此文件中的用户不可以使用at
- /etc/at.deny不存在,所有普通用户可使用at
- (***以上对管理员root无效)
batch 命令内核探测到系统负载低于 0.8 时或低于由 atd 指定的百分比时才执行命令 (由内核决定什么运行,类似于异步 IO)
使用示例
时间表示法,今晚 12:00 下载. 9999....
写出时间用 - v 命令确认任务执行的时间
- # at -v 0am 2017-08-25
- Fri Aug 25 00:00:00 2017
1)方法一
- # at -v 0am 2017-08-25
- at> /usr/bin/wget -c -P /PRIMARY http://dl135.80s.im:920/1708/战l2[高清抢先版]/战l2[高清抢先版].mp4 > /dev/null
- at> <EOT> ---------------------------------------- 此命令表示CTRL + d
- job 2 at 2017-08-25 00:00
2)方法二
- # /bin/echo " /usr/bin/wget -c -P /PRIMARY http://dl135.80s.im:920/1708/战l2[高清抢先版]/战l2[高清抢先版].mp4 &> /dev/null" | at 0am 2017-08-25
- job 7 at 2017-08-25 00:00
3)方法三
- 1、将命令写入文件
- # echo "/bin/echo 123" > /tmp/file
- 2、重定向标准输入
- # at now < /tmp/file
- 3、查询
- >N 4 root Thu Aug 24 22:34 14/491 "Output from your job 6"
- N 5 root Thu Aug 24 22:36 14/491 "Output from your job 8"
- 4、查看序号5
- & 5
- 123
- 5、退出
- & q
# batch
at> /usr/bin/wget -c -P /root/ZhanLang_2 http://dl135.80s.im:920/1708 / 战 l2[高清抢先版]/ 战 l2[高清抢先版].mp4 > /dev/null
at> <EOT>
job 11 at 2017-08-24 22:45
周期性任务计划
任务类型
系统任务: /etc/crontab
用户任务: crontab -e (/var/spool/cron/USERNAME, 普通用户不可读,写)
为什么普通用户没有对 / var/spool/cron/USERNAME,box 的读写权限仍可以修改文件呢?
1、suid?
2、普通用户使用 crond 服务提供的命令,crontab,而服务进程的属主是 root, 注意前方高能...............................
运行 crontab 为一个进程,进程属主为 root, 文件仅对 root 有读写权限。进程的安全上下文件中说明 "用户对文件的权限,取决于用户运行命令为进程后,进程属主对文件的权限 / 进程对文件的权限取决于 发起进程的用户" 有什么区别?
crond 服务或 crontab 命令由哪些程序包所提供
# rpm -q --whatprovides /usr/bin/crontab
cronie-1.4.4-16.el6_8.2.i686
# rpm -qa | fgrep cron
cronie:主程序包,提供 cron 守护进程及相关辅助工具
cronie-anacron:补充程序包,监控 cronie 任务执行状况:如 cronie 中的任务在过去时间点未能正常运行,则 anacon 会随后启动一次此任务。
crontabs: 系统维护任务,提供任务文件或目录
系统任务
- SHELL=/bin/bash
- PATH=/sbin:/bin:/usr/sbin:/usr/bin ## 在当前文件中定义的任务可以在这些文件中查找命令
- MAILTO=root ## 邮件发给谁
- HOME=/
- # 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
username 以指定用户的身份
command 被指定用户执行命令
时间点表示方式
1、精确: #
2、离散 (线性地址和物理地址):1,3,5
3、连续:1-5
4、步长:*/5 每 5 小时, 20-50/5: 第 20-50 分钟内每 5 分钟
使用示例
以 root 身份运行命令,每分钟
- SHELL=/bin/bash
- PATH=/sbin:/bin:/usr/sbin:/usr/bin
- MAILTO=root
- HOME=/
- # * * * * * user-name command to be executed
- * * * * * root /bin/echo /bin/date +"\%F \%T" >> /root/a.txt
- tail -f /root/a.txt
- 2017-08-24-23:13:01
- 2017-08-24-23:14:01
- 2017-08-24-23:15:01
- 2017-08-24-23:16:01
以 root 身份运行命令,每小时的 21,23,24 分钟
- 23,21,24 * * * * root /bin/echo `/bin/date +"\%F-\%T"` >> /root/b.txt
- tail -f /root/b.txt
- 2017-08-25-00:21:01
- 2017-08-25-00:23:01
- 2017-08-25-00:24:01
以 root 身份运行命令,每小时 1-3 分钟
- 53 - 55 * * * * root / bin / echo ` / bin / date + "\%F-\%T"` >> / root / c.txt
- tail -f c.txt
- 2017-08-25-00:53:01
- 2017-08-25-00:54:01
- 2017-08-25-00:55:01
以 root 身份运行命令,在 57-59 分钟内每分钟。
- 57 - 59 * * * * root / bin / echo ` / bin / date + "\%F-\%T"` >> / root / d.txt
- 2017-08-25-00:57:01
- 2017-08-25-00:58:01
- 2017-08-25-00:59:01
用户任务
- # 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
- # | | | | |
- # * * * * * command to be executed
** 任务格式,与 / etc/crontab 文件,不能指定用户身份
1、保证 crond 服务运行
6 service crond status
7 systemctl status crond.service
2、编辑任务
系统: vim /etc/crontab
用户: crontab -e
3、查看任务
crontab -l
4、删除单个任务..................................(再编辑)
5、清空任务
crontab -r
6、交互式清除任务
crontab -r -i
注意:
1、每个 crontab 命令定义任务执行的结果后,同 at 会发给 root 用户
只接收执行错误的内容:COMMAND > /dev/null
保证命令准确,路径完整:COMMAND &> /dev/null (都不收)
2、命令中不可以直接使用 %, 需要转义, \% 或 '%'
3、crontab 中定义的命令从 crontab 自带的 PATH 变量中查找
定义在 / etc/crontab 中
4、root 用户可以管理普通用户的任务计划
crontab 命令
-u USER 仅 root 可运行,为指定用户管理 cron 任务;
-i/-r/-l/-e
使用示例
以 root 身份运行命令
在 root 用户登陆界面下,crontab 即可
- [[email protected]/* */ ~]# crontab -e
- PATH=/bin:/sbin:/usr/bin:/usr/sbin
- * * * * * echo `date +%F_%T` >> ~/tmp/a.file
- [[email protected]/* */ ~]# tail -f tmp/a.file
- 2017-08-25_14:50:01
- 2017-08-25_14:51:01
- 2017-08-25_14:52:01
- 2017-08-25_14:53:01
以 gentoo 用户运行命令,
- [[email protected]/* */ ~]# crontab -e
- * * * * * /bin/echo $(date +\%F_\%T) >> ~/tmp/a.file
- [[email protected]/* */ ~]# crontab -u gentoo -e
- [[email protected]/* */ ~]# crontab -u gentoo -l
- * * * * * /bin/echo 12345678899000 | /bin/mail -s '标题' root
- 回到root,过1分钟,查看mail
- [[email protected]/* */ ~]# mail
- 12345678899000
来源: http://www.bubuko.com/infodetail-2278802.html