用golang启动一个daemon

toby · · 1294 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

用golang启动一个daemon

 1 package main
 2  
 3 import (
 4     "fmt"
 5     "log"
 6     "os"
 7     "runtime"
 8     "syscall"
 9     "time"
10 )
11  
12 func daemon(nochdir, noclose int) int {
13     var ret, ret2 uintptr
14     var err syscall.Errno
15  
16     darwin := runtime.GOOS == "darwin"
17  
18     // already a daemon
19     if syscall.Getppid() == 1 {
20         return 0
21     }
22  
23     // fork off the parent process
24     ret, ret2, err = syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
25     if err != 0 {
26         return -1
27     }
28  
29     // failure
30     if ret2 < 0 {
31         os.Exit(-1)
32     }
33  
34     // handle exception for darwin
35     if darwin && ret2 == 1 {
36         ret = 0
37     }
38  
39     // if we got a good PID, then we call exit the parent process.
40     if ret > 0 {
41         os.Exit(0)
42     }
43  
44     /* Change the file mode mask */
45     _ = syscall.Umask(0)
46  
47     // create a new SID for the child process
48     s_ret, s_errno := syscall.Setsid()
49     if s_errno != nil {
50         log.Printf("Error: syscall.Setsid errno: %d", s_errno)
51     }
52     if s_ret < 0 {
53         return -1
54     }
55  
56     if nochdir == 0 {
57         os.Chdir("/")
58     }
59  
60     if noclose == 0 {
61         f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
62         if e == nil {
63             fd := f.Fd()
64             syscall.Dup2(int(fd), int(os.Stdin.Fd()))
65             syscall.Dup2(int(fd), int(os.Stdout.Fd()))
66             syscall.Dup2(int(fd), int(os.Stderr.Fd()))
67         }
68     }
69  
70     return 0
71 }
72  
73 func main() {
74     daemon(0, 1)
75     for {
76         fmt.Println("hello")
77         time.Sleep(1 * time.Second)
78     }
79  
80 }

 

本文来自:博客园

感谢作者:toby

查看原文:用golang启动一个daemon

1294 次点击  
加入收藏 微博
0 回复
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传