github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/libcmdline/fork_nix.go (about)

     1  // Copyright 2018 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  //go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
     5  // +build darwin dragonfly freebsd linux netbsd openbsd solaris
     6  
     7  package libcmdline
     8  
     9  import (
    10  	"os"
    11  	"syscall"
    12  
    13  	"github.com/keybase/client/go/logger"
    14  )
    15  
    16  // SpawnDetachedProcess spawns a background process and detech from the calling
    17  // process.
    18  func SpawnDetachedProcess(
    19  	cmd string, args []string, _ logger.Logger) (pid int, err error) {
    20  	var files []uintptr
    21  	var devnull *os.File
    22  
    23  	defer func() {
    24  		if err != nil && devnull != nil {
    25  			devnull.Close()
    26  		}
    27  	}()
    28  
    29  	if devnull, err = os.OpenFile("/dev/null", os.O_RDONLY, 0); err != nil {
    30  		return
    31  	}
    32  	nullfd := devnull.Fd()
    33  	files = append(files, nullfd, nullfd, nullfd)
    34  
    35  	attr := syscall.ProcAttr{
    36  		Env:   os.Environ(),
    37  		Sys:   &syscall.SysProcAttr{Setsid: true},
    38  		Files: files,
    39  	}
    40  
    41  	pid, err = syscall.ForkExec(cmd, args, &attr)
    42  	return pid, err
    43  }