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