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=[启动路径]
中[]
的内容
在任意路劲下写 xxx.sh
文件 如 按下shift+:
---- :wq
保存并退出 ---- :q!
强制退出
vim /usr/script/xxx.sh
写对应你的启动命令如
#!/bin/bash
cd /xxx/xxx/xxx #你二进制文件夹的位置
./img1.2 # 启动 不用+&还是nohup什么的
给.sh文件相对应的权限
chmod 777 xxx.sh
改写ExecStart=[启动路径]
中[]
的内容
[Unit]
Description=[你的服务描述]
After=network.target
[Service]
ExecStart= /usr/script/xxx.sh #你的脚本路径
Restart=on-failure
RestartSec=5
User=root
Group=root
Type=simple
[Install]
WantedBy=default.target
回到第三步进行测试,基本就解决问题的!