背景
系统中有时候有的软件需要开机自启动,之前的做法是写一个.sh文件,启动软件,然后在/etc/rc.d/rc.local中启动这个.sh文件,这种做法可行,不过有一次此种写法启动一个执行文件,需要在命令行里面运行的服务不会退出,结果导致系统启动失败,猜测是启动这个服务阻塞了,所以改用服务的方式启动。
服务开机启动
我这里要启动2个程序,zl和一个Java程序,zl的运行程序是/opt/zl-kylin-server-v10-1e6a896/MediaServer,Java程序是使用Java -jar命令运行的/opt/zl_server/ZLMediaKitServer-1.0.0.20251230.jar,Java程序运行会在jar同级目录创建一些配置文件之类的,这里要注意的是路径,如果不注意就会是根路径运行,创建的文件全在根目录了。
创建服务
进入系统/etc/systemd/system文件夹,里面会有一些.service文件,这就是服务的配置文件,可以理解为创建一个这个文件就添加了一个服务。我们创建一个zl.service和一个zl_server.service文件。

修改2个文件里面的内容
zl.service是启动MediaServer的服务,关键配置是After=network.target,表示在系统网卡启动后启动这个服务,WorkingDirectory=/opt/zl-kylin-server-v10-1e6a896指定工作目录,ExecStart=/opt/zl-kylin-server-v10-1e6a896/MediaServer启动命令
[Unit]
Description=ZLMediakit
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/zl-kylin-server-v10-1e6a896
ExecStart=/opt/zl-kylin-server-v10-1e6a896/MediaServer
Restart=always
RestartSec=5
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
zl_server.service启动Java服务,After=zl.service表示在zl.service启动后启动,WorkingDirectory=/opt/zl_server指定工作目录,否则就会在根目录执行,ExecStart=java -jar /opt/zl_server/ZLMediaKitServer-1.0.0.20251230.jar启动命令
[Unit]
Description=zl_server
After=zl.service
[Service]
Type=simple
WorkingDirectory=/opt/zl_server
ExecStart=java -jar /opt/zl_server/ZLMediaKitServer-1.0.0.20251230.jar
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
启动服务
上述操作创建了2个服务,是还没有生效的,服务文件修改后需要执行systemctl daemon-reload重新加载才能生效。
# 修改服务后需要重新加载
systemctl daemon-reload
# 启动服务,服务名称后面不需要加.service
systemctl start zl
# 停止服务
systemctl stop zl
# 设置服务开机启动
systemctl enable zl
# 设置服务开机不启动
systemctl disable zl