728x90
반응형

신규 서버를 만들면서 두가지 기능이 필요했다.

 

첫째는 명령어를 동시에 실행해서 속도를 높이는 것과 데이터가 있는 디렉토리를 제거하는 것이었다.

  1. 명령어 동시 실행하기

Golang에서 WaitGroup은 모든 goroutine이 종료될 때까지 기다린다.

 

채널을 통해서 커맨드를 전달하고 goroutine에서 이 커맨드를 실행하고 종료한다.

 

명령어를 단순 반복문으로 수행하면 오래 걸리지만 이를 활용하면 빠르게 수행할 수 있었다.

tasks := make(chan *exec.Cmd, 64)
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
    wg.Add(1)
    go func(w *sync.WaitGroup) {
        defer w.Done()
        for cmd := range tasks {
            out, err := cmd.Output()
            if err != nil {
                fmt.Println("can't get stdout: %v", err)
            }
            fmt.Println(string(out))
        }
    }(&wg)
}
for i := 0; i < 10; i++ {
    tasks <- exec.Command("echo", strconv.Itoa(i))
}
close(tasks)
wg.Wait()
  1. 디렉토리 제거(rm -rf)

간단하게 exec.Command를 활용하면 되겠지만 최대한 Golang 함수로 해결해보려고 했다.

 

그래서 아래와 같이 디렉토리 밑의 데이터를 지우고 마지막으로 디렉토리를 삭제하도록 했다.

func removeContents(dir string) error {
    d, err := os.Open(dir)
    if err != nil {
        return err
    }
    defer d.Close()
    names, err := d.Readdirnames(-1)
    if err != nil {
        return err
    }
    for _, name := range names {
        err = os.RemoveAll(filepath.Join(dir, name))
        if err != nil {
            return err
        }
    }
    syscall.Rmdir(dir)
    return nil
}

 

참고 문헌

  1. https://stackoverflow.com/questions/40247726/go-execute-a-bash-command-n-times-using-goroutines-and-store-print-its-resul

  2. https://stackoverflow.com/questions/33450980/how-to-remove-all-contents-of-a-directory-using-golang

반응형

+ Recent posts