den*_*que 4 command-line init.d services
这是非常不直观的。
例如
当用户尝试:
# service --status-all | grep postgres
Run Code Online (Sandbox Code Playgroud)
这行不通...
grep“服务”的唯一方法是:
# service --status-all 2>&1 | grep postgres
Run Code Online (Sandbox Code Playgroud)
例如在 Gentoo Linux 上不会出现这个问题:
# rc-status | grep postgres
Run Code Online (Sandbox Code Playgroud)
会正常工作。
这听起来可能有点奇怪,但事实并非如此。更准确地说,它只显示[?]
标准错误的未知状态(除了其他错误消息)。
您可以在/usr/sbin/services
. 相关部分如下(第 68--98 行):
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 "\Wstatus)" "$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
;;
esac
done
exit 0
Run Code Online (Sandbox Code Playgroud)
该echo " [ + ] $SERVICE"
行并没有打印到标准错误,所以[ - ]
变种。
您可以轻松地运行测试上述假设:services --status-all 2>/dev/null
。如果您有任何支持status命令的正在运行的服务,它将被列出。