>  기사  >  백엔드 개발  >  Golang에서 장기 실행 프로세스를 실행하고 좀비가 되는 것을 방지하는 방법은 무엇입니까?

Golang에서 장기 실행 프로세스를 실행하고 좀비가 되는 것을 방지하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-27 21:16:01386검색

How to Execute Long-Running Processes in Golang and Prevent Them From Becoming Zombies?

Golang에서 명령을 실행하고 프로세스에서 분리

이 문제는 Golang에서 장기 실행 프로세스를 실행해야 할 때 발생합니다. 다음과 같은 특정 요구 사항:

  • 프로세스 stdout을 파일로 리디렉션
  • 프로세스 사용자 제어
  • 상위 프로그램이 종료된 후에도 프로세스가 계속 실행되도록 보장
  • 충돌 시 프로세스가 좀비가 되는 것을 방지
  • 실행 중인 프로세스의 PID 얻기

Cmd.Start() 및 Cmd.Wait()를 사용하여 시도한 솔루션 SIGTERM/SIGKILL을 프로그램에 보낼 때 기본 프로세스가 충돌하는 것을 방지하는 것을 제외하고 이러한 요구 사항 대부분을 충족합니다.

해결책

바퀴를 재발명하려고 시도하는 대신, 다음 라이브러리 중 하나를 활용해 보세요:

  • https://github.com/krallin/tini
  • https://busybox.net/
  • https: //software.clapper.org/daemonize/
  • https://wiki.gentoo.org/wiki/OpenRC
  • https://www.freedesktop.org/wiki/Software/systemd /

Go-reap 라이브러리

권장 솔루션은 https://github.com/hashicorp/go-reap 라이브러리를 사용하는 것입니다.

참고

  • 부모 프로세스에서 프로세스를 분리하는 것에 대한 가정이 올바르지 않습니다. Linux에서는 모든 프로세스에 상위 프로세스가 있으며 생성 후에는 변경할 수 없습니다.
  • "데몬으로 실행하고 싶습니다"라는 문구가 명확하지 않습니다. Linux의 데몬 프로세스에는 상위 PID가 있으며 상위-하위 규칙을 준수합니다.
  • SIGTERM/SIGKILL이 프로그램에 전송될 때 기본 프로세스가 충돌하는 문제는 go-reap 라이브러리로 재현할 수 없습니다. .

면책조항

제공되는 솔루션은 하위 프로세스가 좀비가 되는 것을 방지하는 문제를 해결하는 데 중점을 둡니다. 모든 요구 사항을 충족하는 완전한 솔루션을 위해서는 여러 접근 방식의 조합이 필요할 수 있습니다.

위 내용은 Golang에서 장기 실행 프로세스를 실행하고 좀비가 되는 것을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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