at 关闭定时任务linux

2019-01-14 22:56:20 qq_41571900 阅读数 157
  • 进程1

    通过实例掌握Linux实际操作技能 掌握Linux运维的全面知识

    5人学习 刘宏强
    免费试看

在工作过程中,一般是需要写一些脚本,周期性的去执行它。可以使用Azkaban来调度,也可以编写linux上的定时任务,对于初学者来说使用定时任务就已经足够了,Azkaban主要还是用于一连贯的工作流。接下来,我就简单讲解一下定时任务怎么创建。

编写

使用crontab -e 可以进入一个文件中,让我们开始编写它。大致格式如下
* * * * * echo ‘hello world’ >> /home/user/1.txt
这里可以看到有5个 * ,含义为:

  1. 第一个是代表分 1~59。
  2. 第二个代表时 1~24。
  3. 第三个代表日期 1~31。
  4. 第四个代表月份 1~12。
  5. 第五个代表星期 1~7。

上面的范围就代表是第多少执行,而 * 代表的是每分\每小时\每天\每月\每星期几都执行。
在编写完之后,可以保存退出,然后使用crontab -l 查看定时任务列表。
使用service crond status查看定时任务状态、service crond start打开定时任务、service crond stop关闭定时任务。
这就是简单的编写定时任务流程,可以根据自己业务的需要在脚本中编写代码。

2013-05-28 11:23:29 hi_kevin 阅读数 116504
  • 进程1

    通过实例掌握Linux实际操作技能 掌握Linux运维的全面知识

    5人学习 刘宏强
    免费试看
linux下定时执行任务的方法 

在LINUX中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内容到里面 :wq 保存退出。


在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron]。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。

cron的配置文件称为“crontab”,是“cron table”的简写。

一、cron在3个地方查找配置文件:
1、/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的crontab任务对应的文件就是/var/spool/cron/tom。
一般一个用户最多只有一个crontab文件。

二、/etc/crontab 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab。

三、/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。

四、权限
crontab权限问题到/var/adm/cron/下一看,文件cron.allow和cron.deny是否存在
用法如下: 
1、如果两个文件都不存在,则只有root用户才能使用crontab命令。 
2、如果cron.allow存在但cron.deny不存在,则只有列在cron.allow文件里的用户才能使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab。 
3、如果cron.allow不存在, cron.deny存在,则只有列在cron.deny文件里面的用户不能使用crontab命令,其它用户都能使用。 
4、如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab,如果两个文件中都有同一个用户,
以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令。


五、cron服务
  cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业。
  /sbin/service crond start    //启动服务
  /sbin/service crond stop     //关闭服务
  /sbin/service crond restart  //重启服务
  /sbin/service crond reload   //重新载入配置
  /sbin/service crond status   //查看服务状态 

在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。
    每个域之间使用空格或者制表符分隔。格式如下: 
  minute hour day-of-month month-of-year day-of-week commands 
    合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) commands(代表要执行的脚本)
    除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。


几个例子: 
每天早上6点 
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

每两个小时 
0 */2 * * * echo "Have a break now." >> /tmp/test.txt  

晚上11点到早上8点之间每两个小时和早上八点 
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点 
0 11 4 * 1-3 command line

1月1日早上4点 
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/ 

每小时执行/etc/cron.hourly内的脚本
01 * * * * root run-parts /etc/cron.hourly
每天执行/etc/cron.daily内的脚本
02 4 * * * root run-parts /etc/cron.daily 

每星期执行/etc/cron.weekly内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly 

每月去执行/etc/cron.monthly内的脚本 
42 4 1 * * root run-parts /etc/cron.monthly 

注意: "run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名。   

每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。 
5,15,25,35,45,55 16,17,18 * * * command

每周一,三,五的下午3:00系统进入维护状态,重新启动系统。
00 15 * * 1,3,5 shutdown -r +5

每小时的10分,40分执行用户目录下的innd/bbslin这个指令: 
10,40 * * * * innd/bbslink 

每小时的1分执行用户目录下的bin/account这个指令: 
1 * * * * bin/account

每天早晨三点二十分执行用户目录下如下所示的两个指令(每个指令以;分隔): 
20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#@62;expire.1st)  

每年的一月和四月,4号到9号的3点12分和3点55分执行/bin/rm -f expire.1st这个指令,并把结果添加在mm.txt这个文件之后(mm.txt文件位于用户自己的目录位置)。 
12,55 3 4-9 1,4 * /bin/rm -f expire.1st$#@62;$#@62;mm.txt 


at命令实现定时任务
  假如我们只是想要让特定任务运行一次,那么,这时候就要用到at监控程序了。
    at类似打印进程,会把任务放到/var/spool/at目录中,到指定时间运行它 。at命令相当于另一个shell,运行at time命令时,它发送一个个命令,可以输入任意命令或者程序。

    at命令执行流程如下

  # at 2:05 tomorrow

  at>/home/kyle/do_job

  at> Ctrl+D

  AT Time中的时间表示方法

  -----------------------------------------------------------------------

  时 间 例子 说明

  -----------------------------------------------------------------------

  Minute    at now + 5 minutes   任务在5分钟后运行

  Hour      at now + 1 hour      任务在1小时后运行

  Days      at now + 3 days      任务在3天后运行

  Weeks     at now + 2 weeks     任务在两周后运行

  Fixed     at midnight          任务在午夜运行

  Fixed     at 10:30pm           任务在晚上10点30分

  注意:linux默认为不启动,而ubuntu默认为启动的。检查是否启动,用service atd检查语法,用service atd status检查atd的状态,用service atd start启动atd服务。

  查看at执行的具体内容:一般位于/var/spool/at目录下面, 用vi打开,在最后一部分就是你的执行程序



参数详解
-V : 印出版本编号 
-q : 使用指定的伫列(Queue)来储存,at 的资料是存放在所谓的 queue 中,使用者可以同时使用多个 queue,而 queue 的编号为 a, b, c... z 以及 A, B, ... Z 共 52 个 
-m : 即使程序/指令执行完成后没有输出结果, 也要寄封信给使用者 
-f file : 读入预先写好的命令档。使用者不一定要使用交谈模式来输入,可以先将所有的指定先写入档案后再一次读入 
网络应用


-l : 列出所有的指定 (使用者也可以直接使用 atq 而不用 at -l) 
-d : 删除指定 (使用者也可以直接使用 atrm 而不用 at -d) 
-v : 列出所有已经完成但尚未删除的指定 

删除任务
atrm 2


三天后的下午 5 点锺执行 /bin/ls : 
at 5pm 3 days /bin/ls 

三个星期后的下午 5 点锺执行 /bin/ls : 
at 5pm 2 weeks /bin/ls 

明天的 17:20 执行 /bin/date : 
at 17:20 tomorrow /bin/date 

1999 年的最后一天的最后一分钟印出 the end of world ! 
at 23:59 12/31/1999 echo the end of world !

2016-10-31 12:48:49 sailor201211 阅读数 2407
  • 进程1

    通过实例掌握Linux实际操作技能 掌握Linux运维的全面知识

    5人学习 刘宏强
    免费试看

运维日记019 – Linux下使用at执行定时任务

在Linux中cron机制适宜于处理周期性执行的规律工作,但如果仅仅想把任务安排在某个预定时间执行一次,则应该用at。at既可以接收来自stdin的命令,也接收预先写在文件中的命令。

at的安装

RHEL6最小化安装后是没有at的,可以用如下方式查询at所在的软件包并安装之:

# yum provides at
... ...
at-3.1.10-43.el6_2.1.x86_64 : Job spooling tools
... ...

# yum install at

查看一下atd服务是否开启,并将其设置为开机启用:

# service atd status
atd is stopped

# service atd start
Starting atd:                                              [  OK  ]

# chkconfig --list atd
atd             0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

at的语法

  • at [-f] time
  • at [options]

at命令的第一种形式会从stdin或者file文件读取命令,将命令排入队列,使其于指定时间(time)执行;第二种形式可以列出或者删除队列中的任务。

常用选项:

  • -d job1 [,jib2, …]
    删除队列中的特定任务

  • -l
    列出已排在队列中的任务

设置成功的at计划任务会在/var/spool/at下生产一个可执行脚本,例如:

# at -f my_program 12:00

# ll /var/spool/at
总用量 8
-rwx------. 1 root   root   2638 11月  1 11:06 a000070177ddfb
drwx------. 2 daemon daemon 4096 11月  1 11:05 spool

文件a000070177ddfb就是这个计划任务的可执行脚本,当任务执行完成后,该脚本文件又会被删除。

范例

  • 在今天10:58执行一次date命令
$ at 10:58
at> date > /tmp/at.txt
at> <EOT>
job 1 at Tue Nov  1 10:58:00 2016

$ cat /tmp/at.txt
20161101日 星期二 10:58:00 CST
  • 三分钟后对磁盘sdb1执行一次检查:
# at now+3 minutes
at> fsck /dev/sdb1
at> <EOT>
  • 2016年11月1日上午8点执行一次my_comm_list文件中所列的命令:
# at -f my_comm_list 8:00 am 11012016
  • 查看队列中的未完成任务,然后删除5号任务:
# at -l
6       2016-10-31 12:29 a root
5       2016-11-01 08:00 a root

# at -d 5

at的访问控制

和cron类似,at也提供了访问控制措施,以决定哪些用户可以使用调度服务。

  • /etc/at.deny
  • /etc/at.allow

如果两个文件都不存在,则只有root管理员可以使用at;如果只有at.deny文件,而at.allow文件不存在,则除了黑名单之外的所有用户都可以使用at;如果at.allow文件存在,则只有白名单用户才可以使用at。

2018-11-13 23:19:20 lonelymanontheway 阅读数 3439
  • 进程1

    通过实例掌握Linux实际操作技能 掌握Linux运维的全面知识

    5人学习 刘宏强
    免费试看

简介

计划任务,或者调度任务,在现实生活随处可见。Java编程中的任务调度参考分布式调度中心学习总结。Linux或者Windows系统也有任务调度的概念,本文尽可能涵盖这个主题。
windows的计划任务,在控制面板 -> 性能与维护 -> 任务计划,用于安排自动运行的任务。通过’添加任务计划’的一步步引导,则可建立一个定时执行的任务。
Linux下实现任务调度一般需要一个与命令行工具相对应的服务。这样的命令行工具包括:
at、crontab、anacron、Systemd。

at

使用 at 命令可以调度任务的自动执行。at 文件只执行一次任务,然后便从目录中删除这些文件。因此,在运行将输出定向到独立文件中以供以后检查的单个命令或脚本时,at 命令很有用。
at 命令在/var/spool/at/目录中存储您运行的命令或脚本以及当前环境变量的副本。at 作业文件名是一个长数字,用于指定该文件在 at 队列中的位置,后跟 .a扩展名。at指定一个时间执行某个指定任务,只能执行一次,且需要开启atd进程,通过命令ps -ef | grep atd查看, 开启用/etc/init.d/atd start or restart;设置开机即启动运行chkconfig --level 2345 atd on
选项:

-m 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
-I atq的别名
-d atrm的别名
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-V 显示版本信息
-q<列队> 使用指定的列队
-f<文件> 从指定文件读入任务而不是从标准输入读入
-t<时间参数> 以时间参数的形式提交要运行的任务 

at允许使用一套相当复杂的指定时间的方法。
绝对计时法:
接受在当天的hh:mm式的时间指定,假如该时间已过去,那么就放在第二天执行。
接受midnight,noon,teatime等比较模糊的词语来指定时间。
接受12小时计时制,即在时间后面加上AM或PM。
接受具体日期如:month day或mm/dd/yy或dd.mm.yy。指定的日期必须跟在指定时间的后面。
相对计时法:
格式为:now + count time-units ,now就是当前时间,time-units是时间单位,如minutes、hours、days、weeks。count是时间的数量。
或者直接使用today、tomorrow来指定完成命令的时间。
汇总表格

时间格式 说明
HH:MM like 12:12, if time is already past, will be executed at the specified next day
midnight 12:00 a.m.
noon 12:00 p.m.
teatime 4:00 p.m.
month-name day year like May 1 2018, year is optional
MMDDYY, MM/DD/YY, MM.DD.YY, HH:MM YYYY-MM-DD formats 111218, equals 2018/11/12, 04:00 2009-03-17
now+time time can be in minutes, hours, days or weeks, like now + 5hours
HH:MM[am|pm] + number [minutes|hours|days|weeks] like 04pm + 3 days
HH:MM[am|pm] [Month] [Date] 04pm March 17
17:20 tomorrow specific time

命令实例:

# 启用at任务服务
systemctl start atd
systemctl enable atd
# 查看当前用户的所有任务(即还没有执行的任务)
atq 或者 at -l
# 查看所有用户的任务,展示出所有排定好的任务,且每个任务都有一个job ID
sudo atq
# 删除编号为3的任务
atrm 3或者at -d 3

# 设置1分钟后执行指定命令
echo 'echo aaa > /var/han' | at now+1min
at 12:00 PM September 30 2017
at 9:00 AM tomorrow
# 显示已经设置的任务内容
at -c 8
输出:
#!/bin/sh
# atrun uid=0 gid=0
# mail     root 0
umask 22此处省略n个字符
date >/root/2013.log

atd 的启动
并非所有的 Linux distributions 都默认会把atd服务打开。
启动atd服务:/etc/init.d/atd start,其他参数:stop|restart|condrestart|status
配置开机时启动服务,免得每次重新启动都得再来一次:chkconfig atd on

at 的运行方式
使用 at 这个命令来产生所要运行的计划任务,并将这个计划任务以文字档的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与运行了。

很多主机被所谓的攻击破解后,经常发现系统中多了很多的黑客程序,这些程序非常可能运用一些计划任务来运行或搜集你的系统运行信息,并定时的发送给黑客。 因为考虑到系统安全的原因。
利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制。
先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);
如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 命令。
两个文件都不存在,只有 root 可以使用 at 这个命令。/etc/at.allow 是管理较为严格的方式,而 /etc/at.deny 则较为松散 (因为帐号没有在该文件中,就能够运行 at 了)。在一般的 distributions 当中,由于假设系统上的所有用户都是可信任的, 因此系统通常会保留一个空的 /etc/at.deny 文件,意思是允许所有人使用 at 命令的意思 (您可以自行检查一下该文件)。 不过,万一你不希望有某些使用者使用 at 的话,将那个使用者的帐号写入 /etc/at.deny 即可! 一个帐号写一行。

crontab

crontab为Linux下的计划任务程序,对应的服务为crond;配置定时任务的方式有两种,对应的Cron任务配置文件也有两种:

  • 系统级别的任务,对应全局配置文件:直接通过命令编辑配置文件vi /etc/crontab,任务查看cat /etc/crontab
  • 用户级别的任务,对应用户配置文件:通过crontab -e编辑任务,自动保存到/var/spool/cron/<user_name>文件,即以用户名命名的文件,通过crontab -l查看。推荐此方式,系统会检查任务的配置语法。

文件说明

文件名 说明
/etc/crontab 全局任务配置列表
/etc/cron.allow 允许执行的用户列表,文件存在时,只有该文件中的用户才能执行计划任务,一般不创建此文件
/etc/cron.deny 不允许执行任务的用户列表,文件不存在时,出现在文件中的用户将不能执行计划任务,一般用于隔离不允许执行的用户
/etc/cron.d 在此目录下增加计划任务,可以加到不同的文件以便任务的区别,效果以及文件配置等同于/etc/crontab
/etc/crontab 四个按周期执行的目录,用户可在此目录下自定义任务文件,执行时间由 /etc/crontab 文件中的 run-parts 决定

/etc/crontab文件内容如下:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
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
# |  |  |  |  |
# *  *  *  *  *  command to be executed

其中run-parts如下:

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

该文件分为3部分:
第一部分为环境变量配置,包含执行任务时的环境信息;
第二部分为run-parts,这些命令用于触发子目录中按周期启动的任务;
第三部分为用户配置任务。
另外还有一种非标准的配置方式,更容易理解:

Entry description Equivalent to
@yearly Run once a year at midnight of 1 January 0 0 1 1 *
@monthly Run once a month at midnight of the first day of the month 0 0 1
@weekly Run once a week at midnight on Sunday morning 0 0 0
@daily Run once a day at midnight 0 0 *
@hourly Run once an hour at the beginning of the hour 0
@reboot Run at startup N/A

实例

# 启动定时计划任务服务
systemctl start crond
systemctl enable crond
# 启动编辑器,默认编辑器为vi,可以通过修改EDITOR环境变量来指定编辑器;[username]字段是可选
crontab -e [username]
# 输入计划任务
0 1 * * * logrotate /etc/logrotate.d
# 保存退出
# 等价于以root用户执行如下命令
echo "0 1 * * * logrotate /etc/logrotate.d" > /var/spool/cron/root
# 也等价于直接修改/var/spool/cron/root文件来添加计划任务
# 显示当前用户的计划任务
crontab -l
# 同理,直接在/etc/cron.d/目录中增加用户自定义任务文件5minutes,添加如下内容,可以分别使用root和johnny用户
4 23 * * * root echo "root `date`" >> /tmp/logroot
4 23 * * * johnny echo "johnny `date`" >> /tmp/logjohnny

anacron

anacron与cron的不同点

  1. cron任务同通过常驻的守护进程crond来定期执行的。 而anacron则不是守护进程,它需要被别人定期掉起,比如跟cron或systemd timer配合
  2. crond每分钟检查一次是否有需要执行的任务,若这次任务错过了时间则需要等下次触发点才能再次执行。 而anacron会立即执行错过时间的任务,而正是由于这个特点,为了防止在不恰当的时刻执行命令,anacron专门有一个参数START_HOURS_RANGE来设置允许执行命令的时间段。
  3. cron的粒度能精确到分钟,而anacron的粒度只能到天(即执行频率不能超过1天1次)
  4. cron的执行时间很精确。anacron可以设置一个延迟时间(RANDOMDELAY),anacron会在这个延迟时间内的某一个随机时间点执行。好处在于可以让任务的执行时间分散,防止一瞬间对服务器产生太大压力。
  5. cron有多个设置任务的地方(/var/spool/cron/<user>/etc/crontab/etc/cron.d/*);anacron只有一个设置任务的地方(默认为/etc/anacrontab,通过 -t 设置其他路径配置文件)
    anacron其实并不是设计来定时执行任务的,它的主要功能还是为了缓解cron中一瞬间大量任务并发执行而导致系统压力过大的问题。
    /etc/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

跟 cron 的配置文件类似。都是先定义环境变量,再定义执行计划。
定义环境变量的部分跟cron一样:

  1. RANDOME_DELAY=45:表示anacron在执行任务前先延时一段随记的时间再执行,这段随机的时间为0-45分钟之内的随机数。
  2. START_HOURS_RANGE=3-22:指定只有在凌晨3点到晚上22点这个时间段内才允许执行任务。

定义执行计划部分就跟 cron 差别很大。执行计划由四部分组成:

  1. period in days:轮回天数,表示任务多少天执行一次。
  2. delay in minutes:表示启动Anacron和运行作业时间之间的延迟,单位为分钟。前提是自最后一次运行之后所经过的时间超出了轮回天数。并不是作业真正运行的时间,真正运行的时间还需要加上RANDOME_DELAY中设置的随机分钟数。
  3. job-identifier:作业的标识符。anacron在执行任务时会将日期写入 /var/spool/anacron/$job-identifier 文件中
  4. command:实际运行的命令。run-parts是一个运行指定目录中所有程序与脚本的命令,通过man run-parts查看说明
    anacron常用选项:
    -t 配置文件路径:让anacron从指定配置文件中读取配置,常用于普通用户来管理个人任务
    -S spooldir:设定新的spool目录来记录任务执行的时间戳,常用于普通用户来管理个人任务
    -T:测试配置文件是否正确(类似nginx -t)
    -f:强制执行所有的任务,而不管之前的执行日期是否超过轮回天数
    -u:将所有任务的执行日期都更新为当前日期,而不真正的执行任务
    -s:串行地执行任务,只有前一个任务完成后才开始下一个任务。

Systemd

Systemd作为 Linux 的系统启动器,功能强大:

  1. 自动生成日志,配合 Systemd 的日志工具journalctl,方便除错;
  2. 可以设置内存和 CPU 的使用额度,比如最多使用50%的 CPU;
  3. 任务可以拆分,依赖其他 Systemd 单元,完成非常复杂的任务。

单元

单元是 Systemd 的最小功能单位,是单个进程的描述。Systemd 的基本思想就是一个个小的单元互相调用和依赖,组成一个庞大的任务管理系统。大概一共有12种单元:Service 单元负责后台服务,Timer 单元负责定时器,Slice 单元负责资源的分配。每个单元都有一个单元描述文件,它们分散在三个目录。
/lib/systemd/system:系统默认的单元文件
/etc/systemd/system:用户安装的软件的单元文件
/usr/lib/systemd/system:用户自己定义的单元文件

新建 Service,就是在/usr/lib/systemd/system目录里面新建一个文件。mytimer.service文件示例:

[Unit]
Description=MyTimer
[Service]
ExecStart=/bin/bash /path/to/mail.sh
  1. [Unit]部分介绍本单元的基本信息(即元数据),Description字段给出单元的介绍(名字叫做MyTimer)。
  2. [Service]部分用来定制行为,Systemd 提供许多字段。
    ExecStart:systemctl start所要执行的命令
    ExecStop:systemctl stop所要执行的命令
    ExecReload:systemctl reload所要执行的命令
    ExecStartPre:ExecStart之前自动执行的命令
    ExecStartPost:ExecStart之后自动执行的命令
    ExecStopPost:ExecStop之后自动执行的命令

所有定义路径都要写成绝对路径,比如 bash 要写成 /bin/bash,否则 Systemd 会找不到。

Service 单元只是定义如何执行任务,要定时执行这个 Service,还必须定义 Timer 单元。/usr/lib/systemd/system目录下新建一个mytimer.timer文件

[Unit]
Description=Runs mytimer every hour
[Timer]
OnUnitActiveSec=1h
Unit=mytimer.service
[Install]
WantedBy=multi-user.target

这个 Timer 单元文件分成几个部分:

  1. [Unit]部分定义元数据。

  2. [Timer]部分定制定时器
    OnActiveSec:定时器生效后,多少时间开始执行任务;
    OnBootSec:系统启动后,多少时间开始执行任务;
    OnStartupSec:Systemd 进程启动后,多少时间开始执行任务;
    OnUnitActiveSec:该单元上次执行后,等多少时间再次执行;
    OnUnitInactiveSec: 定时器上次关闭后多少时间,再次执行;
    OnCalendar:基于绝对时间,而不是相对时间执行;
    AccuracySec:设置任务推迟执行的最大秒数,默认是60秒;
    Unit:真正要执行的任务,默认是同名的带有.service后缀的单元;
    Persistent:设置该字段后,即使定时器到时没有启动,也会自动执行相应的单元;
    WakeSystem:如果系统休眠,是否自动唤醒系统;
    OnUnitActiveSec=1h 表示一小时执行一次任务。其他的写法还有 OnUnitActiveSec=-- 02:00:00 表示每天凌晨两点执行,OnUnitActiveSec=Mon – 02:00:00 表示每周一凌晨两点执行

  3. [Install] 部分,定义开机自启动(systemctl enable)和关闭开机自启动(systemctl disable)这个单元时,所要执行的命令。WantedBy=multi-user.target意思是,如果执行 systemctl enable mytimer.timer(只要开机,定时器自动生效),那么该定时器归属于multi-user.target。
    所谓 Target 指的是一组相关进程,有点像 init 进程模式下面的启动级别。启动某个 Target 的时候,属于这个 Target 的所有进程都会全部启动。
    multi-user.target 是一个最常用的 Target,意为多用户模式。也就是说,当系统以多用户模式启动时,就会一起启动 mytimer.timer。它背后的操作其实很简单,执行 systemctl enable mytimer.timer 命令时,就会在 multi-user.target.wants 目录里面创建一个符号链接,指向 mytimer.timer。

常用命令

# 查看所有单元文件
systemctl list-unit-files
# 查看所有 Service/Timer 单元
systemctl list-unit-files --type service/timer
# 单元启动、关闭、重启、杀死、查看状态、开机自动执行、关闭开机自动执行
systemctl start/stop/restart/kill/status/enable/disable [UnitName]
# 查看所有正在运行的定时器。
systemctl list-timers
# 查看整个日志
sudo journalctl
# 查看 mytimer.timer日志
sudo journalctl -u mytimer.timer
# 查看 mytimer.timer 和 mytimer.service日志
sudo journalctl -u mytimer
# 从结尾开始查看最新日志
sudo journalctl -f
# 从结尾开始查看 mytimer.timer日志
journalctl -f -u timer.timer

参考

crontab命令
使用anacron定期执行任务
Systemd定时器教程

2018-12-27 23:07:41 Owen_L_Y 阅读数 284
  • 进程1

    通过实例掌握Linux实际操作技能 掌握Linux运维的全面知识

    5人学习 刘宏强
    免费试看

一、at 一次性定时任务
1、确定是否已经安装 at服务
chkconfig --list | grep atd

如果不存在atd,则安装atd。apt install at

2、at服务
service atd start //启动服务
service atd stop //关闭服务
service atd restart //重启服务
service atd reload //重新载入配置
service atd status //查看服务状态

3、at的访问控制
白名单:/etc/at.allow 允许使用at服务的用户
黑名单:/etc/at.deny 不允许使用at服务的用户
如果两个文件都不存在,那么只有root用户可以使用。

5、at 命令
at [选项] [时间]
选项:
-m :当at工作完成后,无论命令是否有输出,都用email通知执行at命令的用户
-c 工作号 :显示该at工作的实际内容

时间:
HH:MM
例如:03:40
HH:MM YYYY-MM-DD
例如:02:13 2018-12-28
HH:MM [am|pm] [month] [date]
例如:02:43 pm July 25
HH:MM [am|pm] +[minutes|hours|days|weeks]
例如:now + 5 minutes (表示5分钟后)

6、atq 查询当前服务器上的at工作
7、atrm 工作号 :删除指定at任务

linux定时任务配置

阅读数 6400