Linux - 一个命令即可实现多个服务状态

Linux - 一个命令即可实现多个服务状态

我正在尝试检索 Unix 中的多个服务状态列表。我使用以下service命令:手册页

transmission-daemon例如,所有状态都以字符串开头。

我需要能够列出多个服务的状态,使用单个命令。以下是我目前正在尝试(但失败了)的事情:

在这里我尝试使用 获取状态列表grep

service $(ls /etc/init.d | grep "transmission-daemon") status

在这里我尝试列出所有状态,然后grep为它们列出。

service --status-all | grep "transmission-daemon"

这会产生下列结果,但并没有太大的帮助:

通过 grep 和 service --status-all 访问多个传输守护进程

我如何才能通过单个命令有效地实现我的要求,以便我可以继续通过管道awk进行进一步的定制?

所需示例输出:

transmission-daemon started
transmission-daemon2 stopped
transmission-daemon3 started

答案1

我没什么可说的,除了:

  • ls | grep我觉得你的东西真的很尴尬而且不对
  • 为了解决您的grep问题,是否service输出到标准错误?如何重定向标准错误标准输出

    service --status-all 2>&1 | grep "transmission-daemon"
    

(但对我来说这样做似乎真的很尴尬和错误)。


显然你想用地位命令,对吧?那么使用像这样:

#!/bin/bash

shopt -s nullglob

for s in /etc/init.d/transmission-daemon* ; do
    service "$(basename "$s")" status
done

一行代码:

bash -c 'shopt -s nullglob; for s in /etc/init.d/transmission-daemon* ; do service "$(basename "$s")" status; done'

得出:

在此处输入图片描述

希望这会让您走上正确的道路(或至少是更好的道路)!

答案2

另一个选择是使用 的find选项-exec

-exec command ;
     Execute command; true if 0 status is returned.  All following arguments to
     find are taken to be arguments to the command until an argument consisting 
     of `;' is encountered.  The string '{}' is replaced by the current file 
     name being processed everywhere it occurs in the arguments to the command, 
     not just in arguments where it is alone, as in some versions of find. Both
     of these constructions might need to be escaped (with a '\') or quoted to 
     protect them from expansion by the shell.

具体来说(为了易读性分开):

find /etc/init.d/ -name "transmission-daemon*" \
  -exec bash -c 'service $(basename "{}") status' \;

并在一行中:

find /etc/init.d/ -name "transmission-daemon*" -exec bash -c 'service $(basename "{}") status' \;

答案3

我发现这种方法最容易记住:

for s in /etc/init.d/transmission-daemon*; do service $(basename $s) status; done

相关内容