2

golang 创建守护进程

 1 year ago
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小时之前 开始浏览    
这是一个创建于 2015-06-17 20:15:59 的文章,其中的信息可能已经有所发展或是发生改变。

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来生成新进程,只是这样不知道为什么总是注册不了信号量处理函数

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


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

280

本文来自:CSDN博客

感谢作者:ghost911_slb

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

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

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK