systemd:停止所有卸载的单位

我有一些systemd单位安装和运行。 比方说,我手动卸载foo.service通过

  • 删除.service(和.socket)文件
  • 删除所有的符号链接(例如default.target.wants /)

我可以运行systemctl daemon-reload ,然后我看到:

 # systemctl status foo.service foo.service Loaded: error (Reason: No such file or directory) Active: active (running) since Mon 2013-07-08 13:50:29 EST; 48s ago Main PID: 1642 (node) 

所以systemd知道它没有安装,并且正在运行。 有一些命令,我​​可以用来停止所有运行的服务,不再有单位文件?


我已经考虑过的事情:

  • systemctl isolate <current-target>

    这将会阻止当前目标不需要的其他手动启动服务的副作用。

  • 使用systemctl disable而不是手动删除文件

    我想,但是这个脚本可以从一个可以访问正在运行的容器的文件系统的主机运行 – 它不能直接调用systemd

  • 使用systemctl stop foo.service

    这意味着我知道哪些服务已被卸载。 我不想弄清楚(或者记住它),我想要一个可以随时运行的通用命令来停止任何拖延的服务。

我问了邮件列表,Lennart Poettering回应了以下build议:

http://lists.freedesktop.org/archives/systemd-devel/2013-July/012083.html

引用这里为后人:


所以,处理这个问题的正确方法是确保所涉及的软件包包含正确的脚本,在卸载之前终止它们所包含的所有单元。 当然,我总是会有这样的软件包,所以我完全可以看到你的用例。

目前没有很好的方法来处理这个问题,但是你可以做的是:

 $ systemctl --all --type=not-found --type=error 

这将列出加载状态为“错误”或“未find”的所有单元(请注意,“未find”仅在最近的版本中可用,而在较早的systemd版本中只是“错误”的特例'。上面的命令行适用于所有版本)。 – type =开关用于过滤单元types,但实际上也可用于过滤负载状态。

然后过滤出第一列:

 $ systemctl --no-legend --all --type=not-found --type=error | awk '{ print $1 }' 

这将给你一个单元文件的列表被引用或启动,但没有安装单元文件。 然后用这个来停止单位:

 $ systemctl stop `systemctl --no-legend -all --type=not-found --type=error | awk '{ print $1}'`