Lightdm 服务 - `status` 命令的结果相互矛盾

Rad*_*anu 5 command-line ubuntu services lightdm

当我在 gnome 终端中运行时:

service lightdm status
Run Code Online (Sandbox Code Playgroud)

一切看起来都不错,并且符合预期:

lightdm start/running, process 1221
Run Code Online (Sandbox Code Playgroud)

但是当我运行时:

service --status-all 2>&1 | grep lightdm
Run Code Online (Sandbox Code Playgroud)

输出是:

 [ ? ]  lightdm
Run Code Online (Sandbox Code Playgroud)

由于?,AFAIK 意味着 lightdm 服务没有status命令。

现在我想知道这些矛盾的结果是从哪里来的?这是一个错误吗?

Gra*_*eme 3

这似乎只是service脚本中的一个错误。--status-all该行为与单个进程的行为不同。对于单个进程,service只需使用exec交给 init 脚本本身(在本例中/etc/init.d/lightdm)。这是相关的片段:

if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
   exec env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" ${ACTION} ${OPTIONS}
Run Code Online (Sandbox Code Playgroud)

因为--status-all它尝试解析脚本本身的输出init.d。下载sysvinit-toolsUbuntu 13.10 的软件包并与我的版本(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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)