【问题标题】:Cannot get the PID of a web server无法获取 Web 服务器的 PID
【发布时间】:2019-10-26 02:19:37
【问题描述】:

我有一个简单的 Go web 服务器:

package main

import (
    "net/http"
    "strings"
)

func sayHello(w http.ResponseWriter, r *http.Request) {
    message := r.URL.Path
    message = strings.TrimPrefix(message, "/")
    message = "Hello " + message
    w.Write([]byte(message))
}

func main() {
    http.HandleFunc("/", sayHello)
    if err := http.ListenAndServe(":8080", nil); err != nil {
        panic(err)
    }
}

还有一个运行它并将 PID 缓存到 PID 文件的 Makefile:

GOSRC=$(wildcard *.go)
.PHONY: kill
kill:
    echo ""
.PHONY: neaten
neaten:
    go clean
    go mod tidy
    go mod download
    goimports -w $(GOSRC)
    go vet $(GOSRC)
    go test -cover $(GOSRC)
.PHONY: build
build: neaten
    go build -o server $(GOSRC)
.PHONY: run
run: kill build
    nohup ./server &
    echo $! > server.pid

但是,echo $! 由于某种原因不起作用,我得到的是一个空的 server.pid 文件。 该过程肯定正在运行,因为我可以访问 Web 服务器。但是echo $! 什么也没做。

我也尝试过echo $$,但这也没什么用。

我也在从 fish 终端运行 Makefile。

【问题讨论】:

  • 如果在 shell 中手动运行这些 nohup 和 echo 命令是否有效?
  • 不适用于鱼码头......但这不重要,因为我这样做了SHELL := /bin/bash
  • Side cmets - (1) 正如“volker”所指出的,Makefile 不是启动服务器的好平台。作为替代方案,考虑创建“server.sh”。 (2) 另外,一旦成功开始服务请求,请考虑扩展服务器以写入 server.pid 文件。
  • @dash-o 我最终将 nohup 命令移至 sh 文件,因为这是我让它正常运行的唯一方法

标签: bash go process


【解决方案1】:

当您从make 运行命令时,每个命令都在单独的 shell 中执行:

run: kill build
    nohup ./server &
    echo $! > server.pid

'nohup' 将在一个 shell 中执行,echo 将在另一个 shell 中执行。因此,后台进程 ($!) 的 PID 在第一行中可用,但在第二行中不可用。

简单的解决方案是将两个命令放在同一行。

run: kill build
    nohup ./server &  echo $! > server.pid

【讨论】:

  • 我收到了Syntax error: "&&" unexpected,但你的逻辑是有道理的......
  • 我也尝试过(nohup ./server &) && echo $! > server.pid,它也没有任何回应......
  • 我也设置了SHELL:=/bin/bash,但这也不起作用...
  • 我认为这只是命令之间的& 而不是& &&
  • @Whiteclaws - 抱歉,请删除 &&。只需 '&' 就可以了。不能将背景和 '&&' 结合起来,因为 '&&' 需要状态码。
猜你喜欢
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
相关资源
最近更新 更多