>백엔드 개발 >Golang >Go Beyond os.FindProcess에서 프로세스 존재를 안정적으로 확인하는 방법은 무엇입니까?

Go Beyond os.FindProcess에서 프로세스 존재를 안정적으로 확인하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-07 12:32:03992검색

How to Reliably Check for Process Existence in Go Beyond os.FindProcess?

os.FindProcess에만 의존하지 않고 Go에서 프로세스의 존재를 확인하는 방법

Go에서 프로세스를 다룰 때 자연스러운 특정 PID를 가진 프로세스가 존재하는지 확인하기 위해 os.FindProcess를 활용하는 것이 좋습니다. 그러나 이 방법에만 의존하면 부정확한 결론을 내릴 수 있습니다.

os.FindProcess의 한계

os.FindProcess는 운영 체제에서 프로세스에 대한 정보를 효과적으로 쿼리합니다. . 지정된 PID를 가진 프로세스가 존재하면 오류가 아닌 결과를 반환합니다. 그러나 프로세스가 이미 종료된 경우 운영 체제가 아직 프로세스를 회수하지 않은 경우(즉, 시스템의 프로세스 테이블에서 해당 항목을 제거한 경우) os.FindProcess는 여전히 성공을 보고할 수 있습니다. 이는 프로세스가 실제로 종료되었지만 여전히 실행 중임을 암시하는 오탐지로 이어질 수 있습니다.

대체 솔루션 탐색: 신호 보내기

프로세스가 존재하는 경우 대상 프로세스에 0(영) 신호를 보내는 전통적인 Unix 접근 방식을 사용할 수 있습니다. 이 기술은 다음과 같은 이유로 작동합니다.

  • 프로세스가 활성 상태인 경우 0 신호를 보내면 부작용 없이 성공합니다.
  • 프로세스가 종료된 경우 0 신호를 보냅니다. "no such process"라는 오류 메시지와 함께 실패합니다.

Implementing the Signal-Based Solution in Go

다음은 이를 사용하는 Go 함수의 예입니다. 접근 방식:

package main

import (
    "fmt"
    "log"
    "os"
    "os/signal"
    "strconv"
)

// checkProcessExistence sends a signal of 0 to a process to determine its existence.
func checkProcessExistence(pid int) bool {
    process, err := os.FindProcess(pid)
    if err != nil {
        log.Fatal(err)
    }

    err = process.Signal(signal.Signal(0))
    if err != nil {
        return false
    }

    return true
}

func main() {
    for _, p := range os.Args[1:] {
        pid, err := strconv.ParseInt(p, 10, 64)
        if err != nil {
            log.Fatal(err)
        }

        if checkProcessExistence(int(pid)) {
            fmt.Printf("Process with PID %d is running\n", pid)
        } else {
            fmt.Printf("Process with PID %d is not running\n", pid)
        }
    }
}

사용 예

프로세스 A의 PID가 있고 프로세스 A가 아직 실행 중인지 확인하고 싶다고 가정해 보겠습니다.

$ go run main.go 12345
Process with PID 12345 is running

이 출력은 프로세스 12345가 실제로 살아 있음을 확인시켜 줍니다.

위 내용은 Go Beyond os.FindProcess에서 프로세스 존재를 안정적으로 확인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.