前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang 守护进程技巧

golang 守护进程技巧

作者头像
随心助手
发布2021-05-17 10:34:33
1.3K0
发布2021-05-17 10:34:33
举报
文章被收录于专栏:nginx遇上redisnginx遇上redis

方式1:

代码语言:javascript
复制
package main
import (
    "fmt"
    "log"
    "os"
    "runtime"
    "syscall"
    "time"
)
func daemon(nochdir, noclose int) int {
    var ret, ret2 uintptr
    var err syscall.Errno
    darwin := runtime.GOOS == "darwin"
    // already a daemon
    if syscall.Getppid() == 1 {
        return 0
    }
    // fork off the parent process
    ret, ret2, err = syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
    if err != 0 {
        return -1
    }
    // failure
    if ret2 < 0 {
        os.Exit(-1)
    }
    // handle exception for darwin
    if darwin && ret2 == 1 {
        ret = 0
    }
    // if we got a good PID, then we call exit the parent process.
    if ret > 0 {
        os.Exit(0)
    }
    /* Change the file mode mask */
    _ = syscall.Umask(0)
    // create a new SID for the child process
    s_ret, s_errno := syscall.Setsid()
    if s_errno != nil {
        log.Printf("Error: syscall.Setsid errno: %d", s_errno)
    }
    if s_ret < 0 {
        return -1
    }
    if nochdir == 0 {
        os.Chdir("/")
    }
    if noclose == 0 {
        f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
        if e == nil {
            fd := f.Fd()
            syscall.Dup2(int(fd), int(os.Stdin.Fd()))
            syscall.Dup2(int(fd), int(os.Stdout.Fd()))
            syscall.Dup2(int(fd), int(os.Stderr.Fd()))
        }
    }
    return 0
}
func main() {
    daemon(0, 1)
    for {
        fmt.Println("hello")
        time.Sleep(1 * time.Second)
    }
}

方式2:

代码语言:javascript
复制

package main
import (
 "fmt"
 "os/exec"
 //"os"
 //"time"
)
func main() {
 /*name := "/usr/local/bin/synchronize"
 args := []string{"switch --status 1"}
 attr := &os.ProcAttr{}
 proc, err := os.StartProcess(name, args, attr)
 if err != nil {
 fmt.Println(err)
 }
 _, err = proc.Wait()
 if err != nil {
 fmt.Println(err)
 }*/
 c := exec.Command("/bin/bash", "-c","/usr/local/bin/xxxxx xx --xx 1 >/dev/null 2>&1  &")
 out, err := c.Output()
 if err != nil {
 fmt.Println("cmd err is:"+ string(out))
 fmt.Println(err)
 }
	/*if e := c.Wait(); nil != e {
 fmt.Printf("ERROR: %v\n", e)
 }*/
 //fmt.Println(err)
 fmt.Println(out)
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nginx遇上redis 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方式2:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档