관리 메뉴

피터의 개발이야기

[GO] Golang에서 Linux 명령어 실행 및 관리하기 본문

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 함수를 사용하세요.

 

 

반응형
Comments