跳转至

systemd 部署

目前,较新的 Linux 发行版,都已经使用了 systemd 作为系统守护进程,负责系统各个服务进程的管理。我们可以使用 systemd 来守护我们的服务进程,实现自动重启等功能。

常用的目录安排

Linux 没有规定程序以及配置必须安装在哪个目录下,但为了管理方便,一般而言可以采用以下的存放路径:

可执行文件

全局的可执行文件一般安装在 /usr/local 下,其中可执行程序在 /usr/local/bin 下,而运行库等在 /usr/local/lib 下。一般这种程序是通过 make install 命令安装的。有一些只有一个可执行文件的命令行程序,也可以放在 /usr/local/bin 下。

对于已经提供了安装器的程序,例如 Matlab,则可以安装到 /opt 目录下,例如 Matlab 可以安装到 /opt/matlab 下,可执行文件一般会存放在 /opt/xxx/bin/xxx 中。

配置文件

配置文件一般有全局的配置文件,也有用户的配置文件。通常而言,全局配置文件由系统管理员管理,存放在 /etc 目录下。例如,nginx 程序的配置文件就存放在 /etc/nginx 目录下。而用户特定的配置文件,一般可以存放在 ~/.config 目录下,或者 ~/.$APP 目录下,例如,如果你写了一个服务器程序叫 my-server,可以将配置文件放到 ~/.my-server 中。

不同的程序对于配置文件的搜索过程不一样,有的程序会内置若干个搜索路径,并按照优先级依次覆盖配置,有的程序必须手动指定一个配置文件路径,或者使用默认的配置文件路径启动。

编写 Unit 文件

通过 systemd 服务,我们可以让程序开机自启,并在崩溃退出的时候由系统自动重新启动。一般来说,我们需要在配置文件中指定:

  • 服务的信息
  • 服务的依赖
  • 启停命令
  • 运行环境

要创建一个 Unit,我们可以使用命令 systemctl edit --full --force --user my-server.service 来创建并编辑一个 Unit 文件。

在编辑器中,按照以下模板编写内容:

[Unit]
Description=my-server

[Service]
WorkingDirectory=/home/my-server
Type=simple
Environment=LOGLEVEL=info
Environment=SECRET_KEY=secret
ExecStart=/home/my-server/bin/my-server --port=8080
Restart=on-failure
User=my-server
Group=my-server
LimitCORE=infinity

[Install]
WantedBy=multi-user.target

其中 ExecStart 表示程序启动的命令,WorkingDirectory 表示程序运行的时候的工作目录,而 Environment 则表示程序运行时的环境变量。

保存退出编辑器之后,systemd 就会将文件内容放到合适的地方。这时候还不能自动启动程序,还需要执行 systemctl --user enable my-server 将程序加入到开机启动的列表中,然后执行 systemctl --user start my-server 将程序启动。我们还可以通过 systemctl --user status my-server 来查看程序运行的状态,通过 journalctl --user -u my-server 可以看到程序的标准输出内容。


最后更新: 2021-10-09 15:43:48
本页作者: Howard Lau