>백엔드 개발 >Golang >Go 언어로 데몬 프로세스를 개발하는 방법은 무엇입니까?

Go 언어로 데몬 프로세스를 개발하는 방법은 무엇입니까?

王林
王林원래의
2023-06-11 09:55:531672검색

Go 언어는 내장 동시성 지원, 경량 스레드, 가비지 수집 메커니즘 등과 같은 데몬 프로세스 개발에 좋은 기능을 갖춘 빠르고 효율적인 프로그래밍 언어입니다. 데몬은 백그라운드에서 실행될 수 있는 프로그램으로, 일반적으로 네트워크 연결 요청과 같은 외부 이벤트를 지속적으로 수신하고 그에 따라 발생하는 이벤트를 처리하면서 오랜 시간 동안 실행되어야 합니다. 이번 글에서는 Go언어로 데몬 프로세스를 개발하는 방법을 소개하겠습니다.

1. 데몬 프로세스의 기본 요구 사항

Linux 및 Unix 운영 체제에서 데몬 프로세스는 다음과 같은 몇 가지 기본 요구 사항을 충족해야 합니다.

  1. 이 상위 프로세스는 init 프로세스인 것이 바람직합니다. 시스템이 다시 시작됩니다. 백 데몬은 계속 실행될 수 있습니다.
  2. 데몬은 시작될 때 자신을 백그라운드로 두고 제어 터미널을 해제해야 합니다.
  3. 데몬은 시스템이 종료되거나 종료될 때 자체적으로 적절하게 정리하기 위해 SIGTERM 및 SIGINT와 같은 신호를 처리할 수 있어야 합니다.

2. 데몬 프로세스 구현 단계

Go 언어로 데몬 프로세스를 개발하려면 다음 단계를 완료해야 합니다.

  1. 하위 프로세스를 만들고 상위 프로세스를 종료합니다.
  2. setsid() 함수를 호출하여 새 프로세스를 만듭니다. 세션 그룹 및 현재 프로세스를 세션 그룹의 리더이자 새 프로세스 그룹의 유일한 구성원으로 만듭니다.
  3. 파일 설명자 0, 1, 2(표준 입력, 표준 출력, 표준 오류 출력)를 닫습니다. 파일 시스템의 루트 디렉터리(/), 해당 파일 설명자를 연 다음 이를 프로세스의 작업 디렉터리 및 루트 파일 시스템으로 사용합니다.
  4. 구성 파일, 환경 변수 등을 포함하여 프로그램 시작 시 필요한 리소스를 로드합니다. ;
  5. 프로그램 리소스를 올바르게 정리하려면 SIGTERM 및 SIGINT 신호를 처리하세요.
  6. 아래에서는 이러한 단계의 구체적인 구현을 하나씩 소개하겠습니다.

3. 구현 세부 사항

하위 프로세스를 생성하고 상위 프로세스를 종료합니다
  1. Go 언어에서 하위 프로세스를 생성하고 상위 프로세스를 종료하는 코드 조각은 다음과 같습니다.
func startDaemon() {
    cmd := exec.Command(os.Args[0])
    cmd.Start()
    os.Exit(0)
}

이 코드는 새 프로세스를 시작합니다. 현재 하나의 프로세스를 처리하고 종료하여 새 프로세스를 데몬의 하위 프로세스로 만듭니다.

새 대화 그룹 만들기
  1. Go 언어로 새 대화 그룹을 만드는 코드는 다음과 같습니다.
func startDaemon() {
    syscall.Umask(0)
    if syscall.Getppid() == 1 {
        return
    }
    cmd := exec.Command(os.Args[0])
    cmd.Start()
    os.Exit(0)
    ...
    sysret, syserr := syscall.Setsid()
    if syserr != nil || sysret < 0 {
        fmt.Fprintf(os.Stderr, "Error: syscall.Setsid errno:%d %v
", syserr, syserr)
        os.Exit(1)
    }
}

이 코드는 먼저 파일 권한 마스크를 0으로 설정한 다음 현재 프로세스가 이미 대화 그룹 선행 프로세스(즉, 상위 프로세스가 init 프로세스인지 여부)입니다. 그렇다면 새 대화 그룹을 만들 필요가 없습니다. 그렇지 않으면 위에서 언급한 setid() 함수를 호출하여 새 세션 그룹을 만들고 현재 프로세스를 세션 그룹의 리더로 만듭니다.

파일 설명자 닫기
  1. Go 언어에서 파일 설명자를 닫는 코드 조각은 다음과 같습니다.
func startDaemon() {
    syscall.Umask(0)
    if syscall.Getppid() == 1 {
        return
    }
    cmd := exec.Command(os.Args[0])
    cmd.Start()
    os.Exit(0)
    ...
    syscall.Close(0)    // close stdin
    syscall.Close(1)    // close stdout
    syscall.Close(2)    // close stderr
}

이 코드는 syscall 패키지의 Close() 함수를 사용하여 파일 설명자 0, 1, 그리고 2.

쓰기 가능한 디렉터리 생성
  1. Go 언어로 쓰기 가능한 디렉터리를 생성하는 코드 조각은 다음과 같습니다.
func startDaemon() {
    syscall.Umask(0)
    if syscall.Getppid() == 1 {
        return
    }
    cmd := exec.Command(os.Args[0])
    cmd.Start()
    os.Exit(0)
    ...
    os.Chdir("/")
    dir, _ := ioutil.TempDir("", "")
    fd, _ := os.Open(dir)
    syscall.Dup2(int(fd.Fd()), 0)
    syscall.Dup2(int(fd.Fd()), 1)
    syscall.Dup2(int(fd.Fd()), 2)
}

이 코드는 먼저 프로세스의 현재 작업 디렉터리를 루트 디렉터리(/)로 변경한 다음 다음을 사용합니다. ioutil 패키지의 TempDir() 함수는 /tmp 디렉토리 아래에 새 디렉토리를 생성합니다. 다음으로, os.Open() 함수를 사용하여 디렉터리를 열고 syscall 패키지의 Dup2() 함수를 사용하여 해당 파일 설명자를 표준 입력, 표준 출력 및 표준 오류에 대한 파일 설명자로 복사합니다.

필요한 리소스 로드
  1. 필요한 리소스를 로드하는 코드 조각은 프로그램의 입력 기능에서 작성할 수 있습니다.

Processing SIGTERM 및 SIGINT 신호
  1. Go 언어에서 SIGTERM 및 SIGINT 신호를 처리하는 코드는 다음과 같습니다.
func main() {
    ...
    c := make(chan os.Signal, 1)
    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
    go func() {
        <-c
        // 执行清理操作
        os.Exit(0)
    }()
    ...
}

이 코드는 os 패키지의 Signal() 함수를 사용하여 SIGTERM 및 SIGINT 신호를 각각 처리를 위한 파이프라인입니다. 그런 다음 다른 고루틴에서 이 파이프를 수신함으로써 이러한 신호가 수신될 때 정리 작업을 수행할 수 있습니다.

4. 요약

이 글에서는 Go 언어로 데몬 프로세스를 개발하는 방법을 소개합니다. 데몬은 다양한 외부 이벤트를 처리해야 하는 장기 실행 프로그램으로, 상위 프로세스 보유, 시작 시 자신을 백그라운드에 배치하는 등 몇 가지 기본 요구 사항을 충족해야 합니다. Go 언어에서 이러한 요구 사항을 구현하는 방법에는 하위 프로세스 생성 및 상위 프로세스 종료, 새 세션 그룹 생성, 파일 설명자 닫기, 쓰기 가능한 디렉터리 생성, 필수 리소스 로드, SIGTERM 및 SIGINT 신호 처리가 포함됩니다. 이러한 방법을 익히면 Go 언어로 데몬 프로세스를 자유롭게 개발할 수 있습니다.

위 내용은 Go 언어로 데몬 프로세스를 개발하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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