AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 479434
Accepted
Calvin Cheng
Calvin Cheng
Asked: 2013-02-17 01:32:18 +0800 CST2013-02-17 01:32:18 +0800 CST 2013-02-17 01:32:18 +0800 CST

golang 应用程序的服务文件

  • 772

所以我写了一个 golang 应用程序,systemd每当我的服务器重新启动时,我都希望通过它进行初始化。

这是服务文件:-

[Unit]
Description=golang wiki initialization

[Service]
Type=forking
PIDFile=/tmp/gowiki.pid-3030
User=root
Group=root
WorkingDirectory=/var/www
ExecStart=/bin/bash -c 'daemonize -o stdout.log -e stderr.log /var/www/wiki'

[Install]
WantedBy=multi-user.target

每当我重新启动服务器时,它似乎都运行良好,但是当我gowiki在终端中像这样手动启动或重新启动时,我仍然遇到轻微的刺激性问题:-

systemctl start gowiki

或者

systemctl restart gowiki

这确实让我的 gowiki 进程运行;然而,在我执行我的systemctl start gowiki命令后,我被冻结在我的终端中并且该命令似乎没有退出,直到我手动强制使用 Ctrl-C。

导致这个问题我做错了什么?

systemd
  • 2 2 个回答
  • 8167 Views

2 个回答

  • Voted
  1. Best Answer
    Calvin Cheng
    2013-02-17T01:52:01+08:002013-02-17T01:52:01+08:00

    这奏效了。

    [Unit]
    Description=golang wiki initialization
    
    [Service]
    PIDFile=/tmp/gowiki.pid-4040
    User=root
    Group=root
    WorkingDirectory=/var/www
    ExecStart=/bin/bash -c '/var/www/wiki'
    
    [Install]
    WantedBy=multi-user.target
    

    因为Type=forking服务期望父服务在服务实际启动之前退出。如果父级永远不会退出,那么 systemctl start 不会给你一个提示,因为它认为它没有完成执行。

    • 9
  2. Mark
    2018-12-18T00:16:33+08:002018-12-18T00:16:33+08:00

    如果您不介意为 systemd 稍微调整一下代码,那么到目前为止我发现的最干净的解决方案是使用 SDNotify 信号。

    import "github.com/coreos/go-systemd/daemon"
    
    func main() {
        // Important init stuff here
        ....
    
        // Notify systemd that we're ready
        sent, e := daemon.SdNotify(false, "READY=1")
        if e != nil {
            log.Fatal(e)
        }
        if !sent {
            log.Printf("SystemD notify NOT sent\n")
        }
    
        // And do something blocking like listening for HTTP(s)
    
    • 它没有 CGO-deps
    • 该代码也适用于非 systemd 系统(在这种情况下,它会发出未发送的警告通知)
    • 如果你想要一个工作示例:https ://github.com/mpdroog/dnsleak

    您相应的 systemd 单元文件:

    [Unit]
    Description=golang wiki initialization
    After=network.target
    Requires=network.target
    
    [Service]
    Type=notify
    
    Restart=always
    RestartSec=30
    TimeoutStartSec=0
    
    WorkingDirectory=/var/www
    ExecStart=/var/www/wiki
    User=www-data
    Group=www-data
    NoNewPrivileges=true
    
    [Install]
    WantedBy=multi-user.target
    
    • 1

相关问题

  • 如何在systemd服务中设置环境变量?

  • 将 shell 脚本置于 systemd 控制之下

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve