【问题标题】:How do I get my Golang web server to run in the background?如何让我的 Golang Web 服务器在后台运行?
【发布时间】:2012-09-11 06:55:32
【问题描述】:

我最近完成了Wiki web 开发教程 (http://golang.org/doc/articles/wiki/)。我玩得很开心,我想用 net/http 包进行更多实验。

但是,我注意到当我从控制台运行 wiki 时,wiki 会接管控制台。如果我关闭控制台终端或使用 CTRL+Z 停止进程,则服务器将停止。

如何让服务器在后台运行?我认为这个术语是在守护进程中运行。

我在 Ubuntu 12.04 上运行它。感谢您的帮助。

【问题讨论】:

    标签: linux shell daemon


    【解决方案1】:

    简单/可用的东西优先

    如果您想要一个不费吹灰之力的启动脚本,您可以使用upstart 服务。有关示例,请参见相应的手册页和 /etc/init/*.conf。在创建了这样一个过程之后 你可以通过调用来启动你的服务器

    service myserver start
    

    如果您想要更多功能,例如特定限制或权限管理,您可以尝试xinetd

    使用外壳

    你可以这样开始你的过程:

    nohup ./myexecutable &
    

    & 告诉 shell 在后台启动命令,并将其保留在作业列表中。 在某些 shell 上,如果父 shell 使用 HANGUP 信号退出,则作业将被终止。 为防止这种情况,您可以使用nohup 命令启动您的命令,该命令会丢弃 HANGUP 信号。

    但是,如果被调用进程重新连接 HANGUP 信号,这将不起作用。

    确实,您需要从 shell 的作业列表中删除该进程。 对于两个众所周知的 shell,这可以实现如下:

    重击:

    ./myexecutable &
    disown <pid>
    

    zsh:

    ./myexecutable &!
    

    杀死你的后台工作

    通常,shell 会打印进程的 PID,然后可以使用kill 命令将其终止,以停止服务器。如果你的 shell 不打印 PID,你可以使用

    echo $!
    

    执行后直接。这将打印分叉进程的 PID。

    【讨论】:

    • 那我要怎么回去停止,或者重启呢?
    • &amp; 在您关闭终端时仍会使用命令(取决于您的外壳)。在 bash 中,您需要在使用 &amp;ctrl+Z 进行后台处理后,在其中运行 screennohupdisown
    • @lunixbochs,您不依赖于 shell 的行为可能是对的。我会更新我的答案。
    • 感谢您提供如此详细的回答!如果您在启动后台进程时忘记记录 PID,我可以看到像 upstart 这样的程序会很方便。我将试验这两种技术并报告。
    • 我刚刚尝试使用 bash 版本 5.0.17(1)-release 的 &amp;!,它成功了。
    【解决方案2】:

    您可以使用Supervisord 来管理您的流程。

    【讨论】:

    • 监控是另一种选择。
    【解决方案3】:

    Ubuntu?使用upstart

    /etc/init 中为您的工作创建一个文件,命名为your-service-name.conf

    start on net-device-up
    exec /path/to/file --option
    

    您可以使用start your-service-name,以及:stoprestartstatus

    【讨论】:

    • Upstart 似乎已被 systemd 取代,不是吗?现在怎么办?在 Ubuntu LTS 14.04
    • sudo service start your-service-name 不起作用,找不到服务
    【解决方案4】:

    这将使用systemd 配置您的服务,这不是一个全面的教程,而是如何设置的快速入门。

    app.service 文件的内容

    [Unit]  
    Description=deploy-webhook service
    After=network.target
    
    [Service]      
    ExecStart=/usr/bin/go webhook.go    
    WorkingDirectory=/etc/deploy-webhook
    
    User=app-svc      
    Group=app-svc
    
    Restart=always    
    RestartSec=10    
    KillSignal=SIGINT
    
    SyslogIdentifier=deploy-webhook-service      
    PrivateTmp=true  
    
    Environment=APP_PARAM_1=ParamA
    Environment=APP_PARAM_2=ParamB
    
    [Install]      
    WantedBy=multi-user.target  
    

    启动服务

    sudo systemctl start deploy-webhook.service
    

    服务状态

    sudo systemctl status deploy-webhook.service
    

    日志

    journalctl -u deploy-webhook -e
    

    【讨论】:

      【解决方案5】:

      按下 ctrl+z (使当前任务进入睡眠状态)后,您可以在终端(代表后台)中运行命令 bg 让最新任务继续在后台运行。

      如果需要,请运行 fg 以返回任务。

      要获得相同的结果,您可以在命令末尾添加&amp; 以在后台启动它。

      【讨论】:

        猜你喜欢
        • 2015-07-13
        • 2018-02-04
        • 2015-07-27
        • 2013-04-21
        • 2015-11-24
        • 2020-05-01
        • 1970-01-01
        • 2017-05-20
        • 2020-03-15
        相关资源
        最近更新 更多