当我在 gnome 终端中运行时:
service lightdm status
一切看起来都正常并且符合预期:
lightdm start/running, process 1221
但是当我跑步时:
service --status-all 2>&1 | grep lightdm
输出是:
[ ? ] lightdm
由于?
,AFAIK 意味着 lightdm 服务没有status
命令。
现在我想了解这些矛盾的结果从何而来?这是一个错误吗?
答案1
这似乎只是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}
因为--status-all
它尝试解析脚本本身的输出init.d
。下载sysvinit-tools
Ubuntu 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
和
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