프로세스가 자체적으로 데몬화할 수 없는 경우 init 스크립트 내에서 백그라운드 작업을 생성하는 것이 좋은 방법입니까?

프로세스가 자체적으로 데몬화할 수 없는 경우 init 스크립트 내에서 백그라운드 작업을 생성하는 것이 좋은 방법입니까?

저는 *nix를 처음 접했고 100% 실행되어야 하는 여러 프로세스를 삭제해야 한다는 필요성을 느꼈습니다. 을 사용하여 배경으로 &.

이를 수행하기 위해 init.d 스크립트에서 다음 줄을 사용합니다(사용자로 실행 user:

su -c 'process arg1 arg2 -w - | process2 arg1 -r - &' user

(여기서 -w는 STDOUT, STDIN에 쓰고 -r은 읽습니다)

특히 프로세스가 외부 영향으로부터 잘 보호되지 않기 때문에 이것이 일반적으로 허용되지 않는다는 것을 알고 있습니다.

"서비스"에 대한 백그라운드 작업을 생성하는 것이 허용됩니까?

대신 프로세스 간 통신을 처리하기 위해 FIFO/명명된 파이프를 사용해야 합니까?

그렇다면 두 프로세스를 모두 백그라운드 작업으로 생성해야 합니까? 이게 안정적인가요?

구체적인 내용은 다음을 참조하세요.이 메일링 리스트 스레드.

감사해요,

매트

답변1

특히 프로세스가 외부 영향으로부터 잘 보호되지 않기 때문에 이것이 일반적으로 허용되지 않는다는 것을 알고 있습니다.

"서비스"에 대한 백그라운드 작업을 생성하는 것이 허용됩니까?

다른 방법이 없다면(즉, 서비스가 자체적으로 포크되지 않는 경우) 아마도 그렇습니다. 데비안에는 이러한 경우에 대한 매개변수가 start-stop-daemon있습니다 :--background

   -b, --background
          Typically used with programs that don't  detach  on  their  own.
          This option will force start-stop-daemon to fork before starting
          the  process,  and  force  it  into  the  background.   WARNING:
          start-stop-daemon  cannot  check  the exit status if the process
          fails to execute for any reason. This is a last resort,  and  is
          only  meant  for  programs  that either make no sense forking on
          their own, or where it's not feasible to add the code  for  them
          to do this themselves.

답변2

첫 번째 질문에 대한 답변은 이미 완료되었으므로 마지막 두 질문에 집중하겠습니다.

며칠 전에 나는 비슷한 문제로 어려움을 겪었습니다. /etc/init.d스크립트에서 파이프를 통해 일부 프로세스를 시작해야 했습니다. 이를 해결하기 위해 RHEL6( daemon및 )과 Debian( ) killproc을 살펴보았습니다 . 내가 배운 것은 둘 다 파이프를 (아주 잘) 다루지 못했다는 것입니다. 어떻게든 시작하는 것이 가능했지만, 이를 막는 데는 큰 문제가 있었습니다. 그래서 나는 작은 도구를 썼다/etc/init.d/functionsstart-stop-daemonpipexec. 이 프로그램은 프로그램 파이프를 시작하지만 하나의 프로그램처럼 동작합니다. 예: a가 SIGTERM전송 되면 pipexec모든 자식을 죽이고 그 후에는 자신도 죽습니다. 또한 pid 파일 처리도 지원됩니다. 이를 통해 RHEL6 daemonkillproc.

대신 프로세스 간 통신을 처리하기 위해 FIFO/명명된 파이프를 사용해야 합니까? 그렇다면 두 프로세스를 모두 백그라운드 작업으로 생성해야 합니까? 이게 안정적인가요?

나도 이것에 대해 생각해 보았습니다. 그러나 나에게는 이것이 너무 복잡하고 안정성과 신뢰성에 관한 FIFO에 관해서는 정말 좋은 경험이 없었습니다. (어쩌면 이것이 내 문제일지도 모르지만 나는 거의 사용하지 않습니다 ;-) )

RHEL6과 통합했는데 pipexec문제가 없습니다. 그냥 실행됩니다.

감사합니다 - 안드레아스

관련 정보