【发布时间】:2019-10-26 02:19:37
【问题描述】:
我有一个简单的 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 文件。
该过程肯定正在运行,因为我可以访问 Web 服务器。但是echo $! 什么也没做。
我也尝试过echo $$,但这也没什么用。
我也在从 fish 终端运行 Makefile。
【问题讨论】:
-
如果在 shell 中手动运行这些 nohup 和 echo 命令是否有效?
-
不适用于鱼码头......但这不重要,因为我这样做了
SHELL := /bin/bash -
Side cmets - (1) 正如“volker”所指出的,Makefile 不是启动服务器的好平台。作为替代方案,考虑创建“server.sh”。 (2) 另外,一旦成功开始服务请求,请考虑扩展服务器以写入 server.pid 文件。
-
@dash-o 我最终将 nohup 命令移至 sh 文件,因为这是我让它正常运行的唯一方法