最近写一个go的小程序,启动linux系统上的一个进程并检测其是否启动正常
func main() {
//开始
step1...
step2...
step3...
go proc.StartProcess()
// 检查进程是否ok
for {
time.Sleep(time.Second * 1)
if proc.StartError {
//不ok
return
}
if proc.Running {
//ok
break
}
}
//结束
}
external_process.go
type ExternalProcess struct {
AsUser string
EnvMap map[string]string
Process string
Args []string
RunningFlag string
StartError bool
IPid int
Running bool
}
func (externalProcess *ExternalProcess) StartProcess() {
step1
step2
go externalProcess.checkProcess(stdoutPipe)
step3
err = cmd.Wait()
}
func (externalProcess *ExternalProcess) checkProcess(stdoutPipe io.ReadCloser) {
for {
line, _, err := lineReader.ReadLine()
logger.Info(string(line))
if strings.Contains(string(line), externalProcess.RunningFlag) {
logger.Info("running flag mapped")
externalProcess.Running = true
break
}
if err == io.EOF {
externalProcess.StartError = true
break
}
}
}
问题1:像这种流水账式的工具应用,如何使step1,2,3...看起来更美观可读?
问题2: go proc.StartProcess() 这个里面的 proc 无论是值还是指针都行,只要func (externalProcess *ExternalProcess) StartProcess() {}接收参数是指针就行,那么到底是用指针好还是值好?是否需要改变对象属性用指针更好?
问题3:这里我用了go proc.StartProcess(), go externalProcess.checkProcess(stdoutPipe)实际上是因为err = cmd.Wait()会阻塞,而我这里需要启动的进程是一个后台进程不得已而为之,请问这里是否有什么开销?或者需要关闭一些什么资源?
go新手希望大家多提点:)
#1