D. 自动执行脚本文件
D. 自动执行脚本文件
更新日期:2020-07-24
1. 概要
目前绝大多数的发行版都迁移到了systemd作为初始化程序。这里主要围绕systemd来写。
我们常用的启动,大概可以分为:
| No. | 启动时机 | 实现手段 |
|---|---|---|
| 1 | 开机启动 | 在systemd中注册服务,并设置为Enable |
| 2 | 关机启动 | 在systemd中注册服务,并设置相应的启动条件 |
| 3 | 启动shell终端时启动 | 使用用户下面的~/.bashrc脚本文件 |
| 4 | 定时启动 | 使用systemd中的Timer来实现 |
2. 开机启动
具体的写法这里就不再赘述了,只需注册一个自动启动的服务就可以了,可以参考服务管理相关章节。
但需要注意的一点是,诸如rc.local、rc.d、init.d等相关的写法应该是SysVinit初始化程序的写法。虽然很多时候也可以使用,但最好采用systemd中的写法。因为在有的发行版里,比如Arch中,这些写法是完全执行不了的。
还有一些默认会开机启动的脚本。比如通常用于配置环境变量的脚本。
1 2 3 | |
3. 关机时启动
同样注册一个服务,只需要变更一下其中的几个配置项就可以了。
1 2 3 4 5 6 7 8 | |
4. 启动shell终端时启动
有时我们需要为自己的shell设置一些环境变量、命令假名之类的。就可以使用下面这两个文件:
1 2 | |
5. 定时启动
5.1 使用Timer来定时启动
通常会使用cron相关的命令来实现。其实systemd中有一个定时器Timer也可以实现相关的功能。
它的写法也不复杂,需要:
- (1) 定义一个service。如my_task.service,service的写法与其他service无异。
- (2) 定义一个同名的timer。如my_task.timer,这个timer默认会去启动同名的service,当然你也可以换名字。
timer的内容要点:
1 2 3 4 5 | |
可以指定各种各样的定时条件。
5.2 指定各种定时启动的条件
5.2.1 开机一段时间后执行
OnBootSec=时间间隔 或者 OnStartupSec=时间间隔
时间间隔默认为秒单位,比如写60就是指60秒。
也可以指定时间单位,有效的时间单位如下:
| 单位 | 写法 |
|---|---|
| 微秒 | usec, us, µs |
| 毫秒 | msec, ms |
| 秒 | seconds, second, sec, s |
| 分钟 | minutes, minute, min, m |
| 小时 | hours, hour, hr, h |
| 天 | days, day, d |
| 周 | weeks, week, w |
| 月 | months, month, M (defined as 30.44 days) |
| 年 | years, year, y (defined as 365.25 days) |
可以指定多个时间单位并使用空格分隔,比如:
1 | |
5.2.2 以固定的时间点或时间间隔执行
bash
OnCalendar=
Calendar的语句比较复杂,可以有很多种写法来分别表示各种各种的日期。
一个完整的日期如下:
1 2 3 | |
在日期语句中,可以使用多种符号来匹配指定格式的日期。
| 符号 | 名称 | 含义 |
|---|---|---|
| * | 通配符 | 可以替换日期中的任何文字,比如2020-*-29表示2020年每个月的29日。 |
| , | 分隔符 | 用来列举多个可选日期,比如2020-3,4,5-29表示2020年2月4月5月的29日。 |
| .. | 范围省略符 | 用来省略连输数值的中间部分。比如2020-3..12-29表示2020年3月到12月的29日。 |
| / | 间隔通配符 | 以指定间隔来匹配数值。比如24/2表示匹配24,26,28,30…,可以用在各个位置。 |
| ~ | 逆序匹配符 | 使天数从后往前数。比如2020-3~2表示2020年3月的倒数第2天。 |
还有一些关键字可以简略的指定日期:
| 关键字 | 含义 | 对应的完整格式 |
|---|---|---|
| minutely | 每分钟运行一次 | --* ::00 |
| hourly | 每小时运行一次 | --* *:00:00 |
| daily | 每天运行一次 | --* 00:00:00 |
| monthly | 每个月运行一次 | --01 00:00:00 |
| weekly | 每周运行一次 | Mon --* 00:00:00 |
| yearly | 每年运行一次 | *-01-01 00:00:00 |
| quarterly | 每季运行一次 | *-01,04,07,10-01 00:00:00 |
| semiannually | 每半年运行一次 | *-01,07-01 00:00:00 |
5.3 列举当前使用中的定时器
就像列举systemd中定义的其它类型的单元一样,使用如下命令:
1 | |