我正在尝试检索 Unix 中的多个服务状态列表。我使用以下service
命令:手册页。
transmission-daemon
例如,所有状态都以字符串开头。
我需要能够列出多个服务的状态,使用单个命令。以下是我目前正在尝试(但失败了)的事情:
在这里我尝试使用 获取状态列表grep
。
service $(ls /etc/init.d | grep "transmission-daemon") status
在这里我尝试列出所有状态,然后grep
为它们列出。
service --status-all | grep "transmission-daemon"
这会产生下列结果,但并没有太大的帮助:
我如何才能通过单个命令有效地实现我的要求,以便我可以继续通过管道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