无法获取 Web 服务器的 PID

我有一个简单的 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 文件。该进程肯定正在运行,因为我可以访问网络服务器。但echo $!什么也不做。


我也尝试过echo $$,但这也没有多大作用。


我还从 Fish 终端运行 Makefile。


摇曳的蔷薇
浏览 111回答 1
1回答

皈依舞

当您从 运行命令时make,每个命令都在单独的 shell 中执行:run: kill build    nohup ./server &    echo $! > server.pid“nohup”将在一个 shell 中执行,并且echo将在不同的 shell 中执行。因此,后台进程 ($!) 的 PID 在第一行中可用,但在第二行中不可用。简单的解决方案是将两个命令放在同一行。run: kill build    nohup ./server &  echo $! > server.pid
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go