发出关闭命令后,有时会收到如下状态消息:
Run Code Online (Sandbox Code Playgroud)A stop job is running for Session 1 of user xy
然后系统挂起一段时间,或永远取决于 ???
那么究竟什么是“停工”呢?
另外,为什么它有时会非常准确地估计所需的时间,而有时它可以永远运行?
Jde*_*eBP 40
systemd 以“作业”队列的形式在内部运行。每个作业(稍微简化一点)都是要采取的操作:停止、检查、启动或重新启动特定单元。
当(例如)您指示 systemd 启动服务单元时,它会为实现该目标所需的任何单元(服务单元、安装单元、设备单元等)计算出停止和启动作业的列表,根据单元需求和依赖关系,根据单元排序关系对它们进行排序,解决并(如果可能)修复任何自相矛盾,并且(如果最后一步成功)将它们放入队列中。
然后它尝试执行排队的“作业”。
正在为用户 xy 的会话 1 运行停止作业
这里的单位显示名称是Session 1 of user xy。这将是(从显示名称)一个会话单元,而不是一个服务单元。这是由 systemd 的logind程序及其 PAM 插件维护的用户空间登录会话抽象。它(本质上和理论上)是该用户在某处作为“登录会话”运行的所有进程的分组。
已排入队列的作业是stop。这可能需要很长时间,因为 systemd 人员错误地将 session hangup与 session shutdown混为一谈。他们打破前者让后者工作,作为回应,一些人改变 systemd 来打破后者让前者工作。systemd 的人真的应该认识到它们是两种不同的东西。
在您的登录会话中,您有一些东西会被忽略,SIGTERM或者一旦看到 就需要很长时间才能终止SIGTERM。具有讽刺意味的是,前者是一些作业控制外壳的长期行为。终止登录会话的领导人时,他们这些特殊的作业控制炮弹正确的方法是告诉他们,本次会议已经挂了,于是他们终止所有的他们的工作(不同类型的工作,以内部systemd作业),然后终止自己。
实际发生的事情是 systemd 正在等待单元的停止超时,直到它求助于SIGKILL. 当然,这个超时是可以按单位配置的,并且可以设置为永不超时。因此,为什么人们可能会看到不同的行为。
| 归档时间: |
|
| 查看次数: |
94827 次 |
| 最近记录: |