Programming/GO
[GO] Golang에서 Linux 명령어 실행 및 관리하기
기록하는 백앤드개발자
2025. 2. 17. 22:16
반응형
ㅁ 들어가며
이 글에서는 Golang을 사용하여 Linux 명령어를 실행하고, 실행된 프로세스를 sync.Map
으로 관리한 후 종료하는 방법에 대해 정리하였다.
ㅁ 필요한 패키지 import
package main
import (
"fmt"
"os/exec"
"sync"
"syscall"
)
ㅇ 먼저 필요한 패키지들을 import 한다.
ㅁ 명령어 실행 및 관리 함수 작성
var processMap sync.Map
func runCommand(name string, args ...string) (*exec.Cmd, error) {
cmd := exec.Command(name, args...)
err := cmd.Start()
if err != nil {
return nil, err
}
processMap.Store(cmd.Process.Pid, cmd)
return cmd, nil
}
ㅇ Linux 명령어를 실행하고 sync.Map에 저장하는 함수를 작성.
ㅁ 프로세스 종료 함수 작성
func killProcess(pid int) error {
value, ok := processMap.Load(pid)
if !ok {
return fmt.Errorf("process with PID %d not found", pid)
}
cmd := value.(*exec.Cmd)
err := cmd.Process.Signal(syscall.SIGTERM)
if err != nil {
return err
}
processMap.Delete(pid)
return nil
}
ㅇ sync.Map에 저장된 프로세스를 종료하는 함수를 작성.
ㅁ 메인 함수 작성
func main() {
// 'sleep' 명령어 실행
cmd, err := runCommand("sleep", "100")
if err != nil {
fmt.Printf("Error starting command: %v\n", err)
return
}
fmt.Printf("Started process with PID: %d\n", cmd.Process.Pid)
// 프로세스 종료
err = killProcess(cmd.Process.Pid)
if err != nil {
fmt.Printf("Error killing process: %v\n", err)
return
}
fmt.Println("Process terminated successfully")
}
ㅇ 이제 위에서 작성한 함수들을 사용하여 메인 함수를 작성.
ㅁ 실행 결과
Started process with PID: 46410
Process terminated successfully
ㅇ 이 프로그램을 실행한 결과이다.
ㅁ 마무리
이 예제에서는 Golang을 사용하여 Linux 명령어를 실행하고, sync.Map
을 사용하여 실행된 프로세스를 관리하는 방법을 살펴보았다. sync.Map
은 동시성 안전한 맵 구현을 제공하여 여러 고루틴에서 안전하게 프로세스 정보를 관리할 수 있게 해준다. 이 방식을 사용하면 여러 Linux 명령어를 동시에 실행하고 관리할 수 있으며, 필요에 따라 개별 프로세스를 종료할 수 있다.
ㅁ 함께 보면 좋은 사이트
ㅇ How to execute Linux commands in Golang
ㅇ Executing Long Running Commands
ㅇ 동시적이고 안전한 매핑을 구현하려면 golang의 sync.Map 함수를 사용하세요.
반응형