创建一个系统服务
sudo vim /etc/systemd/system/myprogram.service
创建文件
[Unit]
Description=我的自定义程序服务
After=network.target # 可选:在网络启动后运行,如果需要网络依赖
[Service]
Type=simple # 默认类型,主进程直接运行
ExecStart=/usr/bin/myprogram # 启动命令,必须用绝对路径
ExecReload=/bin/kill -HUP $MAINPID # 可选:重载命令
Restart=always # 可选:程序退出时自动重启(推荐)
WorkingDirectory=/path/to/dir # 可选:工作目录
Environment="KEY=VALUE" # 可选:环境变量
[Install]
WantedBy=multi-user.target # 开机自启动的目标
#simple:程序直接在前台运行(最常见)。 类似于夯住前台一样 ,脚本的内的就不能 添加 进入后台的命令了,比如 nohub & ssh -f 之类的
forking:程序通过 fork() 后台运行(旧式 daemon,需要指定 PIDFile)。
oneshot:只执行一次命令(如脚本),然后退出。
你的程序是脚本(如 /opt/myscript.sh),确保脚本有执行权限(chmod +x),并在 ExecStart 中用 /bin/bash /opt/myscript.sh
创建一个最脚本的server服务
脚本 chmod +x 给权限
[root@123 /server/my-ssh-proxy]# cat my-ssh-proxy.sh
#!/bin/bash
exec /usr/bin/ssh -o StrictHostKeyChecking=no -C -g -b 0.0.0.0 -L 1080:192.168.1.11:1080 root@192.168.1.198 "vmstat 30" >/dev/null
# 注意 simple:程序直接监测 在前台运行 脚本的内的就不能 添加 进入后台的命令了,比如 nohub & ssh -f 之类的
cat >/etc/systemd/system/my-ssh-proxy.service<<'EOF'
[Unit]
Description=my-ssh-proxy
After=network.target
[Service]
Type=simple
ExecStart=/server/my-ssh-proxy/my-ssh-proxy.sh
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
# 重新加载systemd 的配置
sudo systemctl daemon-reset-failed my-ssh-proxy.service # 清除之前的失败状态
systemctl enable my-ssh-proxy.service
# 在设置一下开机自动启动
CentOS 7 中,systemd 的版本较旧(通常是 systemd 219 或类似版本),不支持 StartLimitIntervalSec 和 StartLimitBurst 这两个参数。
这两个参数是从 systemd 230 版本开始才引入的:
CentOS 7:systemd 219(不支持)
CentOS 8 / RHEL 8及以后:systemd 239+(支持)
有些参数 可以支持 有些不支持,一般就是 用户和用户组
重启的故障状态检查
Restart=always 重启类型
RestartSec=10 重启时间间隔
StartLimitIntervalSec=60 重启窗口
StartLimitBurst=3 重启窗口内的重启次数