GoLang 的 daemonize 实现

func daemonize(cmd string, args []string, pipe io.WriteCloser) error {
	pid, _, sysErr := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
	if sysErr != 0 {
		return fmt.Errorf("fail to call fork")
	}
	if pid > 0 {
		if _, err := syscall.Wait4(int(pid), nil, 0, nil); err != nil {
			return fmt.Errorf("fail to wait for child process: %v", err)
		}
		return nil
	} else if pid < 0 {
		return fmt.Errorf("child id is incorrect")
	}

	ret, err := syscall.Setsid()
	if err != nil || ret < 0 {
		return fmt.Errorf("fail to call setsid")
	}

	signal.Ignore(syscall.SIGHUP)
	syscall.Umask(0)

	nullFile, err := os.Open(os.DevNull)
	if err != nil {
		return fmt.Errorf("fail to open os.DevNull: %v", err)
	}
	files := []*os.File{
		nullFile, // (0) stdin
		nullFile, // (1) stdout
		nullFile, // (2) stderr
	}
	attr := &os.ProcAttr{
		Dir:   "/",
		Env:   os.Environ(),
		Files: files,
	}
	child, err := os.StartProcess(cmd, args, attr)
	if err != nil {
		return fmt.Errorf("fail to start process: %v", err)
	}

	buff := make([]byte, 4)
	binary.BigEndian.PutUint32(buff[:], uint32(child.Pid))
	if n, err := pipe.Write(buff); err != nil || n != 4 {
		return fmt.Errorf("fail to write back the pid")
	}

	os.Exit(0)
	return nil
}

  

转载于:https://www.cnblogs.com/YaoDD/p/5558857.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值