在开发 一个进程管理程序时使用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
}
测试执行启动程序后 子进程 总是会出现 标准输出无法写入导致 子进程挂掉,有谁了解的吗帮忙解答下
有疑问加站长微信联系(非本文作者)