`loginctl deter-session` `loginctl kill-session` 和 `systemctl stop` 之间的功能区别是什么

`loginctl deter-session` `loginctl kill-session` 和 `systemctl stop` 之间的功能区别是什么

我无法弄清楚这些命令之间的区别,尤其是在将它们与session-c###.scope单位一起使用时。我尝试查看手册页,并浏览了一下代码,但仍然存在一些问题。

手册页建议loginctl kill-session向会话中的一个或所有进程发送信号。那么这与loginctl terminate-session手册页建议的有什么不同?

这将终止会话的所有进程并释放与该会话相关的所有资源。

但这与有很大不同吗kill-session -s SIGKILL

我面临的问题是,在执行类似 的操作后loginctl kill-session c###,会话不再出现在loginctl session-status或中list-sessions,但systemctl status session-c###.scope会将其显示为已放弃,并且根据 ,进程似乎仍在继续ps。我想知道是否loginctl terminate-session会更好,甚至systemctl stop

答案1

loginctl kill-session [--signal=]效果完全相同systemctl kill——两者都最终通过 .scope 单元对象上的 D-Bus 调用 systemd 的 KillUnit(signal)。(请注意,两者都默认发送 SIGTERM,不是信号终止。

类似地,loginctl terminate-session与 的效果基本相同systemctl stop,两个命令都将通过 D-Bus 调用 systemd 的 StopUnit()。(但是,loginctl 将在尝试停止 .scope 之前将其明确标记为“已放弃”,从而导致 systemd 记录任何剩余进程。)

这两种情况的细微差别在于,loginctl 的调用是通过logind守护进程代理的,守护进程应用的 polkit 授权规则与直接调用 systemd 不同。(例如,通常非 root 用户无法直接调用 systemd。)

相关内容