当前位置: 代码迷 >> 综合 >> Linux入门笔记(计划任务)
  详细解决方案

Linux入门笔记(计划任务)

热度:37   发布时间:2023-12-27 11:35:14.0

计划任务的方式可以有两种:

  • 一种是 例行性 的,即每隔一定周期要办的事项
  • 一种是 突发性 的,即做完之后就没的事项

在 Linux 中实现这两个功能就要使用到 atcrontab 这两个命令:

  • atat 是个可以处理仅执行一次就结束的命令,不过要执行 at 时,必须要有 atd 这个服务的支持才行
  • crontabcrontab 这个命令所设置的任务将会循环地一直执行下去crontab 除了可以使用命令执行外,亦可以编辑 /etc/crontab 来支持,而至于让 crontab 可以生效则是 crond

1 仅执行一次的计划任务

1.1 atd 的启动与 at 运行的方式

要使用单一计划任务时,Linux 必须要有负责这类计划任务的服务,那就是 atd 服务。使用

yum -y install at

然后手动启动它:

systemctl restart atd # 重新启动 atd 这个服务 
systemctl enable atd # 让这个服务开机就启动
systemctl status atd # 查看 atd 目前的状态

1.2 at 的运行方式

使用 at 这个命令来产生所要运行的任务,并将这个任务以文本文件的方式写入 /var/spool/at/ 这个目录内,该任务便能等待 atd 这个任务的使用与执行了。
at 命令的语法:

at [-mldv] time

选项与参数:

  • -m:当 at 的任务完成后,即使没有输出信息,也发 email 通知使用者该任务已经完成
  • -lat -l 相当于 atq,列出目前系统上面的所有该使用者的 at 计划
  • -dat -d 相当于 atrm,可以取消一个在 at 计划中的任务
  • -v:可以使用较明显的时间格式列出 at 计划中的任务列表
  • -c:紧接任务号码,可以列出后面接的该项任务的实际命令内容
  • time:时间格式,定义执行 at 命令的时间,格式有:
    • HH:MM
    • HH:MM YYYY-MM-DD
    • HH:MM[am|pm] [Month] [Date]
    • HH:MM[am|pm] + number [minutes|hours|days|weeks]:如 now + 5 minutees,5分钟后执行

如使用 at 命令在5分钟之后发送 /root/.bashrc 到自己的邮箱:

[admin@localhost ~]$ at now + 5 minutes
at> /bin/mail -s "testing" admin < /root/.bashrc
at> <EOT> # 输入 [ctrl] + d

注意:

  • 使用 at 时进入 at shell 的环境来让用户执行任务命令,所以最好就是使用 绝对路径 来执行命令,因为 at 在运行的时候,会跑到当前执行 at 命令的那个工作目录中执行。
  • 因为 at 的执行与终端环境无关,其所有的标准输出、标准错误输出都会发送到执行者的 mailbox 中,所以比如执行要在 at 中执行 echo 命令,在终端也就看不到任何信息,此时可以改变数据流实现,如 echo "Hello" > /dev/tty1
  • at 任务独立出 bash 环境,直接交给系统的 atd 程序来接管,所以当执行 at 的任务之后就可以立刻脱机,剩下的工作就完全交给 Linux 管理。

1.3 batch

如果想要指定任务在系统比较闲的时候才执行,此时就可以使用 batch 命令,而 batch 命令其实就是利用 at 来执行命令的,它当CPU的任务负载小于 0.8 的时候,才执行你的工作任务,使用 batch 的语法与使用 at 的类似。

任务负载的意思是:CPU 在单一时间点所负责的任务数量,而不是CPU的使用率,如有一个程序需要一直使用 CPU 的运算功能,此时 CPU 的使用率可能达到 100%,当它的任务负载只是趋近于 1,如果有两个程序同时运行,此时任务负载就变成 2

2 循环执行的计划任务

循环执行的计划任务是由 cron 这个系统服务来控制的。这个系统任务是默认启动的。

2.1 用户的设置

我们可以限制 crontab 的用户账号,可以使用的配置文件有(at 命令也有):

  • /etc/cron.allow:将可以使用 crontab 命令的用户账号写入其中,该文件作用优先于 /etc/cron.deny 文件
  • /etc/cron.deny:将不可使用 crontab 命令的用户账号写入其中

当用户使用 crontab 命令建立计划任务之后,该项任务就会被记录到 /var/spool/cron 当中,而且是以账号作为判断依据,举例,admin 用户使用了 crontab 后,它的任务就会被记录到 /var/spool/cron/admin 中,crontab 的语法如下:

crontab [-u username] [-l|-e|-r]

选项与参数:

  • -u:即帮其他使用者建立、删除 crontab 计划任务,只有 root 才能执行该任务。
  • -e:编辑 crontab 的任务内容
  • -l:查看 crontab 的任务内容
  • -r:删除所有的 crontab 的任务内容

当用户输入 crontab -e 命令时,就会进入到 vim 的编辑界面,然后以一行一个任务来编辑,而每项任务的格式都具有六个字段,它们的意义分别为:

  • 分钟:0~59
  • 小时:0~23
  • 日期:1~31
  • 月份:1~12
  • 周:0~7,其中 07 都表示星期天的意思
  • 命令:需要执行的命令

同时,还有下面这些特殊字符:

  • *:表示任何时刻都接受的意思
  • ,:代表分隔时段的意思,如 0 3,6 * * * command,就表示执行的任务时间点在 3:006:00
  • -:代表一段时间范围内,如 20 8-12 * * * command,8点到12点之间的每个小时的20分钟执行
  • /nn 代表数字,即每隔 n 个单位间隔,如 */5 * * * * command,每5分钟执行一次

2.2 系统的配置文件

一般来讲:

  • 个人化的操作使用 crontab -e,这样能够保障命令操作不被看到(/etc/crontab 文件谁都能看到)
  • 系统维护管理和固定每小时、每日、每周执行的特别任务都应该使用 vim /etc/crontab 放置到 crontab 中集中管理较好。
  • 自身开发的软件如果最好就是使用 vim /etc/cron.d/newFile,使用全新的配置文件,并且放置到 /etc/cron.d/ 目录内即可

/etc/crontab 是一个纯文本文件,可以使用 root 的身份编辑该文件,基本上,cron 这个服务的最低检测限制是分钟,所以 cron 会每分钟去读取一次 /etc/crontab/etc/cron.d/ 里面的数据内容。
/ect/crontab 文件的内容其实与使用 crontab -e 时输入的内容大致一样,多出了以下几个地方:

  • MAILTO=root:将标准输出,标注错误输出的信息发送到某个用户的邮箱,默认就是发送到 root 用户
  • PATH=...:执行文件路径

3 可唤醒停机期间的工作任务

如果服务器有个任务是定期循环执行的,但不巧的是当时间段服务器发生了一些状况比如停电之类的,导致该循环任务无法执行,此时就需要依靠 anacron 这个命令了,该命令可以主动帮助执行时间到了但却没有执行的任务。

3.1 anacron

anacron 的目的就是处理非24小时运行的 Linux 系统所执行的 crontab,以及因为某些原因导致的超过时间而没有被执行的任务。anacron 实际是一个程序,这个程序在 CentOS 当中已经进入 crontab 的任务列表,从而每小时就会执行一次,以下列出工作流程来了解一下 anacroncrond 的关系:

  • 1、crond 会主动读取 /etc/crontab/var/spool/cron/*/etc/cron.d/* 等配置文件,并根据其时间的设定去配置各项计划任务
  • 2、根据 /etc/cron.d/0hourly 的设置,会主动去 /etc/cron.hourly/ 目录下,执行所有在该目录下的执行文件
  • 3、其中 /etc/cron.hourly/0anacron 会主动每小时执行 anacron,并调用 /etc/anacrontab 的配置文件
  • 4、根据 /etc/anacrontab 的配置,根据每天、每周、每月分析 /etc/cron.daily//etc/cron.weekly//ect/cron.monthly/ 内的执行文件,以执行固定周期需要执行但没能执行的命令

也就是说,如果你每周日需要执行的操作是放置在 /ect/crontab 的话,那么该操作只要过期了就不会重新执行,但假如放置在 /ect/cron.weekly/ 目录下,那么就一定会执行,比如关机一周再开机,那么在开机后的数小时内任务就会被主动执行。