章节一是shell脚本的基础使用和语法
计划 延迟的用户作业
描述延迟的用户作业
在将来的某个时间点要运行的一组命令。红帽 linux 提供 at 解决方案。at 软件包中提供 atd 守护进程,以及和atd 守护进程进行交互的 at,atq 命令。用户可以使用 at 命令为 atd 守护进程的作业排队,atd 提供 a-z 的26个队列,靠后的队列优先级低。
计划延迟的用户任务
运行 at TIMESPEC 来计划将的任务,然后通过 stdin 通道读取要执行的命令。手动输入完命令后,使用 ctrl + D 来结束输入。对于易于出现输入错误的复杂命令,通常借助脚本和重定向来输入,例如 at now +5mins < myscript。
TIMESPEC参数非常灵活,诸如 now +5min,5pm august 3 2023。如有需要,可以查看参考资料对timespec的定义。
检查和管理延迟的用户作业
要检查当前用户的待处理的作业概述,使用 atq 命令或者 at -l 命令。最小化安装 linux 是没有安装 at 工具的,用 yum 成功安装后,要先启动atd服务。
[root@roots ~]# service atd start
[root@roots ~]# atq
4 Fri Dec 8 08:22:00 2023 a root
4:作业的唯一编号
a:表示已排入默认队列 a 中
非特权用户只能查看到自己的任务。root用户可以查看所有任务。
查看任务将执行什么命令:at -c jobnumber
将会展示所设置命令的作业环境以及实际命令。
删除任务:atrm jobnumber
[root@roots ~]# atrm 5
实时监控 at 队列:watch atq
默认情况下两秒更新一次,完成的任务将取消显示
为任务指定队列:at -q
[root@roots ~]# at -q b now +5min
[root@roots ~]# atq
7 Fri Dec 8 09:04:00 2023 b root
计划周期性用户作业
描述
按计划重复执行的任务称为周期性计划。红帽提供 crond 守护进程实现。(由软件包cronie提供)。crond 守护进程会读取多个配置文件(系统中的每一个用户都对应一个属于自己的配置文件,使用 crontab 进行编辑)以及一组系统范围内的文件。
如果计划任务的命令生成了违背重定向的输出或者错误,守护进程将尝试使用系统配置的邮件系统向作业的用户进行报告。
计划周期性任务
普通用户通过 crontab 命令来管理作业。
命令 | 用途 |
---|---|
crontab -l | 列出当前用户的周期计划作业 |
crontab -r | 删除当前用户的所有计划任务 |
crontab -e | 编辑当前用户的任务 |
crontab filename | 删除所有任务,并从filename中读取新的作业,若果未指定文件名,则使用stdin |
事实上,并不推荐使用crontab管理周期计划任务,而使用下一节内容。
crontab文件中的字段按一下顺序显示:
分钟 小时 几号 月 星期几 命令
五个字段的语法规则一致且如下:
*:表示始终/任意
数字用于指定小时,分钟,日期或者工作日。对于工作日,0为星期天,1为星期一
x-y:表示范围(x,y]
/x:表示x的时间间隔,如分钟列/7表示每隔7分钟运行一次作业。
示例:
每年2月2号9时0分运行xxx
0 9 2 2 * /usr/local/bin/xxx
cronb -e 默认会打开vim,在vim中编辑指令,保存。
[root@roots ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@roots ~]#
[root@roots ~]# crontab -l
*/1 6-19 * * 1-5 /usr/bin/date >> /data/cronbjobfordate.txt
[root@roots data]# ll
总用量 8
-rw-r--r-- 1 root root 43 12月 8 14:15 cronbjobfordate.txt
-rwxr-xr-x 1 root root 202 12月 6 08:26 expect_login_to_11
drwxr-xr-x. 2 root root 6 11月 20 08:30 mysql
drwxr-xr-x 2 root root 30 12月 1 18:02 shell
[root@roots data]# cat cronbjobfordate.txt
2023年 12月 08日 星期五 14:15:01 CST
[root@roots data]# cat cronbjobfordate.txt
2023年 12月 08日 星期五 14:15:01 CST
2023年 12月 08日 星期五 14:16:01 CST
2023年 12月 08日 星期五 14:17:01 CST
计划周期性系统作业
描述周期性的系统作业
系统管理员运行周期命令最佳方式是从系统账户而不是用户账户运行这些作业,因此并不推荐使用 crontab 命令来安排运行这些命令。周期性的系统作业和普通用户的任务 crontab 文件的条目类似。只是在开头前有一个额外的用户字段,如下
[root@roots data]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
# | | | | |
# * * * * * user-name command to be executed
周期性系统作业在两个位置定义:/etc/crontab 文件和 /etc/cron.d 目录中的文件。在系统的某些更新过程中可能会重新覆盖 /etc/crontab 文件,因此,我们推荐在 /etc/cron.d/ 目录下新建自定义的 crontab 文件。
周期脚本库
crontab系统还包含了一些周期性的脚本存储库,他们存储在/etc目录下,形如 cron.hourly 的 etc 的二级目录下。这些目录中的文件为 shell 脚本,而非 contab 文件。当系统运行时,系统会定期检查 /etc/cron.xxxly 目录并执行其中的可执行文件或脚本。使用这些脚本之前需要添加执行权限(chmod +x)。
[root@guojie ~]# ll /etc/cron.*ly/
/etc/cron.daily/:
总用量 12
-rwx------. 1 root root 219 4月 1 2020 logrotate
-rwxr-xr-x. 1 root root 618 10月 30 2018 man-db.cron
-rwx------. 1 root root 208 4月 11 2018 mlocate
/etc/cron.hourly/:
总用量 4
-rwxr-xr-x. 1 root root 392 8月 9 2019 0anacron
/etc/cron.monthly/:
总用量 0
/etc/cron.weekly/:
总用量 0
通常情况下,Linux 系统会使用 run-parts 命令来执行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 等目录中的脚本。大多数情况下,run-parts命令是通过配置文件/etc/anacrontab调用的。在linux7之前,/etc/anacrontab文件是用于配置一个名为 Anacron 的独立服务的配置文件,Anacron 是一个与 cron 类似的工具,用于在系统启动时运行周期性任务。与传统的 cron 不同,Anacron 适用于那些不经常打开计算机或者是不能保证24小时运行的系统,它可以确保即使任务被错过,也会在系统下次启动时运行。现在,这一配置文件也由crond服务解析使用,即crond接替了anacron保证系统即使任务被错过,也会在系统下次启动时运行的功能。
针对这些每日每周每月的周期作业,/var/spool/anacron 中会有不同的对应文件,以确定特定文件是否已运行。当crond从/etc/anacrontab中启动作业时,它会更新这些文件的时间戳,这个时间按戳也即确定了作业上次运行时间。
[root@guojie ~]# ll /var/spool/anacron/
总用量 12
-rw-------. 1 root root 9 12月 9 09:43 cron.daily
-rw-------. 1 root root 9 11月 9 09:20 cron.monthly
-rw-------. 1 root root 9 12月 4 09:31 cron.weekly
/etc/anacrontab 文件的与crontab 配置文件有所区别。/etc/anacrontab 文件的格式:
# period delay job-identifier command
period:任务执行的时间周期,以天为单位。
delay:系统启动后延迟多少天开始执行任务。
job-identifier:任务的标识符,用于识别任务。
command:要执行的命令或脚本。
示例:
7 5 backup /path/to/backup.sh
#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
这个示例定义了一个名为 backup 的任务,设置了每 7 天执行一次,系统启动后延迟 5 天开始执行 /path/to/backup.sh 脚本。
systemd 定时器简介
随着systed的强势出现,出现一种新的调度方式:Systemd 定时器。它是一种替代传统的 cron 定时任务的工具,允许在 Linux 系统上按照指定的时间表执行特定的任务。
Systemd 定时器的特点和使用方式:
单元文件:Systemd 定时器以单元文件的形式存在,通常有两个单元文件:.timer 文件和对应的 .service 文件。.timer 文件定义计时器的行为,.service 文件定义实际要执行的任务。
配置方式:定时器的配置信息存储在类似于 /etc/systemd/system 或者 /usr/lib/systemd/system 这样的位置,使用 systemctl 命令进行管理。
注意:请勿修改 /usr/lib/systemd/system 位置的任何配置文件,因为软件供应商的任何更新都有可能覆盖这些修改,请复制文件到 /etc/systemd/system 位置然后进行配置和修改。当这两个目录中存在同名的文件,systemd 将会解析 /etc/systemd/system 目录下的文件。
.timer 文件参数详解:
OnCalendar:定义定时器触发的时间表。可以是绝对时间(例如,具体的日期时间)或相对时间(例如,每天、每周、每月)。
oncalendar示例:
每天 2 点执行:OnCalendar=--* 02:00:00
每周五 8 点执行:OnCalendar=Fri --* 08:00:00
每月 1 号 3 点执行:OnCalendar=--01 03:00:00
AccuracySec:定义定时器的精度,即触发时间的准确性。
Persistent:指定定时器是否持久化。持久化的定时器会在定时器触发时即使系统关机也会在下次启动时执行任务。
Unit:定义在触发时要启动的单元(通常是一个 .service 文件)。
RandomizedDelaySec:定义随机延迟的时间范围,用于随机化定时器的触发时间。
.service 文件参数详解:
Type:定义服务的类型,如 simple、forking、oneshot 等。用于指定服务启动的方式。
ExecStart:定义要执行的命令或脚本的路径。当定时器触发时,.service 文件中定义的命令会被执行。
ExecStartPre:定义在 ExecStart 之前执行的命令或脚本。
ExecStartPost:定义在 ExecStart 之后执行的命令或脚本。
WorkingDirectory:指定服务的工作目录。
User 和 Group:定义服务执行的用户和用户组。
操作:
创建一个定时器:使用 .timer 文件定义定时器的时间表。
定义对应的服务:在timer文件所在目录中创建一个 .service 文件,定义实际要执行的任务。
加载并启用定时器:使用 systemctl daemon-reload。systemctl enable --now <unitname>.timer