跳到主要内容

Linux中使用Systemd服务运行和自动重启程序

最近完成了一个Go的后端项目,当我把它按照我服务器的系统和架构Build完成,并且把二进制文件上传到服务器以后,我发现:当我运行程序后,如果关掉当前的Terminal窗口,程序就会停止,不同与以前我把项目先用Docker容器化,再部署到服务器中,我可以使用docker compose up -d来让程序运行在后台。

经过一系列探索和试错,我采用了Systemd来托管程序的自动重启和停止,以下记录过程:

在Linux服务器中,前往 /etc/systemd/system目录:

cd /etc/systemd/system

随后创建一个.service文件,如automate-my-go-program.service,内容如下:

[Unit]
Description=对该程序的描述
After=network.target # 这里确保我们的服务仅在network开启并运行后才会开启

[Service]
ExecStart=/path/of/your/go/program # Go可执行程序的位置
WorkingDirectory=/path/of/your/program/working/dir # 你程序的运行目录
Restart=always
Environment=PORT=4000 # 这与下面三个是我程序用到的环境变量
Environment=DB_URL=some-url-content
Environment=JWT_SECRET=some-secret-content
Environment=SERVE_MODE=production

[Install]
WantedBy=multi-user.target

随后保存该文件并退出,运行下面一系列命令。

重新加载systemd

sudo systemctl daemon-reload

允许程序开机自动运行

sudo systemctl enable automate-my-go-program.service

开启服务

sudo systemctl start automate-my-go-program.service

这样程序就会在后台运行,并且在系统重启时自动运行了。


这个问题解决后,我继续采用相似方法来解决Docker服务重启后不会自动开启的问题,懒得描述了,直接记录下内容:

[Unit]
Description=开启我的Docker服务
Requires=docker.service
After=docker.service

[Service]
Type=oneshot # 表明ExecStart仅执行一次
RemainAfterExit=yes # 表明在ExecStart命令执行后,仍保持服务Active状态
WorkingDirectory=/path/of/your/program/working/dir # 你程序的运行目录
ExecStart=/usr/bin/docker compose start # 这里使用绝对路径定位docker的可执行文件
ExecStop=/usr/bin/docker compose stop # 如果你用docker-compose,位置改成 /usr/local/bin/docker-compose
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

Happy Coding.