GNOME端末で実行する場合:
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