修改进程守护
This commit is contained in:
82
main.go
82
main.go
@@ -1,9 +1,16 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
"os/signal"
|
||||
"sync"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -34,4 +41,79 @@ func main() {
|
||||
if *stop != "" {
|
||||
fmt.Println("停止:", *stop)
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
cmd := exec.CommandContext(ctx, "go", "run", "src\\index.go")
|
||||
cmd.Dir = "D:\\project\\Go\\src\\go-fingerprint\\"
|
||||
// if err := cmd.Start(); err != nil {
|
||||
// fmt.Println("运行报错")
|
||||
// }
|
||||
// 创建管道捕获标准输出
|
||||
stdout, err := cmd.StdoutPipe()
|
||||
if err != nil {
|
||||
fmt.Errorf("创建标准输出管道失败: %v", err)
|
||||
}
|
||||
|
||||
// 创建管道捕获标准错误
|
||||
stderr, err := cmd.StderrPipe()
|
||||
if err != nil {
|
||||
fmt.Errorf("创建标准错误管道失败: %v", err)
|
||||
}
|
||||
|
||||
// 启动命令
|
||||
if err := cmd.Start(); err != nil {
|
||||
fmt.Errorf("启动命令失败: %v", err)
|
||||
}
|
||||
// 使用 WaitGroup 等待输出处理完成
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(2)
|
||||
|
||||
// 处理标准输出
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
scanAndCapture(stdout, "STDOUT")
|
||||
}()
|
||||
|
||||
// 处理标准错误
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
scanAndCapture(stderr, "STDERR")
|
||||
}()
|
||||
// 等待命令执行完成
|
||||
if err := cmd.Wait(); err != nil {
|
||||
fmt.Errorf("命令执行失败: %v", err)
|
||||
}
|
||||
setupSignalHandler()
|
||||
// 等待所有输出处理完成
|
||||
wg.Wait()
|
||||
cmd.Wait()
|
||||
}
|
||||
|
||||
// 扫描并捕获输出
|
||||
func scanAndCapture(reader io.Reader, prefix string) {
|
||||
scanner := bufio.NewScanner(reader)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
var outputLines []string
|
||||
// 捕获输出行(最多保留1000行)
|
||||
outputLines = append(outputLines, line)
|
||||
if len(outputLines) > 1000 {
|
||||
outputLines = outputLines[1:]
|
||||
}
|
||||
|
||||
// 实时显示
|
||||
fmt.Printf("[%s] %s\n", prefix, line)
|
||||
}
|
||||
}
|
||||
|
||||
func setupSignalHandler() {
|
||||
sigChan := make(chan os.Signal, 1)
|
||||
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
|
||||
|
||||
go func() {
|
||||
<-sigChan
|
||||
fmt.Println("\n接收到中断信号,停止子进程...")
|
||||
os.Exit(0)
|
||||
}()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user