如何使用 systemctl 列出可以在安装新单元文件后启用的服务和计时器单元?

Liv*_*eBT 3 systemd systemctl

我的情况

我在下面安装了一些新的单元文件$HOME/.local/share/systemd/user/

ls -1 $HOME/.local/share/systemd/user/
some.service
some.timer
some_other.service
Run Code Online (Sandbox Code Playgroud)

我运行了以下命令以正确加载它们:systemctl --user daemon-reload

它们出现在 的自动完成中systemctl --user enable <tab> <tab>。我正在寻找的是一种稍后用口香糖编写脚本的方法,以向我显示当前未启用的那些单元的列表。

我的问题

还有比ls -1 $HOME/.local/share/systemd/user/获取我正在寻找的列表更好的方法吗?

systemctl通过自动完成了解单位,但对于一个看似相当简单的问题,我不想那么深入。我查看了systemctl list 所有可能的(包括禁用的)服务和 Systemd 文档的某些部分,但我还无法找到我正在寻找的内容。它不一定是完美的,自动完成列表还有一些我可以过滤掉的其他条目。这对我来说不会是问题。

avi*_*iro 6

一般来说,systemctl --user list-unit-files显示所有用户服务的列表。

因此,您可以运行以下命令来获取禁用的用户服务列表:

systemctl --user --full --no-legend --no-pager list-unit-files --state=disabled
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你可以查看 的bash 补全文件systemctl 看看它是如何获取禁用服务列表的,非常相似:


__systemctl() {
    local mode=$1; shift 1
    systemctl $mode --full --legend=no --no-pager --plain "$@" 2>/dev/null
}

[...]

__get_disabled_units() { __systemctl $1 list-unit-files "$2*" \
                              | while read -r a b c  ; do [[ $b == "disabled" ]] && echo " $a"; done; }
Run Code Online (Sandbox Code Playgroud)

您还可以在本地计算机上找到该文件。就我而言,它位于/usr/share/bash-completion/completions/systemctl,但我不确定它是否是所有发行版的标准路径。


Liv*_*eBT 5

aviro 的回答激励我花更多的时间在这上面。这就是我现在想出的:

SYSTEMD_COLORS=no systemctl list-unit-files \
    --full \
    --no-legend \
    --no-pager \
    --state=disabled \
    --type=service,timer \
    --user \
| sort \
| awk '!/^(obex|rygel|wireplumber)(@)?\.(service|timer)/ {print $1}'
Run Code Online (Sandbox Code Playgroud)
  • 您不需要SYSTEMD_COLORS=no,systemctl 本身应该检测到其输出已发送到管道,但我将其留在这里供将进一步试验代码的读者使用。

  • 我之所以将其列入,--type=service,timer是因为我的清单中至少有一个.socket单位。

  • obex|rygel|wireplumber是我不想选择的单位列表。如果要使用允许列表而不是拒绝列表,则需要!在开始时删除。

正如我在问题中所写,我用口香糖进一步处理这个问题,所以我的脚本中紧接着 awk | gum choose。当您查看该项目的网站时,这是有道理的。