golang 创建守护进程

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

package main

import (

"os"

"os/exec"

"path/filepath"

)

if os.Getppid()!=1{           //判断当其是否是子进程,当父进程return之后,子进程会被 系统1 号进程接管

filePath,_:=filepath.Abs(os.Args[0])  //将命令行参数中执行文件路径转换成可用路径
cmd:=exec.Command(filePath,os.Args[1:]...) //将其他命令传入生成出的进程
cmd.Stdin=os.Stdin                               //给新进程设置文件描述符,可以重定向到文件中
cmd.Stdout=os.Stdout
cmd.Stderr=os.Stderr
cmd.Start()                                          //开始执行新进程,不等待新进程退出
return

}

这样可以创建守护进程,并且可以接受信号量

另一种方式

if os.Getppid()!=1{   

args:=append([]string{filePath},os.Args[1:]...)
os.StartProcess(filePath,args,&os.ProcAttr{Files:[]*os.File{os.Stdin,os.Stdout,os.Stderr}})
return

}

也可以创建守护进程,文档上说startProcess是更底层的接口,cmd是高级的接口

其实还可以更低层

pid, _, sysErr := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
if sysErr != 0 {
Utils.LogErr(sysErr)

return
}

go源码中其实就是这么生成新进程的

直接调用系统函数fork来生成新进程,只是这样不知道为什么总是注册不了信号量处理函数

所以用上面两种方式就可以了


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:ghost911_slb

查看原文:golang 创建守护进程

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

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