2017-06-20 5 views
-5

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

+0

は多分HTTPSでみてください、ここでのトピックオフビットです。 com/ – Krom

答えて

0

これらの2行は、あなたのグローバル変数宣言シャドウ:あなただけの素敵な使用状況を取得するには、それらを使用している場合

optQuit := getopt.BoolLong("quit", 0, "Help") 
optRun := getopt.BoolLong("run", 'r', "Help") 

を、なぜ使用機能を作成しない あなた自身?

あなただけの使用を作成するためにgetoptを使用して主張する場合は、代わりに

_ = getopt.BoolLong("quit", 0, "Help") 
_ = getopt.BoolLong("run", 'r', "Help") 

ください。

*optHelpを使用する前にgetopt.Parse()に電話する必要があります。

結果のメッセージ

Usage: test [-hr] [--quit] [parameters ...] 
-h, --help Help 
    --quit Help 
-r, --run Help 

は便利未満であるように思われます。なぜ、あなたはグローバルoptQuit = make(chan struct{})を定義し、メインでそれをシャドウ

fmt.Printf(` 
Usage: test 
    This program will start a daemon service, which you can use like this ... 
`) 
+0

これは私がやりたかったことですが、私はgetopt.BoolLongの戻り値をselect関数で使用する必要があると思いました...ありがとう! – icarbajo

0

をしない:optQuit := getopt.BoolLong("quit", 0, "Help")

だから、メインoptQuitではないchan

がメインで、これら2つの行を削除し、bool次のとおりです。//codereview.stackexchangeを:

optQuit := getopt.BoolLong("quit", 0, "Help") 
optRun := getopt.BoolLong("run", 'r', "Help") 
+0

私はあなたのソリューションを理解していますが、このパッケージを使用してヘルプメニューを表示しています...これは問題です。 – icarbajo

+0

あなたは何をしようとしているのか分かりません。 'optQuit'のヘルプを表示しますか?そして誰かがparam 'h'を出すとすぐに文字列を出力してください。パッケージを誤用したり、プログラムを強制終了したりしないでください。 – RickyA

関連する問題