entr并且跑得不好玩

时间:2015-03-24 16:05:38

标签: go webserver restart

我正在go进行轻量级网络开发,并遇到entr的问题。我在

中编辑目录中的.go个文件
ls *.go | entr -r go run *.go

在单独的终端窗口中运行。

每次我保存文件时,我都可以看到它重新启动我的程序,因为每次我都会将一些格式语句打印到终端。但是,每当我导航到localhost:8080时,我都会看到当我开始entr时存在的处理程序内容(而不是最近更改中的内容)。如果我Ctrl+C,然后重新启动entr,我会看到最新的更改。

知道我做错了吗?

这是最小的例子:

// test.go
package main

import (
    "fmt"
    "net/http"
)

func handler (w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello there! I love %s!", r.URL.Path[1:])
}

func main() {
    fmt.Println("Starting up...")
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

现在,如果我运行ls test.go | entr -r go run test.go,我会看到Starting up...已打印到终端,我可以转到localhost:8080/tests查看显示"Hello there! I love tests!"的网页。如果我更改handler函数以使其读取

func handler (w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "I guess %s are ok...", r.URL.Path[1:])
}

我再次在终端中看到Starting up...消息,但转到localhost:8080/tests仍然显示"Hello there! I love tests!"页面(即使在隐身模式下)。如果我随后终止entr进程并重新启动它,我可以转到localhost:8080/tests按预期查看I guess tests are ok...

修改

ListenAndServe中获取错误,确认这与悬空套接字有关。

...
   err := http.ListenAndServe(":8080", nil)
   fmt.Printf("ListenAndServe ERR: %s\n", err)
...

显示额外的行

listen tcp :8080: bind: address already in use

在终端。快速搜索告诉我,没有一种简单的方法可以阻止以ListenAndServe开头的监听器。是否有比this更简单的方法?

1 个答案:

答案 0 :(得分:0)

问题: go run将在一个单独的进程中启动服务器,但不会被杀死。

解决方案: 使用一个杀死并启动服务器的小脚本

#!/bin/sh
pkill "$1"
go run "$1.go"

并将其用于entr