Не удается получить PID веб-сервера - PullRequest
0 голосов
/ 26 октября 2019

У меня есть простой веб-сервер Go:

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)
    }
}

И Makefile, который запускает его и кэширует PID в файл PID:

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 $$, но это тоже мало что делает.

Я также запускаю Makefile из рыбного терминала.

1 Ответ

4 голосов
/ 26 октября 2019

Когда вы запускаете команду из make, каждая команда выполняется в отдельной оболочке:

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

«nohup» будет выполняться в одной оболочке, а echo будет выполняться в другойракушка. В результате PID обратного заземленного процесса ($!) Доступен в первой строке, но НЕ во второй.

Простое решение - разместить две команды в одной строке.

run: kill build
    nohup ./server &  echo $! > server.pid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...