以下是我使用的程序:
- 我正在使用 ssh 连接到 Ubuntu 22.04。
- 我正在使用 sudo 使用 vim(或 emacs)编辑文件
- 我将留给编辑器Ctrl-Z
然后,我关闭 ssh 连接。要么我强制关闭 ssh 连接,要么由于网络原因连接被关闭。
在我关闭 ssh 连接之前,这是我的 Ubuntu 上的情况:
userxxx 468394 468393 0 11:04 pts/2 00:00:00 -bash
root 469168 265462 0 12:43 ? 00:00:00 sshd: [accepted]
sshd 469169 469168 0 12:43 ? 00:00:00 sshd: [net]
root 469177 468394 0 12:43 pts/2 00:00:00 sudo vim hello-world.txt
root 469180 265462 0 12:43 ? 00:00:00 sshd: [accepted]
root 469181 469177 0 12:43 pts/0 00:00:00 sudo vim hello-world.txt
root 469182 469181 0 12:43 pts/0 00:00:00 vim hello-world.txt
当我通过另一个 ssh 连接回来后,我得到的结果如下:
root 469168 265462 0 12:43 ? 00:00:00 sshd: [accepted]
sshd 469169 469168 0 12:43 ? 00:00:00 sshd: [net]
root 469177 1 0 12:43 ? 00:00:00 sudo vim hello-world.txt
root 469180 265462 0 12:43 ? 00:00:00 sshd: [accepted]
root 469181 469177 0 12:43 ? 00:00:00 sudo vim hello-world.txt
root 469182 469181 0 12:43 ? 00:00:00 vim hello-world.txt
当我离开时,469177已从468394到1?
我在 Debian 上尝试过,但出现了不同的行为:命令vim被杀死。当我使用没有 sudo 的编辑器时,该进程vim被杀。
问题:
有人可以确认这个过程命令vim预计在 ssh 连接终止时会被终止吗?
有人可以解释一下它在 Ubuntu 上没有被杀死的原因吗?
如果需要更多详细信息,请告诉我。
答案1
正如@Marco 在评论部分所说的那样,/etc/systemd/logind.conf
是您的朋友。可以通过此配置文件中的布尔选项配置用户进程KillUserProcesses
,以便在用户注销时保留或终止进程。
来自Ubuntu 22.04 手册页:“配置当用户注销时是否应终止用户进程。”
正如您在 Debian 的行为中所注意到的,Debian 将 bool 默认为yes
,而 Ubuntu 的手册页表明默认设置为no
。
答案2
这不是对你主要问题的直接回答,而是对你评论:
谢谢@Raffa,我确实认为您的评论完全回答了我心中的问题!我应该问为什么没有 sudo 的 vim 会被销毁,而不是为什么 sudo vim 不会被销毁。我仍然有点惊讶,使用 KillUserProcesses=yes 和 KillExcludeUsers=root 会为 sudo 进程引入与 KillUserProcesses=no 和 KillExcludeUsers=root 不同的行为。如果它是一个 sudo 进程,那么它就是 root,因此,无论 KillUserProcesses 如何,进程都应该被排除在被终止之外……这就是我读 man logind.conf 的方式……
尽可能在有限的范围内使用尽可能简单的术语并附有演示。
让我们看一下通过 SSH 连接到服务器的幕后情况。
test@localhost
是我的测试演示用户...那么,让我们连接:
ubuntu@Lenovo:~$ ssh test@localhost
test@localhost's password:
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.19.0-43-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Expanded Security Maintenance for Applications is not enabled.
9 updates can be applied immediately.
To see these additional updates run: apt list --upgradable
21 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm
Last login: Tue Jun 6 17:22:18 2023 from 127.0.0.1
test@Lenovo:~$
现在已连接并登录...让我们看看后台登录是什么样子的(记住我们的范围仅限于并专注于所讨论的行为):
test@Lenovo:~$ loginctl user-status --no-pager test
test (1004)
Since: Tue 2023-06-06 18:22:53 +03; 4s ago
State: active
Sessions: *455
Linger: no
Unit: user-1004.slice
├─session-455.scope
│ ├─60990 "sshd: test [priv]" "" "" ""
│ ├─61052 "sshd: test@pts/2" "" "" "" ""
│ ├─61055 -bash
│ └─61114 loginctl user-status --no-pager test
└─[email protected]
├─app.slice
│ ├─dbus.service
│ │ ├─61024 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
│ │ ├─61097 /usr/libexec/goa-daemon
│ │ └─61104 /usr/libexec/goa-identity-service
│ ├─gvfs-afc-volume-monitor.service
│ │ └─61084 /usr/libexec/gvfs-afc-volume-monitor
│ ├─gvfs-daemon.service
│ │ └─61037 /usr/libexec/gvfsd
│ ├─gvfs-goa-volume-monitor.service
│ │ └─61093 /usr/libexec/gvfs-goa-volume-monitor
│ ├─gvfs-gphoto2-volume-monitor.service
│ │ └─61080 /usr/libexec/gvfs-gphoto2-volume-monitor
│ ├─gvfs-mtp-volume-monitor.service
│ │ └─61089 /usr/libexec/gvfs-mtp-volume-monitor
│ └─gvfs-udisks2-volume-monitor.service
│ └─61075 /usr/libexec/gvfs-udisks2-volume-monitor
├─background.slice
│ ├─tracker-extract-3.service
│ │ └─61007 /usr/libexec/tracker-extract-3
│ └─tracker-miner-fs-3.service
│ └─61061 /usr/libexec/tracker-miner-fs-3
├─init.scope
│ ├─60995 /lib/systemd/systemd --user
│ └─60996 "(sd-pam)"
└─session.slice
├─pipewire-media-session.service
│ └─61005 /usr/bin/pipewire-media-session
├─pipewire-pulse.service
│ └─61006 /usr/bin/pipewire-pulse
└─pipewire.service
└─61004 /usr/bin/pipewire
يونيو 06 18:22:53 Lenovo dbus-daemon[61024]: [session uid=1004 pid=61024] Activating service name='org.gnome.Identity' requested by ':1.12' (uid=1004 pid=61097 comm="/usr/libexec/goa-daemon " label="unconfined")
يونيو 06 18:22:53 Lenovo dbus-daemon[61024]: [session uid=1004 pid=61024] Successfully activated service 'org.gnome.OnlineAccounts'
يونيو 06 18:22:53 Lenovo dbus-daemon[61024]: [session uid=1004 pid=61024] Successfully activated service 'org.gtk.vfs.GoaVolumeMonitor'
يونيو 06 18:22:53 Lenovo systemd[60995]: Started Virtual filesystem service - GNOME Online Accounts monitor.
يونيو 06 18:22:53 Lenovo dbus-daemon[61024]: [session uid=1004 pid=61024] Successfully activated service 'org.gnome.Identity'
يونيو 06 18:22:54 Lenovo dbus-daemon[61024]: [session uid=1004 pid=61024] Successfully activated service 'org.freedesktop.Tracker3.Miner.Files'
يونيو 06 18:22:54 Lenovo systemd[60995]: Started Tracker file system data miner.
يونيو 06 18:22:54 Lenovo systemd[60995]: Started Tracker metadata extractor.
يونيو 06 18:22:54 Lenovo systemd[60995]: Reached target Main User Target.
يونيو 06 18:22:54 Lenovo systemd[60995]: Startup finished in 726ms.
test@Lenovo:~$
从所有这些你需要知道三件事:
Linger: no
意味着您的登录会话将在注销时终止(或通过其他方式结束会话) 从而导致所有上面列出的服务,切片,范围和其他单元将被停止,杀死,销毁或“放弃”。session-455.scope
是用户运行服务的地方(并非如此,而是按引用分组并进行管理……换句话说,“范围”实际上是(除其他事项外)这些服务可以“看到”什么或如何“被看到”的定义)。[email protected]
它创建了用户运行时环境,对于用户空间应用程序/程序的运行至关重要。
让我们放大session-455.scope
:
test@Lenovo:~$ systemctl --no-pager status session-455.scope
● session-455.scope - Session 455 of User test
Loaded: loaded (/run/systemd/transient/session-455.scope; transient)
Transient: yes
Active: active (running) since Tue 2023-06-06 18:22:53 +03; 23min ago
Tasks: 4
Memory: 3.5M
CPU: 166ms
CGroup: /user.slice/user-1004.slice/session-455.scope
├─60990 "sshd: test [priv]" "" "" ""
├─61052 "sshd: test@pts/2" "" "" "" ""
├─61055 -bash
└─61470 systemctl --no-pager status session-455.scope
test@Lenovo:~$
注意它是如何报告的active (running)
...这些是您当前正在运行的用户进程...因此,让我们再添加一个,然后用Ctrl+暂停它z:
test@Lenovo:~$ vim
[1]+ Stopped vim
test@Lenovo:~$
并再次检查用户范围单元:
test@Lenovo:~$ systemctl --no-pager status session-455.scope
● session-455.scope - Session 455 of User test
Loaded: loaded (/run/systemd/transient/session-455.scope; transient)
Transient: yes
Active: active (running) since Tue 2023-06-06 18:22:53 +03; 28min ago
Tasks: 6
Memory: 10.3M
CPU: 275ms
CGroup: /user.slice/user-1004.slice/session-455.scope
├─60990 "sshd: test [priv]" "" "" ""
├─61052 "sshd: test@pts/2" "" "" "" ""
├─61055 -bash
├─61515 vim
└─61537 systemctl --no-pager status session-455.scope
test@Lenovo:~$
没什么大不了的...只是新的用户流程现在被添加到范围内。
现在让我们再运行一个进程,但然后sudo
暂停它:
test@Lenovo:~$ sudo vim
[sudo] password for test:
[2]+ Stopped sudo vim
test@Lenovo:~$
再检查一下:
test@Lenovo:~$ systemctl --no-pager status session-455.scope
● session-455.scope - Session 455 of User test
Loaded: loaded (/run/systemd/transient/session-455.scope; transient)
Transient: yes
Active: active (running) since Tue 2023-06-06 18:22:53 +03; 34min ago
Tasks: 10
Memory: 18.7M
CPU: 432ms
CGroup: /user.slice/user-1004.slice/session-455.scope
├─60990 "sshd: test [priv]" "" "" ""
├─61052 "sshd: test@pts/2" "" "" "" ""
├─61055 -bash
├─61515 vim
├─61610 sudo vim
├─61611 sudo vim
├─61612 vim
└─61637 systemctl --no-pager status session-455.scope
يونيو 06 18:56:27 Lenovo sudo[61610]: test : TTY=pts/2 ; PWD=/home/test ; USER=root ; COMMAND=/usr/bin/vim
يونيو 06 18:56:27 Lenovo sudo[61610]: pam_unix(sudo:session): session opened for user root(uid=0) by test(uid=1004)
test@Lenovo:~$
现在,戏剧性的事情发生了...一个新的用户会话被打开root
(从技术sudo
上讲)...此会话是从您的用户范围内打开的,但实际上它是其他人的(即用户root
)会话...现在您的用户范围不再完全属于您自己,因此也与该用户的会话相关联(等待它再次属于你)...在最佳情况下,该root
会话应在用户应用程序vim
退出后关闭...但是,如果情况不理想怎么办?让我们看看我们的流程是怎样的:
test@Lenovo:~$ ps -ejf | { head -n 1; grep vim; }
UID PID PPID PGID SID C STIME TTY TIME CMD
test 61515 61055 61515 61055 0 18:49 pts/2 00:00:00 vim
root 61610 61055 61610 61055 0 18:56 pts/2 00:00:00 sudo vim
root 61611 61610 61611 61611 0 18:56 pts/3 00:00:00 sudo vim
root 61612 61611 61612 61611 0 18:56 pts/3 00:00:00 vim
test@Lenovo:~$
然后只是kill
会话ssh
并给它SIGHUP
:
test@Lenovo:~$ pkill --signal SIGHUP "ssh"
pkill: killing pid 1782 failedConnection to localhost closed by remote host.
Connection to localhost closed.
ubuntu@Lenovo:~$
然后,连接并再次登录以查看发生了什么:
ubuntu@Lenovo:~$ ssh test@localhost
test@localhost's password:
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.19.0-43-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Expanded Security Maintenance for Applications is not enabled.
9 updates can be applied immediately.
To see these additional updates run: apt list --upgradable
21 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm
Last login: Tue Jun 6 18:22:53 2023 from 127.0.0.1
test@Lenovo:~$ loginctl user-status --no-pager test
test (1004)
Since: Tue 2023-06-06 18:22:53 +03; 1h 2min ago
State: active
Sessions: *479 455
Linger: no
Unit: user-1004.slice
├─session-455.scope
│ ├─61610 sudo vim
│ ├─61611 sudo vim
│ └─61612 vim
├─session-479.scope
│ ├─62030 "sshd: test [priv]" "" "" ""
│ ├─62107 "sshd: test@pts/4" "" "" "" ""
│ ├─62108 -bash
│ └─62137 loginctl user-status --no-pager test
└─[email protected]
├─app.slice
│ ├─dbus.service
│ │ ├─61024 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
│ │ ├─61097 /usr/libexec/goa-daemon
│ │ └─61104 /usr/libexec/goa-identity-service
│ ├─gvfs-afc-volume-monitor.service
│ │ └─61084 /usr/libexec/gvfs-afc-volume-monitor
│ ├─gvfs-daemon.service
│ │ └─61037 /usr/libexec/gvfsd
│ ├─gvfs-goa-volume-monitor.service
│ │ └─61093 /usr/libexec/gvfs-goa-volume-monitor
│ ├─gvfs-gphoto2-volume-monitor.service
│ │ └─61080 /usr/libexec/gvfs-gphoto2-volume-monitor
│ ├─gvfs-mtp-volume-monitor.service
│ │ └─61089 /usr/libexec/gvfs-mtp-volume-monitor
│ └─gvfs-udisks2-volume-monitor.service
│ └─61075 /usr/libexec/gvfs-udisks2-volume-monitor
├─background.slice
│ └─tracker-miner-fs-3.service
│ └─61061 /usr/libexec/tracker-miner-fs-3
├─init.scope
│ ├─60995 /lib/systemd/systemd --user
│ └─60996 "(sd-pam)"
└─session.slice
├─pipewire-media-session.service
│ └─61005 /usr/bin/pipewire-media-session
├─pipewire-pulse.service
│ └─61006 /usr/bin/pipewire-pulse
└─pipewire.service
└─61004 /usr/bin/pipewire
يونيو 06 18:22:53 Lenovo dbus-daemon[61024]: [session uid=1004 pid=61024] Successfully activated service 'org.gtk.vfs.GoaVolumeMonitor'
يونيو 06 18:22:53 Lenovo systemd[60995]: Started Virtual filesystem service - GNOME Online Accounts monitor.
يونيو 06 18:22:53 Lenovo dbus-daemon[61024]: [session uid=1004 pid=61024] Successfully activated service 'org.gnome.Identity'
يونيو 06 18:22:54 Lenovo dbus-daemon[61024]: [session uid=1004 pid=61024] Successfully activated service 'org.freedesktop.Tracker3.Miner.Files'
يونيو 06 18:22:54 Lenovo systemd[60995]: Started Tracker file system data miner.
يونيو 06 18:22:54 Lenovo systemd[60995]: Started Tracker metadata extractor.
يونيو 06 18:22:54 Lenovo systemd[60995]: Reached target Main User Target.
يونيو 06 18:22:54 Lenovo systemd[60995]: Startup finished in 726ms.
يونيو 06 18:56:27 Lenovo sudo[61610]: test : TTY=pts/2 ; PWD=/home/test ; USER=root ; COMMAND=/usr/bin/vim
يونيو 06 18:56:27 Lenovo sudo[61610]: pam_unix(sudo:session): session opened for user root(uid=0) by test(uid=1004)
test@Lenovo:~$
用户会话仍然存在(查看登录时间)并且我们仍然有用户范围session-455.scope
:
test@Lenovo:~$ systemctl --no-pager status session-455.scope
● session-455.scope - Session 455 of User test
Loaded: loaded (/run/systemd/transient/session-455.scope; transient)
Transient: yes
Active: active (abandoned) since Tue 2023-06-06 18:22:53 +03; 1h 5min ago
Tasks: 4
Memory: 8.5M
CPU: 1.385s
CGroup: /user.slice/user-1004.slice/session-455.scope
├─61610 sudo vim
├─61611 sudo vim
└─61612 vim
يونيو 06 18:56:27 Lenovo sudo[61610]: test : TTY=pts/2 ; PWD=/home/test ; USER=root ; COMMAND=/usr/bin/vim
يونيو 06 18:56:27 Lenovo sudo[61610]: pam_unix(sudo:session): session opened for user root(uid=0) by test(uid=1004)
test@Lenovo:~$
对于我们识别并仍报告为的进程Active
,但现在(abandoned)
改为(running)
...那就是当您的用户会话失去对该范围的最终控制权时...KillUserProcesses=true
适用于这种情况,即“废弃”的进程或整个范围,如man logind.conf
:
KillUserProcesses= 接受布尔参数。配置是否应终止用户的进程 当用户注销时。如果为 true,则会话对应的范围单元和所有 该范围内的进程将被终止。如果为 false,则范围是“弃”, 参见 systemd.scope(5),进程不会被终止。默认为“否”,但参见 选项 KillOnlyUsers= 和 KillExcludeUsers= 如下...
KillExcludeUsers=root
.scope
将会保存登录会话下的“废弃”单元root
,而不是您的单元...它适用于整个用户范围单元,而不适用于单个用户进程,除非这些进程在没有范围单元的用户主会话下运行。
让我们再次仔细看看我们的流程:
test@Lenovo:~$ ps -ejf | { head -n 1; grep vim; }
UID PID PPID PGID SID C STIME TTY TIME CMD
root 61610 1 61610 61055 0 18:56 ? 00:00:00 sudo vim
root 61611 61610 61611 61611 0 18:56 ? 00:00:00 sudo vim
root 61612 61611 61612 61611 0 18:56 ? 00:00:00 vim
test@Lenovo:~$
瞧。