============
作业(job)
at & atd
at 命令只是用来生成一个脚本,并通知 atd(系统服务) 按规定时间去执行。
-l      等于 atq,即查看 at 队列 job 数量
-d #  等于 atrm #,删除job id为 # 的 job
-c #  查看 job id 为 # 的 job 的详细信息,其实就是读 /var/spool/at 目录下的某脚本文件内容
-m    任务完成后发邮件给 root,默认只是有输出到 STDOUT,STDERR 时才发邮件
-f file    把需要定时执行的命令写到文件中,让 at 去读该文件(不用 -f 的话,用输入重定向 < 也可以,如: at 05:00 < file_01;管道也可以)
at TIME
TIME格式为:
HH:MM
HH:MM YYYY-MM--DD
HH:MM + #{ minutes|hours|days|weeks }
ctrl+d 结束布置作业
如下图所示at命令的一个 job 生成一个脚本,放在/var/spool/at/下,当job完成执行后,该脚本删除
19---作业(job)
at.allow 存在,则只读at.allow 没有at.allow 才看at.deny ; 两个文件都不存在,则限制所有普通用户对at 的使用
问题0:atq 如何查到有哪些任务? ---> 应该是查看 /var/spool/at 目录下有多少脚本的文件名符合规范;我们建立两个计划任务,然后进入该目录,观察命名,我的机器上是 a0002f017bbb3b 和 a0003f017bbb3b,然后复制其中一个脚本并命名为 a0004f017bbb3b,执行 atq 得到 3 个结果(时间相同,都是07:55)。
问题1:atd 怎么知道何时去执行脚本?---> 由于 at 命令给出的时间最小粒度为 minute,所以猜测守护进程 atd 会在每分钟开始时去扫描 /var/spool/at 目录,并根据脚本文件名找到符合条件的脚本并执行。问题 0 中的任务执行完成后 /var/spool/at 目录下没有脚本了,此时建立一个名为a0002f017bbb3b 的脚本,内容随便写,然后 atq 发现该文件被识别,而且执行时间就是 07:55,由此判断 atd 是根据文件名中编入的时间和当前时间比对,以此来确定是否要执行。
问题3:atd执行脚本的时候身份如何确定?---> /var/spool/at 目录下脚本的属主是谁就以谁的身份运行。

at 队列为0时
19---作业(job)
只有root的一个job(job 内容为执行 pstree) ---> 通过mail查询
19---作业(job)<--- atd 启动一个同名子进程来读取 job 脚本
只有root的两个job(pstree)
19---作业(job)
root的一个job(pstree)& wangcai的一个job(pstree)
19---作业(job)
但最终会和上图一样,折叠了(分支一样)
-------------------------
crontab & crond
-----用户级的计划任务-----
循环执行的例行性工作调度是有 crond 这个系统服务来控制的
crontab [-u username] [ -l | -e | -r ]
-u    root为其他用户新建删除 crontab 工作调度
-l     chayue crontab的工作内容
-r     删除所有的crontab的工作内容,即把/var/spool/cron下的文件删掉
 -e    编辑crontab的工作内容
通过crontab -e进入工作安排界面,其实就是调用 vi 写文件 /var/spool/cron/ 下一个与 userName(-u 指定) 同名的文本文件

该文本文件含如下6个字段及其取值范围如下(取值为 * 表示任意  多个值可用逗号隔开 一段范围可用减号  */#代表每隔#个单位时间
其中 日期 和 周几 取并集
分钟
小时
日期
月份
周几
命令
0~59
0~23
1~31
1~12
0~7
要执行的COMMAND
如:27 13 * * * pstree > /tmp/crond.txt 

注:如果 COMMAND 太复杂,建议写到脚本中,然后在此引用脚本(绝对路径)。crond 中 % 有特殊用途,如果在命令中要使用%,则需要转义。将 % 放置于单引号中,则可不用转义
进程启动细节如下:
19---作业(job)
/etc/cron.allow
/etc/cron.deny
两个配置文件配置哪些用户可以使用crontab,和 at.allow/at.deny 作用类似,也是前者优先级高。
crontab -e编辑的例行性任务是针对用户的
-----系统级的计划任务-----
系统的例行性工作调度在 /etc/crontab 文件中配置
/etc/crontab 的格式如下,比用户级的计划任务多了一个 user-name 字段,表示以谁的身份执行任务
*  *  *  *  * user-name command_to_be_executed
计划任务文件也可以放在 /etc/cron.d 目录下,名称随意  --->  建议单独放在这里,不要挤在 /etc/crontab
思考:系统级和用户级计划任务,貌似没有什么区别啊,不都是计划任务吗?






相关文章: