systemd及service文件详解——以amule为例

上篇文章谈到了编译安装的amule没有自启动脚本,但看了一下传统的init启动脚本,眼晕,经过衡量,最后决定自己编写sysytemd.service启动脚本以满足自身需要。

systemd介绍

Systemd 是 Linux下的一款系统和服务管理器,相比于传统的服务管理方法比如自制脚本,具有文件编写简单,功能可靠,以及方便统一管理等优点。Systemd 有很多不同类型的使用单元(unit),主要包括:系统服务(.service)、挂载点(.mount)、sockets(.sockets)、系统设备(.device)、交换分区(.swap)、文件路径(.path)、启动目标(.target)。一般我们常用的是其中的系统服务。

Systemd的系统服务的单元文件(.service)可以从两个地方加载

/usr/lib/systemd/system/ #软件包安装的单元
/etc/systemd/system/ #系统管理员安装的单元

一般来说我们手动编写的单元都放在第二个目录下

service文件内容

service文件包含几个常用的小节,每个小节以[*]开头,来说明小节的内容

[Unit]: 

这个项目内主要在规范服务启动的脚本、环境配置文件文件名、重新启动的方式等等。主要包括:

  • Description:描述这个 Unit 文件的信息
  • Documentation:指定服务的文档,可以是一个或多个文档的 URL 路径
  • Requires:依赖的其它 Unit 列表,列在其中的 Unit 模板会在这个服务启动时的同时被启动。并且,如果其中任意一个服务启动失败,这个服务也会被终止
  • Wants:与 Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模板启动是否成功
  • After:与 Requires 相似,但是在后面列出的所有模块全部启动完成以后,才会启动当前的服务
  • Before:与 After 相反,在启动指定的任务一个模块之间,都会首先确证当前服务已经运行

[Install]

这部分配置的目标模块通常是特定运行目标的 .target 文件,用来使得服务在系统启动时自动运行。这个区段可以包含三种启动约束:

  • WantedBy:和 Unit 段的 Wants 作用相似,只有后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。默认使用WantedBy=multi-user.target
  • Also:当前 Unit enable/disable 时,同时 enable/disable 的其他 Unit
  • Alias:当前 Unit 可用于启动的别名

[Service]

用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段分为服务生命周期和服务上下文配置两个方面。

服务生命周期控制相关:

  • Type:定义启动时的进程行为,它有以下几种值:
    • Type=simple:默认值,执行ExecStart指定的命令,启动主进程
    • Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
    • Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
    • Type=dbus:当前服务通过D-Bus启动
    • Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
    • Type=idle:若有其他任务执行完毕,当前服务才会运行

目前使用默认type就能满足绝大多数需要

  • ExecStart:启动当前服务的命令
  • ExecStartPre:启动当前服务之前执行的命令
  • ExecStartPos:启动当前服务之后执行的命令
  • ExecReload:重启当前服务时执行的命令
  • ExecStop:停止当前服务时执行的命令
  • ExecStopPost:停止当其服务之后执行的命令
  • RestartSec:自动重启当前服务间隔的秒数
  • Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括 always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog

服务上下文配置相关:

Environment:为服务指定环境变量

User:指定运行服务的用户

Group:指定运行服务的用户组

amule系统服务unit配置

需求:以root用户运行,随着系统启动运行,能通过systemd命令启动与停止

文件样板:

[Unit]
Description=Amule
After=network.target

[Service]
ExecStart=/usr/local/bin/amuled 
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

发表回复

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