我无法弄清楚这些命令之间的区别,尤其是在将它们与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。)