方式1:

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:


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)
}