如何读取“ service --status-all”结果


98

我需要确定当前正在运行的服务,但无法弄清运行结果service --status-all,我的意思是什么-+是什么意思?

$ service --status-all
 [ + ]  acpid
 [ + ]  anacron
 [ + ]  apparmor
 [ ? ]  apport
 [ ? ]  atieventsd
 [ + ]  avahi-daemon
 [ ? ]  binfmt-support
 [ + ]  bluetooth
 [ - ]  brltty
 [ + ]  console-font
 [ + ]  console-setup
 [ + ]  cron
 [ + ]  cups
 [ + ]  cups-browsed
 [ - ]  dbus
 [ ? ]  dns-clean
 [ + ]  friendly-recovery
 [ - ]  grub-common
 [ ? ]  irqbalance
 [ - ]  kerneloops
 [ ? ]  killprocs
 [ + ]  kmod
 [ ? ]  lightdm
 [ - ]  lm-sensors
 [ ? ]  mysql
 [ ? ]  networking
 [ ? ]  ondemand
 [ ? ]  pppd-dns
 [ - ]  procps
 [ - ]  pulseaudio
 [ ? ]  rc.local
 [ + ]  resolvconf
 [ + ]  rfkill-restore
 [ + ]  rfkill-store
 [ - ]  rsync
 [ + ]  rsyslog
 [ + ]  saned
 [ ? ]  sendsigs
 [ + ]  setvtrgb
 [ ? ]  speech-dispatcher
 [ - ]  sudo
 [ + ]  timidity
 [ + ]  udev
 [ ? ]  umountfs
 [ ? ]  umountnfs.sh
 [ ? ]  umountroot
 [ - ]  unattended-upgrades
 [ - ]  urandom
 [ + ]  virtualbox
 [ - ]  x11-common

并且使用sudo运行此命令会有所不同吗?我试过了,对我来说没有什么区别,但是在其他设置上可能有所不同吗?

Answers:


106

的输出service --status-all列出受所控制的服务状态System V

+指示服务正在运行,-表明已停止的服务。您可以通过运行看到service SERVICENAME status了一个+-服务。

某些服务由管理Upstart。您可以使用来检查所有Upstart服务的状态sudo initctl list。由管理的任何服务Upstart也将显示在提供的列表中,service --status-all但会标有?

参考: man service


2
可能很有趣:标记为-&的服务的输出+将进入stdout,标记为&service的服务的输出?将进入stderr。
dave1010 2015年

1
“由Upstart管理的任何服务也将显示在服务--status-all提供的列表中,但将标记为?。” 这不是严格正确的。刚刚在服务器上尝试了这两个命令。service --status-all给我43个服务。initctl list给我93。这93个中只有极少数是重复的。
Andrew Ensley

我的Ubuntu计算机未将“ Upstart服务”列为“?”。通过 服务--status-all
hfrmobile

@hfrmobile,除非您仍处于14.04或在启动时指定使用,否则您现在Upstart正在使用'systemd'。我也不再看到“?” 在我的16.04系统上。
肖恩

正在运行16.10 ...
hfrmobile

30

它没有在手册页中记录,但是快速查看源代码可以确认第一个猜测:

  • +:服务正在运行
  • -:服务未运行
  • ?:由于某种原因,无法确定服务状态。

实际代码

 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
         else
           out=$(env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1)
           if [ "$?" = "0" -a -n "$out" ]; then
             #printf " %s %-60s %s\n" "[+]" "$SERVICE:" "running"
             echo " [ + ]  $SERVICE"
             continue
           else
             #printf " %s %-60s %s\n" "[-]" "$SERVICE:" "NOT running"
             echo " [ - ]  $SERVICE"
             continue
           fi
         fi
   #env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status
 fi

条件是:

  • 如果初始化脚本不支持status命令,则状态为?
  • 如果初始化脚本(带有status参数)的退出状态为零,并且输出不为空,则状态为+
  • 否则状态为-

1

我认为这+意味着该服务处于活动状态/正在运行,意味着该服务处于-非活动状态/已停止,并且?该命令无法最终确定其是否处于活动状态,因为该服务status在服务脚本中没有命令。该service --status-all命令实际上service <service-name> status针对每个可用服务运行。


0

我发现有/无运行sudo都会有所不同。

其中的某些服务/var/run/仅对root用户具有读取权限。这些服务显示的状态,[-]不带sudo[+]sudo


1
你确定吗?一些服务状态会动态更改;也许您只是看到变化
Zanna
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.