强制 Systemd 重新隔离目标单元

强制 Systemd 重新隔离目标单元

我的目标是使用命令以编程方式重新运行图形目标单元systemctl。虽然我知道我可以使用sudo systemctl isolate graphical.target,但当图形目标已经处于活动状态时,这种方法似乎不起作用。

我正在寻求有关如何实现图形目标单元的全新启动的指导,即使它当前处于活动状态。

例如,systemd在再次启动图形之前强制杀死所有目标进程(+其他)的命令。几乎就像您再次重新启动系统一样。

现在为了实现这一目标,我首先切换到救援目标,然后isolate返回图形。有没有更好的解决办法?

答案1

systemctl 的手册页明确指出这isolate是危险的。这可能不是重新启动单个服务的最佳方法。在我的系统上,graphical.target有 252 个依赖项。如果isolate按照您的建议操作,那么重新启动系统可能会比重新启动所有系统更好。

您应该找到支持图形界面的特定服务,并restart在该特定服务上使用而不是隔离,而不是尝试重新启动graphical.target。

您可以列出所有依赖项systemctl list-dependencies graphical.target 您可以列出至少一些可能的显示管理器systemctl list-unit-files '*dm.service'

两个可能的候选者是lightdm.servicegdm.service

因此,例如,如果它已启用(并且可能已经启动),sudo systemctl restart lightdm.service将重新启动您的图形界面。

答案2

例如,强制 systemd 在再次启动图形之前杀死所有目标进程(+其他)的命令。几乎就像您再次重新启动系统一样。

该命令是systemctl soft-rebootv254 中的新命令。

在以前的版本中:切换到最小目标(例如,systemctl rescue又名systemctl isolate rescue.target),等待 sulogin 提示,提供 root 密码,切换回来(systemctl default)。没有单步命令,因为直到 v254 才添加单步命令。

(或者,systemctl kexec可以执行“内核重新启动”——照常停止所有进程和服务,然后启动新的 Linux 内核并重新启动所有内容——但跳过固件和引导加载程序,即直接从 Linux 跳转到 Linux。不幸的是,kexec 是一个有点繁琐并且并不总是有效。)

相关内容