Systemd

Systemd 是系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程。
systemd 被设计用来改进sysvinit的缺点,它和 ubuntu 的 upstart 是竞争对手,预计会取代它们。systemd 的很多概念来源于苹果的 launchd 。创始人 Lennart 是 redhat 员工,但 systemd 不是 redhat 项目。

systemd 的目标是:尽可能启动更少进程;尽可能将更多进程并行启动。 systemd 尽可能减少对 shell 脚本的依赖。传统 sysvinit 使用 inittab 来决定运行哪些 shell 脚本,大量使用 shell 脚本被认为是效率低下无法并行的原因。 systemd 使用了 Linux 专属技术,不再顾及 POSIX 兼容,一度谣传 Debian 为了它的 BSD 项目将不会使用 systemd 。

Service Unit

Service Unit 是以 .service 结尾的文本文件。一个简单的示例(毯毯狐点歌台自启)如下:

[Unit]
Description = BilibiliMusic
After = network.target
After = network-online.target

[Service]
ExecStart = /home/.../start.sh
Restart = on-failure

[Install]
WantedBy = multi-user.target

[Unit]

  1. Description:当前服务的简单描述
  2. Documentation:指定 man 文档位置
  3. After:如果 a.targetb.service 需要启动,那么 user.service 应该在它们之后启动
  4. Before:定义 user.service 应该在哪些服务之前启动
  5. Wants:表示 a.serviceuser.service 之间存在”弱依赖”关系,即如果 “a.service” 启动失败或停止运行,不影响 user.service 继续执行
  6. Requires:表示”强依赖”关系,即如果该服务启动失败或异常退出,那么user.service 也必须退出

注意:Wants 字段与 Requires 字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动。

注意:After 和 Before 字段只涉及启动顺序,不涉及依赖关系。

[Service]

  1. EnvironmentFile:许多软件都有自己的环境参数文件,该字段指定文件路径
  2. Type:定义启动类型。可设置:simple,exec,forking,oneshot,dbus,notify,idle
    1. simple(设置了 ExecStart= 但未设置 BusName= 时的默认值):ExecStart 字段启动的进程为该服务的主进程
    2. forking:ExecStart 字段的命令将以 fork() 方式启动,此时父进程将会退出,子进程将成为主进程
  3. ExecStart:定义启动进程时执行的命令
  4. ExecReload:重启服务时执行的命令
  5. ExecStop:停止服务时执行的命令
  6. ExecStartPre:启动服务之前执行的命令
  7. ExecStartPost:启动服务之后执行的命令
  8. ExecStopPost:停止服务之后执行的命令
  9. RemainAfterExit:设为yes,表示进程退出以后,服务仍然保持执行
  10. KillMode:定义 Systemd 如何停止服务,可以设置的值如下:
    1. control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
    2. process:只杀主进程
    3. mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
    4. none:没有进程会被杀掉,只是执行服务的 stop 命令
  11. Restart:定义了退出后,Systemd 的重启方式。可以设置的值如下:
    1. no(默认值):退出后不会重启
    2. on-success:只有正常退出时(退出状态码为0),才会重启
    3. on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
    4. on-abnormal:只有被信号终止和超时,才会重启
    5. on-abort:只有在收到没有捕捉到的信号终止时,才会重启
    6. on-watchdog:超时退出,才会重启
    7. always:不管是什么退出原因,总是重启
  12. RestartSec:表示 Systemd 重启服务之前,需要等待的秒数

配置中多个相同配置会选择最后一个,下面结果是 execstart2

[Service]
ExecStart = /bin/echo execstart1
ExecStart = /bin/echo execstart2

所有的启动设置之前,都可以加上一个连词号(-),表示”抑制错误”,即发生错误的时候,不影响其他命令的执行

EnvironmentFile = -/etc/sysconfig/aaaaaa

表示即使 /etc/sysconfig/aaaaaa 文件不存在,也不会抛出错误

[Install]

WantedBy:表示该服务所在的 Target(服务组)

关于 Target,运行级别

查看默认 Target

systemctl get-default

#结果为 multi-user.target,表示默认的启动 Target 是 multi-user.target 。在这个组里的所有服务,都将开机启动。这就是为什么 systemctl enable 命令能设置开机启动的原因

查看 multi-user.target 包含的所有服务

systemctl list-dependencies multi-user.target

切换到另一个 target

systemctl isolate shutdown.target

shutdown.target 就是关机状态

常用的 Target 有两个:一个是 multi-user.target,表示多用户命令行状态;另一个是 graphical.target,表示图形用户状态,它依赖于 multi-user.target

在树莓派中创建自定义服务

首先,进入 /lib/systemd/system/ 目录,新建服务脚本

cd /lib/systemd/system/
sudo nano myService.service

然后按照上述规则写入脚本

[Unit]
...

[Service]
...
  
[Install]
...

新建完成后,按 Ctrl+O 保存,再 Ctrl+X 退出nano。接着设置开机自启动。先重新加载配置文件。

systemctl daemon-reload

设置自启动,实质就是在 /etc/systemd/system/multi-user.target.wants/ 添加服务文件的链接。

systemctl enable myService

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注