如何通过systemctl命令获取用户级systemd中状态为not-found且active的单元列表
如何通过systemctl命令获取用户级systemd中状态为not-found且active的单元列表
你遇到的这个问题其实挺典型的——systemctl的--state参数是逻辑或的关系,也就是说--state=not-found,active会列出所有状态是not-found或者active的单元,而不是同时满足两者的,这确实不符合你的需求。
很遗憾,systemd目前(至少到255版本)并没有直接支持逻辑与的状态过滤参数,没办法只靠systemctl的原生参数来同时筛选not-found且active的用户级单元。不过我们可以结合systemctl的格式化输出和简单的文本处理工具来实现,比直接盲搜grep更可靠:
方法1:用CSV格式+awk精准筛选
利用--output=csv把输出转成结构化的逗号分隔格式,再用awk定位到ACTIVE列进行筛选:
systemctl --user list-units --state=not-found --output=csv | awk -F ',' '$3 == "active"'
这里第三列对应输出里的ACTIVE状态字段,精准匹配"active"就能拿到同时满足not-found和active的单元。
方法2:用JSON格式+jq(适合脚本场景)
如果需要更结构化的输出方便后续脚本处理,可以用JSON格式配合jq工具过滤:
systemctl --user list-units --state=not-found --output=json | jq '.[] | select(.active_state == "active")'
这个命令会直接输出符合条件的单元的完整结构化信息,可读性和可处理性都更强。
方法3:简化版grep(快速临时使用)
如果不想安装额外工具,用grep加正则也能实现精准匹配,避免误抓其他行:
systemctl --user list-units --state=not-found | grep -E 'not-found\s+active'
正则会匹配包含not-found后接空格再跟active的行,刚好对应你要的状态组合。
总结一下:目前没有纯systemctl原生命令支持这种“与逻辑”的状态过滤,结合文本处理工具是最直接的解决方案,上面几种方法可以根据你的使用场景灵活选择。
备注:内容来源于stack exchange,提问作者viperML
相关产品推荐
相关产品推荐

