golang標準ではデーモンを作れないという話を聞いたことがありましたが,
デーモン化対応は続いているみたいです.
さて、困った.標準でやりたかったなー.と思っていたのですが,とりあえず作成したプログラム単体でできるように以下の方法を取りました.
- os.Args[0]で自身のファイルパスを得る
- exec.Command.Start()で外部プログラムとして実行する
ざっくり以下のようになります.
if デーモン化する == true { cmd := exec.Command(os.Args[0], "--server") cmd.Start() return } if --serverオプションが指定されていた == true { デーモン実行するときに行う処理 }
終了する時にプロセスIDを探してkillしないとならないのがちょっと面倒ですが
要件によってはこれで十分かと思います.
以下は大変参考になりました.ありがたい.
「ほい、これ」ってファイルを渡せる Hoi というツールをつくった
2017/04/27 追記
まともにデーモン化する方法も書いた.