============================================================================================================================================== ============================================================================================================================================== 计划任务 1、linux上负责执行一次任务的服务,这个服务是atd。并是不所有的atd都默认开启状态。所以需要手动启动服务。 2、at的运行方式 at指令产生要运行的工作列表,并将该工作写入/var/spool/at/USER_NAME目录内,等待 atd 这个服务取用执行。at目录的定时任务计划 事实上是一些可执行的脚本,at任务会将执行的结果以 [邮件] 的形式提示用户。最小化安装的系统没有邮件服务,所以需要手动安装 mailx工具 yum install mailx 3、限制at的使用 在/etc/目录下的两个文件 /etc/at.allow 和 /etc/at.deny 分别作为使用 at 服务的白名单和黑名单,达到对 at 服务使用的限制的目录。 系统默认只有 /etc/at.deny 文件,如果需要创建白名单,可以自行创建 /etc/allow 文件。 如果这两个文件都不存在于 /etc/ 目录下,则只有 root 用户可以使用 at 服务指定任务计划; 如果两个文件都存在,则系统优先验证 at.allow 文件,存在于此文件的用户都有权限使用 at 服务; 如果这两个文件只存在一个,则仅仅作为白名单或者黑名单。 任何用户执行的任务计划,都将写入 /var/spool/at/USER_NAME 文件中,但普通用户对 /var/spool 没有写权限,所以 at 有 SUID 权限指定任务计划的工具 at 是具有 SUID 权限的可执行程序,当普通用户执行 at 程序时,at 进程是 root 的身份。 4、at工具的使用 格式: at [OPTIONS] TIME at> COMAND1 at> COMAND2 (使用Ctrl+d退出) ***注:也可以使用管道或者重定向的方式给at命令传递at命令计划*** * echo "echo haha" | at 12:00 * echo "echo haha;echo xixi" | at 12:00 * at 15:00 << EOF * > * >EOF ************************************************************** 选项: -m # 当 at 执行完毕后,即使没有执行结果,也以mail通知使用者该工作已完成 -M # 无论执行结果如何都不向用户发送邮件 -l # 列出目前系统上面的所有该使用者的 at 任务。( at -l 相当于 [atq] ) -d JOB_ID # 可以取消一个在 at 任务列表中的工作。( at -d 相当于[atrm] ) -c JOB_ID # 可以列出后面接的该项工作的实际指令内容 -f FILE # 从指定文件中读取任务计划 -b # batch的别名 TIEM: 绝对时间 at HH:MM at HH:MM YYYY:MM:DD -t YYMMDDhhmm[.ss] # 时间精确到秒 相对时间 at now +N {minutes|hours|days|weeks} 注意: 1、时间 HH:MM 例如04:14,即在这个时刻执行任务,若此时超过这个时刻,则第二天的这个时刻执行 HH:MM YYYY-MM-DD 例如:21:34 2016-11-12,即在某一年某一月某一天的某一时刻执行任务 at 12:00 tomorrow 明天 2、使用at时尽量用绝对路径 3. 示例 # 五分钟后将/root/.bashrc的内容发送给root用户 at now +5 minutes >at/bin/mail -s "at test job" root > /root/.bashrc # 某一时刻关机 at 23:00 2016-11-12 at>/bin/shutdown -h now 5、batch命令 当系统处于不忙碌状态时,才执行任务。他会在 CPU 的工作负载小于 0.8 的时候,才进行你所下达的工作任务。 用法和at一样。 6、邮件操作 mail 1、发送邮件给某一个用户 mail -s '邮件主题' 发送目的用户 2、可以使用管道符或者使用重定向,邮件内容,示例:将.bashrc内的内容发送给dmtsai用户 mail -s "bashrc file content" xuekaixin1 < ~/.bashrc 3、将ls -al的内容发送给自己 ls -al ~ mail-s "myfile" root 4、mail程序下的命令 h 列出信件标题,例如: h 30 d 删除后续接的信件号码,删除单封是"d10",删除 20~40 封则为 "d20-40"。 不过,这个动作要生效的话,必须要配合 q 这个指令才行 s 将信件另存为成文件。例如我要将第 5 封信件的内容存成 ~/mail.file: "s 5 ~/mail.file" x 之前的所有操作不生效退出 ============================================================================================================================================== ============================================================================================================================================== 二、corn 1、使用权限设置 /etc/cron.allow (白名单) 如果这个文件存在,则只要不在这个文档内的用户则不能使用 crontab /etc/cron.deny (黑名单) 如果只有这个文件存在,此文档记录不能使用crontab的用户,默认只有deny文件,allow的优先级高。 如过两个文件否都不存在,则只有root用户才有权限。 crontab 和 at 一样具有 SUID 超级权限,有 crond 进程提供服务。 2、crontab ***注:export EDITOR=vim 定义添加系统默认编辑器为vim*** 选项: -u USER_NAME # 只有 root 才能使用此参数,-u后面接用户的名称。即可以帮其他使用者建立/移除 crontab 工作任务 crontab [-u username] [-l|-e|-r] crontab -u xuekaixin1 -l -e # 编辑 crontab的工作内容,实际修改的是 /var/spool/cron/root 的文件 -l # 列出任务计划的列表 -r # 移除所有crontab的工作内容,若仅要移除一项,请用 -e 去编辑 -i # 同 -r 一同使用,在删除是以交互式的方式询问是否删除 2、注意 1、执行的脚本环境变量问题 当执行 crontab 中定义的任务时,新开的 bash 进程中的 $PATH 变量路径不完整,命令不能正确的找到执行路径,所以 在制定任务计划时,尽量将命令的完整路径写上。当任务计划中调用脚本时,则可以在脚本中把bash环境配置文件读取到 bash进程中。 #!/bin/bash . /etc/profile . ~/.bash_profile 2、配置文件中通常每一段都是且的关系,特殊情况,第三段和第五段是[或]的关系,即表示天数的字段和表示星期的字段是或 的关系。如果 * * 1-15 * 1,2 表示在每个月的1-25天和周一周二执行命令。 4、/etc/crontab是 [系统例行任务] 的配置文件 1、run-parts代表执行脚本,如果你想让系统每小时主动帮你执行某个指令,将该指令写成script,并将该档案放置到 /etc/cron.hourly/ 目录下即可。 2、/etc/cron.daily 就可以看到一堆脚本, 那些脚本就是系统提供的 script ,而这堆 scripts 将会在每天的凌晨4:02开始执行,因为 他必须要进行 makewhatis,updatedb, rpm rebuild 等等的任务。 3、run-parts 后面跟的目录可以自己建立的目录,代表的意思就是每隔多长时间执行此目录下的所有脚本。 5、书写格式说明 # 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 简单的时间书写格式 @reboot Run once after reboot. # 每次重启时执行的操作  @yearly 0 0 1 1 *  @annually 0 0 1 1 * # 每年  @monthly 0 0 1 * *  @weekly 0 0 * * 0  @daily 0 0 * * *  @hourly 0 * * * * 对于cron 任务来讲,% 有特殊用途;如果在命令中要使用%,则需要转义,将%放置于单引号中,则可不用转义 按秒执行计划任务 # * * * * * for min in 0 1 2; do echo "hi"; sleep 20;done 实现每7分钟运行一次任务  sleep 命令: sleep NUMBER[SUFFIX]... SUFFIX: s # 秒 默认 秒支持 0.5 的形式 m # 分 h # 小时 d # 天 usleep 命令: usleep 支持微妙级别的的计时,1s=1000毫秒 1毫秒=1000微妙 6、相关文件 /etc/cron.deny # cron使用权限黑名单设置文件 /etc/crontab # 系统任务计划的配置文件 /etc/cron.d # 系统任务计划的配置文件也可以单独放置在此目录下 /etc/cron.hourly # CentOS[默认]每小时执行此目录下的所有可执行脚本 /etc/cron.daily /etc/cron.monthly /etc/cron.weekly /var/spool/cron/USERNAME # 任务条目保存目录 /var/log/cron # 任务计划执行日志文件 7、cron相关程序 cronie # 主程序包,提供crond crontabs # 包含CentOS提供系统维护任务 cronie-anacron # cronie的补充程序,用于监控cronie任务执行状况,如cronie中的任务在过去该运行的时间点未能正常 运行,则anacron会随后启动一次此任务 8、每秒执行一次的任务计划 * * * * * for i in {1..60}; do /bin/date "+\%F \%T" >> /root/crontab.log ; sleep 1;done ============================================================================================================================================== ============================================================================================================================================== 三、系统关机期间的任务 1、理解 当安排了一个例行或者执行一次的任务后,到计划的时间时,主机关机或者出现故障,导致不能执行计划好的任务。 当主机开机或者排除故障后,再次执行之前未执行的任务。这就是唤醒系统关机期间的任务。 2、anacron 1. anacron是一支程序 2. anacron 是被crontab调度的,即每小时会被执行一次。被放置到 /etc/cron.hourly/ 目录内 3、anacron 格式:anacron [options] [job] .. -s # 开始一连续的执行各项工作 (job),会依据时间记录文件的数据判断是否进行 -f # 强制进行,而不去判断时间记录文件的时间戳记 -n # 立刻进行未进行的任务,而不延迟 (delay) 等待时间 -u # 仅更新时间记录文件的时间戳记,不进行任何工作 4、anacron的配置文件 /etc/anacrontab 配置文件内容如下: 天数 延迟时间 工作名称定义 执行的指令 /etc/anacrontab配置文件: 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 5、anacron执行流程 anacron 是一个独立的程序,不像 cron 可以作为守护进程一直运行。是通过 crond 服务进程每小时调用一次 anacron 程 序使之运行。/etc/cron.hourly/ 目录下的脚本每小时被执行一次,在这个目录下有一个 0anacrom 脚本,这个脚本调用 anacron 程序,也就是说 anacron 程序每小时都会被执行一次,已检测[到时]没有执行的任务计划。 anacron 程序运行首先会读取 /etc/anacrontab 文件中定义的列表,然后分别执行其中的 command 字段(命令),(即去执行 cron.daily cron.weekly cron.monthly 目录下的脚本)。 anacron 在执行之前会判断 /var/spool/anacron/cron.XXXX 中保存的时间然后与当前时间比较,如果超过规定的时间间隔,则进行后续的执行操作。 1、由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天; 2、由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳记; 3、由上个步骤与目前的时间比较,若差异天数为 1 天以上 (含 1 天),就准备进行指令; 4、若准备进行指令,根据/etc/anacrontab的设置,将延迟5分钟+3小时看START_HOURS_RANGE 的设置); 5、延迟时间过后,开始执行后续指令,亦即“ run-parts /etc/cron.daily ”这串指令; 6、执行完毕后,anacron 程序结束 ============================================================================================================================================== ==============================================================================================================================================