为什么 systemd 在会话终止时不尝试停止(某些)进程?

为什么 systemd 在会话终止时不尝试停止(某些)进程?

当我尝试关闭logind会话(通过注销)时,会话下的一些进程仍在运行,阻止其正常终止,导致[email protected]两者都无法终止。我听说后者是一种预期行为(希望某些单元保持运行),但我认为让会话保持运行并不是实现这一目标的正确方法。此外,当我手动终止会话时,也会终止[email protected],因此这几乎看起来像是延迟会话用于此目的。

systemd-cgls为了说明我的意思,这是我正常登录时(即现在)的部分输出:

Control group /:
-.slice
└─user.slice
  └─user-1000.slice
    ├─[email protected]
    │ └─ //various units listed; removed for brevity
    └─session-c8.scope
      ├─4883 login -- sammko     
      ├─4905 /usr/bin/gnome-keyring-daemon --daemonize --login
      └─ //various other processes listed; removed for brevity

输出完全符合预期。退出会话后:

Control group /:
-.slice
└─user.slice
  └─user-1000.slice
    ├─[email protected]
    │ └─ //various units listed; removed for brevity
    └─session-c8.scope
      └─4905 /usr/bin/gnome-keyring-daemon --daemonize --login

gnome-keyring-daemon以某种方式存活下来,保持会话处于活动状态。如果我们现在运行loginctl show-session c8,我们会State=closing在输出中找到。如果我们继续,我们kill -HUP 4905会发现进程和会话终止,整个进程也随之终止。如果我们继续,进程也会终止。这让我想到不会忽略信号,或类似的东西。如果进程需要两次信号才能真正关闭,我在注销之前尝试了两次,进程也终止了。user-uid.slicekill -TERM 4905gnome-keyring-daemonkill -HUP 4905

我的印象是 systemd 尝试使用 来终止进程SIGHUP,而gnome-keyring-daemon通常会做出相应的响应。(我也曾使用过gpg-agentlinger ,它成功忽略了SIGHUP。但那是另一个故事。)

我的问题是:为什么gnome-keyring-daemon注销后仍无明显原因地继续运行,除了启用之外,如何解决此问题KillUserProcesses

另外,请注意,这个问题与systemd-230

相关内容