跳转至

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
/etc/profile        # 配置所有用户环境变量的文件,开机会被自动执行。
/etc/profile.d      # 配置所有用户环境变量的目录,开机时下面所有的脚本文件都被自动执行,自定义的环境变量通常放这里。
~/.profile          # 特定用户的环境变量配置文件,该用户登录时被自动执行。

3. 关机时启动

同样注册一个服务,只需要变更一下其中的几个配置项就可以了。

1
2
3
4
5
6
7
8
[Unit]
Before=shutdown.target

[Service]
TimeoutStartSec=0

[Install]
WantedBy=shutdown.target

4. 启动shell终端时启动

有时我们需要为自己的shell设置一些环境变量、命令假名之类的。就可以使用下面这两个文件:

1
2
~/.bashrc           # 每次打开终端时被自动调用
~/.bash_profile     # 用户登录时被自动调用,通常只会被调用一次

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
[Timer]
条件

[Install]
WantedBy=timers.target

可以指定各种各样的定时条件。

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
15days 4h 26min 59s
5.2.2 以固定的时间点或时间间隔执行

bash OnCalendar=

Calendar的语句比较复杂,可以有很多种写法来分别表示各种各种的日期。

一个完整的日期如下:

1
2
3
Sun 2020-03-29 13:23:46 UTC

如果直接指定这样一个日期,则定时器会在这个时间点启动一次service。

在日期语句中,可以使用多种符号来匹配指定格式的日期。

符号 名称 含义
* 通配符 可以替换日期中的任何文字,比如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
systemctl list-timers