golang os.StartProcess 子进程标准输出问题

xxie · · 972 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

在开发 一个进程管理程序时使用os.StartProcess 方法启动进程 为 进程的标准输出,错误输出 进行日志处理,日志需要添加 时间前缀所以需要截断 输出流进行 时间追加。具体代码如下 logOutput1, logOutput12, err := getLogFile(logPath) if err != nil { return nil, err } attr := &os.ProcAttr{ Dir: filepath.Dir(processFile), Env: os.Environ(), Files: []*os.File{nil, logOutput1, logOutput12}, Sys: &syscall.SysProcAttr{ Credential: &syscall.Credential{ Uid: uid, Gid: gid, }, Setsid: true, }, } var processParams = []string{processFile} if len(extArgs) > 0 { processParams = append(processParams, strings.Split(extArgs, " ")...) } process, err := os.StartProcess(processFile, processParams, attr) func getLogFile(customLogFile string) (*os.File,*os.File, error) { logFile, err := os.OpenFile(customLogFile, syscall.O_CREAT|syscall.O_APPEND|syscall.O_WRONLY, 0755) if err != nil { return nil,nil, err } rf1,wf1,err2:= os.Pipe() if err2 != nil{ log("管道开启失败-" + err2.Error()) } go func (rf, wf *os.File){ for{ buffer := make([]byte, 5000) flen ,err := rf.Read(buffer) if err == io.EOF{ if wf != nil{ wf.Close() } rf.Close() break } if err == nil{ if flen < 1{ continue } now := time.Now().Format("2006-01-02 15:04:05") + " " wf.Write(append([]byte(now), buffer[:flen]...)) }else{ continue } } }(rf1,logFile) rf2,wf2,err3:= os.Pipe() if err3 != nil{ log("管道开启失败-" + err3.Error()) } go func (rf, wf *os.File){ for{ buffer := make([]byte, 5000) flen ,err := rf.Read(buffer) if err == io.EOF { if wf != nil{ wf.Close() } rf.Close() break } if err == nil{ if flen < 1{ continue } now := time.Now().Format("2006-01-02 15:04:05") + " " wf.Write(append([]byte(now), buffer[:flen]...)) }else{ continue } } }(rf2,logFile) return wf1,wf2, nil } 测试执行启动程序后 子进程 总是会出现 标准输出无法写入导致 子进程挂掉,有谁了解的吗帮忙解答下

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

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

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