上篇文章谈到了编译安装的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