Upstart로 데몬의 결과 기록


34

내 Ubuntu 서버에서 upstart로 관리되는 사용자 정의 데몬이 있습니다. 데몬의 출력을 캡처 (로그)해야한다는 점을 제외하고는 완벽하게 작동합니다. 공식 연 페이지는 내가 사용할 수 있다고 console logged이 작업을 수행하는 것이 아니라 어떤 파일이에 로그인합니까?

또한 더 이상 유효한 스탠자console logged아님을 읽었습니다 . 현재 0.3.9 (Hardy)를 사용하고 있지만 몇 개월 안에 0.6.x (Lucid)로 업그레이드합니다. 경우 console logged실제로 이후 버전에서는 작동하지 않습니다, 내가 대신 무엇을 사용합니까?


1
사용자 정의 데몬을 업데이트하여 출력을 syslog 또는 데몬의 구성 파일에 지정된 로그 파일로 보낼 수 있습니까?
Zoredache

답변:


35

이 스 니펫은 서비스 출력을 로거로 파이프하는 동시에 서비스 프로세스를 실행하여 셸 프로세스를 대체하여 upstart가 혼동되지 않도록합니다. 또한 로거 프로세스가 초기화되는 것을 보장하므로 서비스의 하위 요소가 아니며 일시적으로 fifo를 작성해야하더라도 파일 시스템에 cruft가 남아 있지 않도록합니다.

script
  mkfifo /tmp/myservice-log-fifo
  ( logger -t myservice </tmp/myservice-log-fifo & )
  exec >/tmp/myservice-log-fifo
  rm /tmp/myservice-log-fifo
  exec myservice 2>/dev/null
end script

작동 방식은 다음과 같습니다.

  1. mkfifo /tmp/myservice-log-fifo단순히 fifo 특수 파일 (일명 명명 된 파이프)을 만듭니다. man 7 fifo자세한 정보를 입력 하십시오.
  2. ( logger ... </tmp/myservice-log-fifo & ) 백그라운드에서 fifo에서 로거 읽기를 시작합니다. Parens는 현재 쉘 프로세스의 하위로 남아 있지 않고 로거 프로세스가 초기화되도록 다시 설정됩니다.
  3. exec >/tmp/myservice-log-fifo현재 쉘의 표준 출력을 fifo로 리디렉션합니다. 이제 해당 fifo에 대한 열린 파일 설명자가 있으며 실제로 파일 시스템 항목이 더 이상 필요하지 않습니다.
  4. rm /tmp/myservice-log-fifo 제거하겠습니다.
  5. exec myservice 2>/dev/null단순히 일반적인 방법으로 서비스를 실행합니다. Stdout은 이미 fifo로 가고 있으며 새 프로그램이 실행될 때 변경되지 않습니다.

업데이트 : set -e Upstart는 기본적 으로이 옵션으로 스크립트를 실행하므로 필요하지 않습니다 ( http://upstart.ubuntu.com/cookbook/#develop-scripts-using-bin-sh 참조 )


훌륭한 답변이며 fifo 파일을 어디에도 두지 마십시오.
Ash Berlin-Taylor

무엇입니까 set -e?
피터 Mounce

1
set -e어떤 명령이 실패 할 경우 즉시 종료 스크립트됩니다. 이 줄이 없으면 스크립트는 후속 명령을 쓸모 없게 (그리고 위험 할 수 있음) 계속 실행합니다.
Keith Rarick

1
stdout뿐만 아니라 stderr도 기록하려면 행 exec 2>&1위에 행을 추가 하고 마지막 행에서 rm제거하십시오 2>/dev/null.
itsadok


11

console output 스탠자 를 사용하고 스크립트 출력을 logger셸 명령 인터페이스 (syslog (3) 시스템 로그 모듈에 파이프)로 파이프 하면 작동합니다.

예를 들어

console output
exec /my/script | logger

에 로그인합니다 /var/log/messages

예를 들어

console output
exec /my/script | logger -t my-script

/var/log/messages각 메시지에 로그인 하고 태그를 지정합니다.my-script

logger --help 로거 사용 옵션.

(저는 Centos 5.x 기반의 Amazon Linux AMI; YMMV에 있습니다)


4
이것은 좋은 해결책이 아니라는 것이 밝혀졌습니다. upstart는 logger실제로 관리하려는 프로세스가 아닌의 PID에 래치합니다 .
피터 Mounce

10

나는 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 쉘을 피하는 방법을 제안 할 수 있다면 멋질 것입니다.


1
예! 나는 이것을 발견해서 매우 기쁘다. mkfifo 변형보다 나아 보였고 필자의 경우 exec bash -l << EOF손실이 없어야했습니다.
thom_nic

6

이것은 못 생겼지 만 지금까지 내가 찾은 최고

exec / path / to / server >> /tmp/upstart.log 2> & 1


2
응용 프로그램이 파일에 직접 로깅하기 때문에 로그 회전과 관련하여 해결책이 좋지 않습니다. syslog를 통해 로깅하면 관련 문제가 발생하지 않습니다.
Mark Stosberg

3

출력을 syslog로 리디렉션 할 수도 있습니다. 예 :

exec $SERVER 2>&1 | logger -t myservice -p local0.info

그러나 파이프 라인으로 인해 upstart가 로깅 프로세스의 PID와 디먼의 PID를 혼동 할 수 있습니다.


PID를 혼동하는 데몬은 실제로 쓸모없는 데몬입니다. 프로세스를 감시하고 다시 생성해야하기 때문입니다. 올바른 PID를 확인하는 방법에 대한 아이디어가 있습니까?
Johann Philipp Strathausen

나는 당신이 expect fork또는 expect daemon스탠자를 원할 것이라고 생각합니다 (그러나 시도하지는 않았습니다) . 또는 cat그렇지 않으면 pid 파일을 로그 메시지에 넣을 수 있습니다.
Peter Mounce

1

다른 대안은 다음과 같은 티를 사용하는 것입니다.

exec $SERVER 2>&1 | tee /dev/stderr | logger -t myservice

시작 파일과 syslog 출력을 모두 얻는 방법

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.