我的目标是使用命令以编程方式重新运行图形目标单元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.service
或gdm.service
。
因此,例如,如果它已启用(并且可能已经启动),sudo systemctl restart lightdm.service
将重新启动您的图形界面。
答案2
例如,强制 systemd 在再次启动图形之前杀死所有目标进程(+其他)的命令。几乎就像您再次重新启动系统一样。
该命令是systemctl soft-reboot
v254 中的新命令。
在以前的版本中:切换到最小目标(例如,systemctl rescue
又名systemctl isolate rescue.target
),等待 sulogin 提示,提供 root 密码,切换回来(systemctl default
)。没有单步命令,因为直到 v254 才添加单步命令。
(或者,systemctl kexec
可以执行“内核重新启动”——照常停止所有进程和服务,然后启动新的 Linux 内核并重新启动所有内容——但跳过固件和引导加载程序,即直接从 Linux 跳转到 Linux。不幸的是,kexec 是一个有点繁琐并且并不总是有效。)