Systemd设置开机自启

一、systemd简介

systemd 是一种系统和服务管理器,用于在 Linux 系统中初始化和管理系统进程。

1.1 单元(Unit)文件

  • 单元文件是 systemd 用来描述和管理各种系统资源和服务的配置文件。单元文件的扩展名通常为 .service.socket.target.mount 等,取决于单元的类型。

  • systemd 使用单元文件(unit files)来定义服务、套接字、挂载点、设备等。每个单元文件描述了一个服务或资源及其相关的配置。

  • 单元文件位于 /etc/systemd/system//lib/systemd/system/ 目录中。一般来说,用户自定义的单元文件放在 /etc/systemd/system/ 目录中。

1.2 服务单元(Service Unit)

  • 服务单元是一种特定类型的单元文件,是最常用的单元类型,用于定义和管理系统服务。服务单元文件的扩展名是 .service,例如 nginx.service

  • 服务单元文件包含几个部分,如 [Unit](定义服务的描述和依赖关系)、[Service](定义如何启动、停止和重新加载服务)和 [Install](定义服务在启动时的行为)。

1.3 启用服务

  • 使用 systemctl enable <service> 命令可以将服务设置为开机自启。此命令会创建一个符号链接,将服务单元文件链接到 /etc/systemd/system/multi-user.target.wants/ 目录中。

  • multi-user.target 是一个目标单元,表示系统运行级别。在开机时,systemd 会按照目标单元中的符号链接启动相关服务。

1.4 目标单元(Target Unit)

  • 目标单元定义了服务组。比如 multi-user.target 是一个常见的目标单元,表示系统启动到多用户模式。

  • 目标单元本质上是一个集合,包含了多个需要在该级别启动的服务。

1.5 启动过程

  • 系统启动时,systemd 会读取 /etc/systemd/system//lib/systemd/system/ 目录下的单元文件,根据目标单元启动相应的服务。

  • 如果某个服务被设置为开机自启,systemd 会在系统达到指定的目标单元时自动启动该服务。

1.6 自动依赖

  • systemd 支持服务间的依赖关系,可以配置服务启动的顺序。通过 After=Requires= 等指令,可以确保某些服务在其他服务之前或之后启动。

二、systemd使用

2.1 创建 systemd 服务文件

创建一个新的 systemd 服务文件,websocket.service为服务名

sudo vim /etc/systemd/system/websocket.service
[Unit]
Description=WebSocket Service
After=network.target

[Service]
ExecStart=/home/li/websocket/websocket
WorkingDirectory=/home/li/websocket
User=root
Restart=on-failure

[Install]
WantedBy=multi-user.target

确保 ExecStart 指向可执行文件路径, User 设置为运行该服务的用户。(如果程序需要root权限才能运行,可以把User设为root)

2.2 重新加载 systemd 配置

创建或修改服务文件后,需要重新加载 systemd 配置以使更改生效

sudo systemctl daemon-reload

2.3 启用并启动服务

启用服务以使其在启动时自动运行

sudo systemctl enable websocket.service

启动服务:

sudo systemctl start websocket.service

2.4 检查服务状态

检查服务的运行状态以确保它正确启动:

sudo systemctl status websocket.service

2.5 停止并禁用服务

停止:

sudo systemctl stop websocket.service

禁用:

sudo systemctl disable websocket.service

2.6 查看日志

sudo journalctl -u websocket.service

三、可能遇到的问题

3.1 程序退出太快

服务的启动脚本或程序崩溃或退出得太快,导致 systemd 尝试多次重新启动服务并最终失败

Stopped websocket.service - WebSocket Service.
websocket.service: Start request repeated too quickly.
websocket.service: Failed with result 'exit-code'.
Failed to start websocket.service - WebSocket Service.

可以通过添加 RestartSec 参数设置重新启动之间的延迟时间。

[Unit]
Description=WebSocket Service
After=network.target

[Service]
ExecStart=/home/li/websocket/websocket
WorkingDirectory=/home/li/websocket
User=root
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

3.2 程序运行时需要链接动态库

error while loading shared libraries: libmywslib.so: cannot open shared ...

3.2.1 设置 LD_LIBRARY_PATH

[Service]
ExecStart=/home/li/websocket/websocket
WorkingDirectory=/home/li/websocket
Environment="LD_LIBRARY_PATH=/path/library"
User=root
Restart=always
RestartSec=10

3.2.2 更新系统的库路径

将库路径添加到系统库路径中:

创建一个新的配置文件(例如 /etc/ld.so.conf.d/mywslib.conf

/path/library

然后运行 ldconfig 更新系统的库缓存

sudo ldconfig
posted @ 2024-07-17 11:48  梨子Li  阅读(63)  评论(0编辑  收藏  举报