命令:
service --status-all
遍历所有服务花费的时间太长了,尤其是当我只想从输出中得到名称时(我不在乎它是否正在运行)。有没有更快的方法来检索包含已知字符模式的服务名称?
由于 Ubuntu 14.04 和 Ubuntu 16.04 对 php-fpm 使用不同的服务名称(Ubuntu 14.04 中的 php5-fpm 和 Ubuntu 16.04 中的 php7.0-fpm),支持多平台的开发人员需要能够确定服务名称。
如果我在较慢的计算机上运行以下命令:
service --status-all 2>&1 | grep -F -- "-fpm" | awk '{print $4}'
返回“php7.0-fpm”需要几秒钟(最多5秒)。
必须与这些服务交互的开发人员需要一种更快的方法来确定服务的名称,因为它们会不断地从一个操作系统版本变为另一个操作系统版本。
有人知道更好更快的方法来做到这一点吗?
与此同时,我在这里提交了这个错误:
https://bugs.launchpad.net/ubuntu/+source/ubuntu-system-service/+bug/1742410
我不知道还有什么其他方法可以快速完成我需要做的事情......
答案1
如果您已经知道这取决于 Ubuntu 的版本,为什么不直接检查版本呢?
case $(lsb_release -sc) in
trusty)
fpm_service=php5-fpm
;;
xenial)
fpm_service=php7.0-fpm
;;
artful)
fpm_service=php7.1-fpm
;;
esac
或者,您可以测试服务文件/etc/init.d
(因为所有当前 FPM 包都提供了/etc/init.d
脚本):
find /etc/init.d/ -type f -iname '*-fpm' -printf "%P\n"
答案2
看来我将采用以下方法:
fpmService=$(ls /etc/init.d 2>&1 | grep -F -- "fpm");
if [ -z "$fpmService" ]; then
fpmService=$(ls /lib/systemd/system 2>&1 | grep -F -- "fpm" | grep -o "[^(service)]*" | sed "s/\.$//"
fi
if [ -z "$fpmService" ]; then
fpmService=$(ls /lib/systemd/system 2>&1 | grep -F -- "' . $service . '" | grep -o "[^(service)]*" | sed "s/\.$//")
fi
虽然很愚蠢,但是它确实有效...服务命令仍然应该为我们提供一个界面来执行此操作...