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