Answers:
systemd根据“作业”队列在内部进行操作。每个工作(略微简化)都是要执行的操作:停止,检查,启动或重新启动特定单元。
例如,当您指示systemd启动服务单元时,它将为实现该目标所需的任何单元(服务单元,安装单元,设备单元等)列出停止和启动作业的列表。单元需求和依存关系,根据单元订购关系对其进行排序,计算出并(如果可能)修复任何自相矛盾的内容,并且(如果最后一步成功了)将其放入队列中。
然后,它尝试执行排队的“工作”。
用户xy的会话1正在运行停止作业
单位显示名称为Session 1 of user xy
。(根据显示名称)这将是会话单元,而不是服务单元。这是由systemd的logind
程序及其PAM插件维护的用户空间登录会话抽象。从本质上和理论上讲,它是该用户在某个地方作为“登录会话”运行的所有进程的分组。
被排队的工作是stop
。可能要花很长时间,因为系统化的人将会话挂断与会话关闭错误地混为一谈。他们破坏了前者以使后者起作用,作为回应,一些人改变了系统来打破后者以使前者起作用。有系统的人们确实应该认识到他们是两回事。
在您的登录会话中,您会忽略某些内容,SIGTERM
或者一旦看到就会花很长时间终止它SIGTERM
。具有讽刺意味的是,前者是某些作业控制外壳的长期行为。终止登录会话的领导人时,他们这些特殊的作业控制炮弹正确的方法是告诉他们,本次会议已经挂了,于是他们终止所有的他们的工作(不同类型的工作,以内部systemd作业),然后终止自己。
实际上,systemd正在等待单元的停止超时,直到诉诸为止SIGKILL
。当然,该超时可以按单位配置,并且可以设置为永不超时。因此,为什么人们可能会看到不同的行为。
这些消息来自systemd,这是一个启动和停止作业的初始化系统。作业可以是守护程序,但也可以完成一些小的任务,例如安装和卸载磁盘,删除/ tmp或在启动时保存和恢复屏幕亮度。systemctl list-units
给你的主意。Systemd使用“单位”和“工作”来表示相同的意思。
与一样systemctl stop ...
,当一个作业被停止时,一个问题是在声明失败并用SIGKILL
信号杀死该作业的进程之前,等待该作业完成的时间。我们真的不愿意使用,SIGKILL
除非我们必须这样做,因为它没有机会使流程完全退出。对于某些进程,几秒钟可能是足够的时间来声明故障,对于其他进程,例如数据库,可能需要大量的网络和磁盘I / O,以使作业完全停止,因此我们可以给这些单元几分钟的时间来彻底关闭。
您在关闭时看到的内容等效于systemctl stop $UNIT_NAME
需要一些时间才能运行。有一个计数器,显示已过去的秒数和发出SIGKILL之前的最大等待时间,无论关机如何进行。
除非有充分的理由期望延迟很长,否则通常表示某种故障。范围可能是DHCP服务器不响应发布,因此发布操作需要超时,或者是导致守护程序永不退出的某些错误。
某些服务被卡住,systemd正在等待其退出。Systemd可能无法准确估计所需的时间,该时间(通常为90秒)是systemd在没有耐心之前要等待的时间。看到这篇文章: