myappをデーモン化したいが、大きな問題がある。私が使っているチャンネルは、タイプがchan struct{}
です。 しかし、パッケージgetopt(flag package)では、私のフラグは* bool型であるため、myappをどのように変更できますか分かりません。non-chanタイプから受信する* bool
boolチャンネルタイプでは不十分です。私は理解していない概念があると確信しています。私はこのエラーを見ることができ、go install
で
package main
import (
"os"
"syscall"
"time"
"github.com/pborman/getopt/v2"
"github.com/sevlyar/go-daemon"
)
var (
done = make(chan struct{})
optQuit = make(chan struct{})
optRun = make(chan struct{})
)
func TermHandler(sig os.Signal) error {
optQuit <- struct{}{}
if sig == syscall.SIGQUIT {
<-done
}
return nil
}
func main() {
optHelp := getopt.BoolLong("help", 'h', "Help")
optQuit := getopt.BoolLong("quit", 0, "Help")
optRun := getopt.BoolLong("run", 'r', "Help")
if *optHelp {
getopt.Usage()
os.Exit(0)
}
// Create pid file
cntxt := &daemon.Context{
PidFileName: "/var/run/myapp.pid",
PidFilePerm: 0644,
WorkDir: "./",
Umask: 027,
Args: []string{"[Z]"},
}
if len(daemon.ActiveFlags()) > 0 {
d, _ := cntxt.Search()
daemon.SendCommands(d)
return
}
d, err := cntxt.Reborn()
if d != nil {
return
}
if err != nil {
os.Exit(1)
}
defer cntxt.Release()
// Define ticker
ticker := time.NewTicker(time.Second)
myapp := true
// Loop
for myapp {
select {
// Case sleep
case <- ticker.C:
time.Sleep(time.Second)
// Case QUIT
case <- optQuit:
done <- struct{}{}
myapp = false
ticker.Stop()
os.Exit(0)
// Case RUN
case <- optRun:
// Executes a goroutine...
}
}
}
:私はあなたのコードを添付
./main.go:72: invalid operation: <-optQuit (receive from non-chan type *bool)
./main.go:79: invalid operation: <-optRun (receive from non-chan type *bool)
私はチャンネルを変更する必要がありますか分からない
(行われ、型構造体のoptQuit {})これを解決するには...
PS:私が行った例を示します。これはデーモンとして実行され、毎分、Writer()関数を実行します。 zdaemon -z quit
と入力すると、アプリは正常にシャットダウンします。あなたは、あなたのマシンで実行することができます:あなたの主な機能で
https://play.golang.org/p/RVq7M7usEj
は多分HTTPSでみてください、ここでのトピックオフビットです。 com/ – Krom