bash - 无法获取 Web 服务器的 PID

标签 bash go process

我有一个简单的 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。

最佳答案

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

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

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

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

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

关于bash - 无法获取 Web 服务器的 PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58567551/

相关文章:

go - http 函数 Golang 的附加参数

windows - 挂起的进程是否仍会消耗 CPU/RAM?

process - 如何使用CMD中的Wmic Job Get/List获取进程名称和位置?

bash - 将标准错误捕获到 bash 中的变量中

android - 打开 USB 中继 - Android

linux - 在 bash 中使用 egrep 查找文件中的确切单词

bash - awk中的调用函数

go - 为什么在迭代过程中向 map 添加项目会产生不一致的结果?

go - 为什么在 init() 中检查 nil

process - 在C#中启动非exe进程时可以使用模拟吗?