Skip to content

Decal 笔记(2):浅析 service

Published: at 12:25

什么是 Service ?

根据 PPT 的表述,「service(服务)」 是一个被称为 守护进程(Daemon) 的特殊进程,它是一个不能互动的后台进程。这种进程通常以「d」作名称结尾,如:sshd,httpd等,也有些不一样的比如:nginx。它们通常由「init system」所控制,而我们熟悉的「systemd」正是其中之一,被广泛用于各个 Linux 发行版。

「systemd」给用户提供了管理服务的工具:「systemctl」和「journalctl」,前者主要用于启动、停止服务或查看当前服务的状态,后者则提供了「systemd」的日志查看。

systemctl 命令的使用

大部分时候程序都是在前台运行,像ssh一样,终端窗口退出后程序便终止执行。但针对某些特定程序,我们希望它们开机自启动,或是一直运行在后台,这时systemctl便可帮助我们达到目的。

systemctl命令非常简单明了:

systemctl status [unit]  # 显示单元状态
systemctl start|stop|restart|reload [unit]  # 启动|停止|重启|重新加载 单元
systemctl enable|disable [unit]  # 设置开机自启|取消开机自启 单元

此处单元(unit)通常包括但不限于:服务(.service)、挂载点(.mount)、设备(.device)和套接字(.socket)。

service脚本

启动service前,我们需要一个脚本来指定参数,这个脚本一般放在 /usr/lib/systemd 下:

alist的脚本为例:

[Unit]
Description=alist
After=network.target              # 表示本服务需要在 network.service 启动之后启动(同理还有 Before)

[Service]
Type=simple                       # 服务的启动类型
WorkingDirectory=path_alist       # 服务工作路径
ExecStart=path_alist/alist server # 服务启动命令
Restart=on-failure                # 服务进程退出后systemd的重启方式

[Install]
WantedBy=multi-user.target        # 对 enable/disable 操作有效

其它不必多说,[service]区块中有几部分需要详细说明一下(不止有示例给出的这几种):

Exec*描述
ExecStart启动服务时执行的命令
ExecStop停止服务时执行的命令
ExecStartPre启动服务前执行的命令
ExecStartPost启动服务后执行的命令
ExecStopPost停止服务后执行的命令
ExecReload重启服务时执行的命令

最后是Type类型:

还有其它Type类型,这里不过多叙述。我们只要了解,当一个程序若正常启动是在前台运行,则Type设为simple;当该程序正常启动时为后台运行,则需将Type设为forking。(回想一下,当我通过运行一个shell脚本时,会fork出一个包含当前环境变量的子shell运行该脚本)

参考文章