Upstart 스크립트를 어떻게 디버깅합니까?


67

어떤 이유로 apport upgrade 동안 오류가 발생 합니다. 원인은 다음과 같습니다.

% sudo service apport start
start: Job failed to start

sysvinit에서 다음을 실행하여 이러한 종류의 문제를 디버깅 할 수 있습니다.

sudo sh -x /etc/init.d/whatever start

그러나 그것은 Upstart로 매핑되지 않는 것 같습니다. 다음에 무엇을 시도해야합니까?

그것은 밝혀 해결이 (가) 계속 설치를하게됩니다. 그러나 나는 여전히 스크립트를 추적하는 방법에 대한 일반적인 질문에 관심이 있습니다.


1
더 철저한 답변을 작성 중이지만 해결 방법에 대한 링크 덕분에 오늘 natty를 업데이트하는 것과 동일한 일이 발생했습니다!
마크 러셀

하하. 그리고 그들은 12 분 전에 수정을 발표했다. 베타 버전을 사용하지 않습니까? (실제로!)
Mark Russell

+ 무하마드는 아래에 정답을 올렸습니다.
Travis Reeder

에서 유용한 디버깅 정보를 찾았습니다 /var/log/syslog.
Matt

답변:


29

다음 정보는 모두 Upstart Cookbook에서 제공 합니다. 섹션 18은 디버깅을 다룹니다. http://upstart.ubuntu.com/cookbook/#debugging

Upstart 작업의 "script"스탠자를 추적하는이 특정한 경우 "script"라는 단어 바로 아래에 다음 행을 추가해야합니다.

exec 2>>/dev/.initramfs/myjob.log
set -x

이상한 위치의 이유는 루트 파일 시스템이로드되기 전에 초기 부팅에서 /dev/.initramfs/를 사용할 수 있고 부팅 후에도 계속 사용할 수 있기 때문입니다. 나는 apport로 추측하고 있지만 아마도 그 경로를 사용할 필요 는 없습니다 . 여전히 옵션을 아는 것이 좋습니다.

또한 모든 스크립트가 실행 set -e되므로 실패한 명령은 스크립트를 완전히 종료합니다. 스크립트를 루트로 실행할 때 매우주의해야하므로 이치에 맞습니다.

Upstart 작업을하는 사람은 위에 링크 된 Upstart Cookbook을 참조하십시오.


감사합니다. 버그가 해결되지 않은 경우 스크립트를 수정하여 set -x제안한 대로 설정 했을 수 있습니다. 나는 그것을 할 수있는 더 깨끗한 방법이 있는지 궁금합니다.
poolie

그래, 내가 아는 것은 아닙니다 (그리고 요리 책에 없다면, 아마도 없을 것입니다). 그 아이디어 외에도 언급 된 대부분의 디버깅 기술은 Upstart 및 Upstart 이벤트 자체의 문제 해결에 관한 것입니다. :)
Mark Russell

그럼에도 불구하고이 방법은 경우에 실패 setuid하고 setgid작업에 사용됩니다.
0xC0000022L

/dev/.initramfs가 항상있는 것은 아닙니다. 나는이 경로가없는 기계를 보았습니다.
Sarge Borsch

110

Upstart는에서 동일한 이름으로 서비스 실행을 로그 파일에 기록합니다 /var/log/upstart/your-service-name.log. 도움이 될 것입니다.


2
맞습니다. 여기에는 작업의 stderr가 포함 된 것처럼 보이므로 전원을 켜면 set -x아마도 거기에 나타납니다.
poolie

1
내 /etc/init.d/Xservice 스크립트에 에코 기반 로그 문을 넣었지만이 위치에는 표시되지 않습니다! 운영체제 : Ubuntu 14.04 Trusty
Champ

왜 syslog하지 않는가? rstartlog 자체와 같은 일반적인 기능으로 upstart 및 모든 구성 요소가 syslog를 사용할 수없는 경우 또는 syslog에 최대한 빨리 전송되는 임시 위치에 쓰는 데 사용할 수 있습니다. 이것을 찾으려면 반나절 걸렸습니다. 이 비고 TIA를 전달하십시오.
Papou

4
이것은 적어도 15.10 이후 16.04에서 더 이상 사실이 아닌 것 같습니다. 해당 디렉토리의 마지막 파일은 15.10 릴리스 직전 날짜입니다.
FGM

1
@FGM 16.04는 더 이상 upstart를 사용하지 않기 때문에 systemd를 사용합니다. 로그에 액세스journalctl
Jeremy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.