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
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号