Golang Go语言中 systemctl 管理进程问题

发布于 1周前 作者 ionicwang 来自 Go语言

Golang Go语言中 systemctl 管理进程问题

初学 go,在部署的时候遇到了点问题,请大佬看下

参考 这篇文章 ,在/usr/lib/systemd/system在文件夹下创建wombatapp.service文件并写入内容,然后执行service wombatapp start 报错如下:

Failed to start wombatapp.service: The name org.freedesktop.PolicyKit1 was not provided by any .service files
See system logs and 'systemctl status wombatapp.service' for details

执行 systemctl status wombatapp.service 结果

● wombatapp.service - wombatapp
   Loaded: loaded (/usr/lib/systemd/system/wombatapp.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

wombatapp.service 文件内容:

[Unit]
Description=wombatapp

[Service] Type=simple Restart=always RestartSec=5s ExecStart=/home/ec2-user/wombatapp

[Install] WantedBy=multi-user.target

单独执行 wombatapp 文件是能成功运行的, 另外尝试了下用supervior来管理到是很轻松,没遇到任何问题直接成功了


更多关于Golang Go语言中 systemctl 管理进程问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

更多关于Golang Go语言中 systemctl 管理进程问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


另外建议用 sudo systemctl start wombatapp.service

直接后台运行呗。

感谢回复。 发现是权限问题…… sudo 就好了😂

用个管理工具,万一程序因为某些原因挂了它能重启

Type 有很多种的,可以换其他的如 forking, notify 试试效果

在Golang中,使用systemctl来管理服务进程通常涉及与systemd系统的交互。systemd是Linux上广泛使用的系统和服务管理器,而systemctl是控制systemd服务的命令行工具。虽然Go语言本身不直接提供与systemctl交互的API,但你可以通过执行外部命令来实现这一点。

要在Go中调用systemctl,你可以使用os/exec包来执行shell命令。例如,要启动一个名为myservice的服务,你可以这样做:

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("systemctl", "start", "myservice")
    err := cmd.Run()
    if err != nil {
        fmt.Println("Error starting service:", err)
    } else {
        fmt.Println("Service started successfully")
    }
}

类似地,你可以使用systemctl stop, systemctl status, systemctl enable等命令来控制服务。

需要注意的是,执行这些命令通常需要管理员权限,因此在生产环境中,你可能需要确保你的Go程序有足够的权限来调用systemctl。此外,对于错误处理,建议检查cmd.Wait()的返回值以及cmd.Stderr的输出,以获得更详细的错误信息。

总之,虽然Go语言不直接提供与systemd交互的库,但通过os/exec包执行shell命令是一个简单而有效的方法来实现对systemd服务的管理。

回到顶部