

golang 创建守护进程
source link: https://studygolang.com/articles/3597?fr=sidebar
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
golang 创建守护进程
ghost911_slb · 2015-06-17 20:15:59 · 12805 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览package main
import (
"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来生成新进程,只是这样不知道为什么总是注册不了信号量处理函数
所以用上面两种方式就可以了
有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK