나는 mkfifo
트릭을 만족스럽게 작동 시키지 않았다 . 그것은 stderr을 캡처하지 않는 것처럼 보였고 리디렉션을 시도하면 Upstart가 오류없이 보석을 만들었습니다.
또한 logger
프로세스를의 자식으로 중단 시키는 부작용으로 init
인해 로거의 "소유자"에 대한 정보를 잃어 버렸으며, 이미 알고있는 사람이 없으면 mkfifo
죽을 수있는 매달려있는 프로세스라고 가정 할 수 있습니다.
대신에 나는 다음과 같은 해결책으로 끝났고 이러한 모든 문제를 해결했습니다. 그것은 원인 logger
루트 프로세스와 서비스를 유지하면서, 자식 프로세스가 될 수 있습니다. 불행히도 exec'ing이 필요 bash
하지만 더러워 보입니다 .
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
이것은 stdout 및 stderr을 명령으로 리디렉션하는 트릭을 사용합니다. bash
명령 내부에서 서비스를 실행하기 때문에 셸을 교체하고 bash를 다음과 같이 마술처럼 서비스의 하위 프로세스로 만드는 부작용이 있습니다 ps aufxw
.
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
어떤 이유로 위의 명령은에 싸야합니다 bash -c
. Upstart는 Bash를 통해 스크립트를 실행하는 척하지만 실제로는 그렇지 않기 때문이라고 생각합니다. 누군가가 여분의 bash 쉘을 피하는 방법을 제안 할 수 있다면 멋질 것입니다.