liunx将自己的程序注册成systemd服务

你是否有想要的程序开机自启动,每次开机都自己启动服务,这样非常的麻烦

开始教学

在Linux系统中,我准备了二进制文件注册为systemd服务以实现开机启动和作为守护进程运行,你需要按照以下步骤操作:

1.创建systemd服务单元配置文件

首先,在 /etc/systemd/system//usr/lib/systemd/system/(目录下创建一 个名为 xxx.service 的文件。这个文件是用来描述如何启动、管理和监控你的Go程序的服务单元。)我这边以我的二进制程序img1.2做示例:编辑的你的xxx.service

[Unit]
Description=xxx          # 描述你的文件是干什么的
After=network.target 				 #这个代表网络服务启动完毕后,再启动程序
# 可根据需要添加依赖的服务,例如:After=mysqld.service xxx xx2 多的请你用空格隔开
[Service]
ExecStart=/path/to/img1.2  # 替换为你的二进制文件的实际路径 也可以是脚本文件.sh
Restart=on-failure          # 如果程序崩溃则自动重启
RestartSec=5                # 重启间隔时间
User=<username>            # 运行此服务的用户,默认可以是root,也可以指定其他非特权用户 可以不填
Group=<groupname>           # 运行此服务的组,默认与User相同 可以不填
Type=simple                 # 对于大多数二进制文件来说,Type=simple即可 及跑一次一直运行
# 根据程序需求,可能需要环境变量设置,如:
Environment="VAR_NAME=value"  #无要求可删
[Install]
WantedBy=default.target      # 表示随系统启动时加载该服务

注意:把完成以上编辑之后,把不用的注释删除掉,以免不必要的麻烦。
这边我准备的纯净一点的模板其中[]代表你要填的 只需要填两个简单服务

[Unit]
Description=[你的服务描述]
After=network.target

[Service]
ExecStart=[启动路径]
Restart=on-failure         
RestartSec=5                
User=root          
Group=root       
Type=simple               

[Install]
WantedBy=default.target

2.创建完毕文件之后 权限问题

注意要给文化相对于权限,给你刚刚上面的xxx.service权限
进入写的这个文件的文件夹 给对应的权限
以及你二进制文件的权限!!!重要!!!ExecStart=[启动路径]的权限

chmod 777 xxx.service

3.开始测试

重载 systemd 配置: 为了使systemd识别到新的服务文件,需要执行以下命令来重新加载系统单元文件。为了方便我以下用我的img1.service做示例。你要改服务的名字xxx.service

sudo systemctl daemon-reload

启动服务: 使用 systemctl start 命令启动你的服务。

sudo systemctl start img1.service

检查服务状态: 确认服务是否成功启动以及运行状态如何。

sudo systemctl status img1.service

如果服务成功启动,你应该能看到类似“active (running)”的状态信息。失败是fail要查看对应的原因
使用journalctl来查明对应的原因

sudo journalctl -u img1.service

设置开机自启: 如果希望该服务在系统启动时自动运行,可以启用它!!

sudo systemctl enable img1.service

手动停止并再次启动以验证重启功能: 测试Restart设置是否生效,你可以先停止服务,然后再次启动它。

sudo systemctl stop img1.service
sudo systemctl start img1.service

请注意,如果你的服务有依赖关系或者需要特殊的环境变量设置,请确保这些都在service文件中正确配置。也可以重启机器进行测试

reboot

4.报错,使用脚本的方式

上诉成功了,可以不看此内容
确保你手动启动你的二进制是可以成功的!!!
如果你实在找不到原因,可以使用注册脚本的方式,来替换ExecStart=[启动路径][]的内容
在任意路劲下写 文件 如 按下shift+: ---- :wq保存并退出 ---- :q!强制退出

vim /usr/script/

写对应你的启动命令如

#!/bin/bash
cd /xxx/xxx/xxx  #你二进制文件夹的位置
./img1.2   # 启动 不用+&还是nohup什么的

给.sh文件相对应的权限

chmod 777 

改写ExecStart=[启动路径][]的内容

[Unit]
Description=[你的服务描述]
After=network.target

[Service]
ExecStart= /usr/script/ #你的脚本路径
Restart=on-failure         
RestartSec=5                
User=root          
Group=root       
Type=simple               

[Install]
WantedBy=default.target

回到第三步进行测试,基本就解决问题的!