我有一個簡單的 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
- 1 回答
- 0 關注
- 148 瀏覽
添加回答
舉報
0/150
提交
取消