为了账号安全,请及时绑定邮箱和手机立即绑定

无法获取 Web 服务器的 PID

无法获取 Web 服务器的 PID

Go
摇曳的蔷薇 2023-07-31 16:00:38
我有一个简单的 Go Web 服务器:package mainimport (    "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: killkill:    echo "".PHONY: neatenneaten:    go clean    go mod tidy    go mod download    goimports -w $(GOSRC)    go vet $(GOSRC)    go test -cover $(GOSRC).PHONY: buildbuild: neaten    go build -o server $(GOSRC).PHONY: runrun: kill build    nohup ./server &    echo $! > server.pid但是,echo $!由于某种原因不起作用,我得到的是一个空的 server.pid 文件。该进程肯定正在运行,因为我可以访问网络服务器。但echo $!什么也不做。我也尝试过echo $$,但这也没有多大作用。我还从 Fish 终端运行 Makefile。
查看完整描述

1 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

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


run: kill build

    nohup ./server &

    echo $! > server.pid

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


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


run: kill build

    nohup ./server &  echo $! > server.pid


查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信