`Starting ... [ ok ]`를 표시하는 책임은 어떻게 됩니까?

`Starting ... [ ok ]`를 표시하는 책임은 어떻게 됩니까?

다음과 같은 서비스를 시작할 때:

root@foo [~]# service foobar stop
Stopping Foobar:                                       [  OK  ]

상태 표시기를 볼 수 있습니다. [ OK ]이는 에 표시되는 것과 다릅니다 /var/log/boot.log.

[  OK  ] Started LSB: disk temperature monitoring daemon.
...

또는 다음과 다른 경우도 있습니다.

* /proc is already mounted
* Caching service dependencies ...        [ ok ]

이 세 가지 예에서 데몬을 표시하고 시작하는 프로세스는 무엇입니까? 다르게 말하면, 어떤 라이브러리 를 사용하여 표시합니까 [ OK ]?[FAILED]

답변1

수동 호출로 service/etc/init.d 또는 /etc/rc.d에서 SysV 스타일 스크립트를 실행하면 모든 상태 출력이 달라집니다.전적으로 해당 스크립트에 있습니다.

적절하게 작성된 init.d 스크립트는 배포판에서 제공하는 셸 함수 라이브러리를 사용합니다. 예를 들어 Debian에서 대부분의 스크립트는 파일을 로드(소스) /lib/lsb/init-functions하고 다음과 같이 제공된 함수를 간단히 호출합니다.

케이스 "$1" in
  시작)
    log_daemon_msg"$DESC 시작 중" "$NAME"
    do_start
    대소문자 "$?" ~에
        0|1)log_end_msg0;;
        2) log_end_msg 1 ;;
    에삭
    ;;
  [...]
에삭

여기에표준 함수 목록LSB에 의해 정의됩니다. (배포판은 다음을 제공할 수 있습니다.추가의위의 예와 같이 표준을 넘어서는 기능을 수행합니다. 또한 OpenRC 또는 Arch Linux 등을 참고하세요.그렇지 않다LSB와 호환되며 완전히 다른 스타일을 사용합니다.)

실제로 일부 배포판에서는 이 상용구 코드를 중앙에서 제공하며 init.d 스크립트에 남은 것은 do_start. ( /lib/init/init-d-script예로 Gentoo의 OpenRC와 Debian을 참조하세요 ). 그러나 이는 "표준" LSB 기능이 아닙니다. LSB 호환을 시도하는 스크립트는 여전히 수동으로 수행해야 합니다.


메모:나는 '올바르게 작성'을 강조합니다. 실제로는 그럴 일이 없기 때문입니다.인간 감독 이외의 기능을 사용하기 위한 init.d 스크립트. 스크립트가 일반 echo(또는 cowsay해당 문제의 경우)을 통해 상태를 보고하려는 경우 항상 그렇게 할 수 있습니다. 이는 특히 일반 채널 외부에 배포되는 상용 소프트웨어의 문제입니다. 상태 출력절대꽤 괜찮아 보입니다(솔직히 전체 init.d 스크립트는 결코 제대로 동작하지 않습니다).


한편, SysV 스크립트가 호출되는 동안부팅 프로세스, 결과는 배포판에 훨씬 더 의존적입니다. 때로는 스크립트 자체에서 직접 출력을 볼 수도 있지만 "기본" 초기화 시스템이 시작하는 모든 서비스에 대해 자체 상태 출력을 제공하는 경우도 있습니다. (예:백그라운드에서 서비스를 시작할 때 Arch Linux의 이전 initscript.)

하지만 두 번째 예는 실제로~ 아니다SysV 스타일 init – systemd입니다(귀하의 예에서는 '레거시' init.d 스크립트를 시작하는 중입니다). Systemd는 서비스 구성(스크립트가 아님)을 사용하는 전체 서비스 관리자이므로모두부팅/종료 상태 출력은 systemd 자체에서 제공됩니다. 이는 init-ng, SMF 또는 Upstart를 포함한 대부분의 다른 "서비스 관리자"에도 적용됩니다.

답변2

이는 배포판 종속 초기화 스크립트에서 비롯됩니다. 프로그램 내용을 확인하세요 service. 이것은 아마도 기본 관리 스크립트(SysV는 현재 사용되지 않는 것으로 간주됨) 또는 바이너리(systemd가 갈 길)를 호출하는 일부 쉘 스크립트일 것입니다. 이것은 시스템화된 전문가 중 하나입니다. "의존적인" 답변을 얻지 못할 것입니다.

관련 정보