Skip to content

Instantly share code, notes, and snippets.

@funnythingz
Created February 19, 2015 15:00
Show Gist options
  • Save funnythingz/5b98d0efaf56387745b7 to your computer and use it in GitHub Desktop.
Save funnythingz/5b98d0efaf56387745b7 to your computer and use it in GitHub Desktop.
daemon demo
package main
import (
"fmt"
"html"
"net/http"
"os"
"syscall"
)
func main() {
// daemon実行
errcd := daemon(0, 0)
if errcd != 0 {
fmt.Println("daemon err!!")
os.Exit(1)
}
// ここでカレントディレクトリを実行ファイルのディレクトリにしておくと後々困らない
// hogehogeを実行ファイルのディレクトリに置き換えてください
// os.Chdir("/hogehoge")
// topページ
http.HandleFunc("/", Top)
// displayページ
http.HandleFunc("/disp", Display)
// Webサーバを8080ポートで開始する
err := http.ListenAndServe(":8000", nil)
// エラーが発生した場合にここに到達する
if err != nil {
// deamon関数で端末と切り離しているので出力されない
// エラー内容を確認するにはlogファイルを出力するなどの対応が必要
// fmt.Println(err)
os.Exit(2)
}
}
func Top(w http.ResponseWriter, r *http.Request) {
// topページのリクエストがくると「Welcome!!」と表示する
fmt.Fprintf(w, "<html><body>Welcome!!</body></html>")
}
func Display(w http.ResponseWriter, r *http.Request) {
// val1とval2に設定された文字列を取得
val1 := r.FormValue("val1")
val2 := r.FormValue("val2")
// displayページのリクエストがくるとval1とval2を表示する
fmt.Fprintf(w, "<html><body>Input String: %s, %s</body></html>",
html.EscapeString(val1), html.EscapeString(val2))
}
func daemon(nochdir, noclose int) int {
var ret uintptr
var err syscall.Errno
// バックグラウンドプロセスにする
// 子プロセスを生成し,親プロセスを終了する
ret, _, err = syscall.Syscall(syscall.SYS_FORK, 0, 0, 0)
if err != 0 {
return -1
}
switch ret {
case 0:
// 子プロセスが生成できたらそのまま処理を続ける
break
default:
// 親プロセスだとここで終了する
os.Exit(0)
}
// 新しいセッションを生成(子プロセスがセッションリーダになる)
pid, _ := syscall.Setsid()
if pid == -1 {
return -1
}
if nochdir == 0 {
// カレントディレクトリの再設定。ここではルートにしておく
os.Chdir("/")
}
// ファイルのパーミッションを再設定(必須ではない。オプション)
syscall.Umask(0)
if noclose == 0 {
// 標準入出力先を/dev/nullファイルに変更して、すべて破棄する
f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
if e == nil {
fd := int(f.Fd())
syscall.Dup2(fd, int(os.Stdin.Fd()))
syscall.Dup2(fd, int(os.Stdout.Fd()))
syscall.Dup2(fd, int(os.Stderr.Fd()))
}
}
return 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment