그놈 터미널에서 실행할 때:
service lightdm status
모든 것이 예상대로 괜찮아 보입니다.
lightdm start/running, process 1221
하지만 내가 실행할 때 :
service --status-all 2>&1 | grep lightdm
출력은 다음과 같습니다
[ ? ] lightdm
왜냐하면 AFAIK는 lightdm 서비스에 대한 명령이 ?
없음을 의미합니다 .status
이제 이러한 모순된 결과가 어디서 나오는지 알고 싶습니다. 이것은 버그입니까?
답변1
service
이것은 단지 스크립트의 버그 인 것 같습니다 . 이 동작은 --status-all
단일 프로세스의 동작과 다릅니다. 단일 프로세스의 경우 init 스크립트 자체를 service
사용하면 됩니다 (이 경우 ). 관련 스니펫은 다음과 같습니다.exec
/etc/init.d/lightdm
if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
exec env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" ${ACTION} ${OPTIONS}
--status-all
스크립트 자체의 출력을 구문 분석하려고 하기 때문입니다 init.d
. Ubuntu 13.10용 패키지를 다운로드 sysvinit-tools
하고 내 버전(Debian Jessie)과 비교하면 코드의 이 부분이 변경된 것을 볼 수 있습니다(아마 이 버그를 수정하기 위해). 이(Ubuntu 13.10) 스니펫을 비교해 보세요. (변경된 줄을 다음과 같이 표시했습니다 #<<<
.
if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then
cd ${SERVICEDIR}
for SERVICE in * ; do
case "${SERVICE}" in
functions | halt | killall | single| linuxconf| kudzu)
;;
*)
if ! is_ignored_file "${SERVICE}" \
&& [ -x "${SERVICEDIR}/${SERVICE}" ]; then
if ! grep -qs "\(^\|\W\)status)" "$SERVICE"; then #<<<
#printf " %s %-60s %s\n" "[?]" "$SERVICE:" "unknown" 1>&2
echo " [ ? ] $SERVICE" 1>&2
continue
그리고
if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then
cd ${SERVICEDIR}
for SERVICE in * ; do
case "${SERVICE}" in
functions | halt | killall | single| linuxconf| kudzu)
;;
*)
if ! is_ignored_file "${SERVICE}" \
&& [ -x "${SERVICEDIR}/${SERVICE}" ]; then
out=$(env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1) #<<<
retval=$? #<<<
if echo "$out" | egrep -iq "usage:"; then #<<<
#printf " %s %-60s %s\n" "[?]" "$SERVICE:" "unknown" 1>&2
echo " [ ? ] $SERVICE" 1>&2
continue