当我运行“w”命令时,我看到两个用户登录(都是我)。在这里快速搜索一下,就会发现这是正常的,因为“单个用户可以同时拥有多个活动会话。”
什么是会话?为什么我只登录过一次系统,却有两个会话?
答案1
Session
通常指 shell 会话。壳是让你与计算机交互的东西。它充当用户和核心每当您运行命令时,shell 都会捕获您的意图并告诉内核执行其操作。
在大多数 Linux 版本中,默认 shell 是bash
,每次打开新终端时都会启动一个新bash
会话。在您发布的输出中w
,您似乎有一个图形登录会话(看起来您正在 ssh 到机器上):
argento :0 18set13 ?xdm? 2days 1.58s gdm-session-worker [pam/gdm-password]
一些开放的终端模拟器:
argento pts/0 18set13 29:26m 5:26 5:26 rdesktop -g 1200x700 -u administrator -p XXXXXXXXX -d DOMAIN -K srv-wsus
argento pts/1 18set13 9days 0.16s 0.16s /bin/bash
argento pts/2 lun10 5.00s 0.09s 7.55s /usr/bin/python /usr/bin/terminator
argento pts/3 14:40 33:41 0.09s 0.03s vim notes.txt
argento pts/4 gio12 26:04m 0.10s 7.55s /usr/bin/python /usr/bin/terminator
argento pts/5 14:56 17:33 0.11s 0.11s /bin/bash
而且您似乎已经从非图形tty登录:
argento tty2 15:11 1:01 0.09s 0.09s -bash
每个都是你的 shell 的一个单独实例,并且每个都算作它自己的会话。
答案2
1.尽管用户登录到单个进程(shell,即他们的命令行界面),但用户最终会由于以下操作而运行许多进程:
-> 在后台运行非交互式任务。-
> 通过作业控制在交互式任务之间切换。-
> 启动通过管道协同工作的多个进程。-
> 运行窗口系统,例如 X 窗口系统,允许打开多个终端窗口。
2. 为了处理所有这些进程,内核需要形成由这些进程组成的进程组。
3. 为了进一步根据用户管理这些进程组,这些组根据用户划分为会话。(注意,这里的用户不是 Linux 用户,而是 Shell 或终端代表用户。同一台机器上由同一 Linux 用户登录的两个终端代表 2 个不同的用户,因此这里是 2 个不同的用户会话。一个终端只能是单个会话的控制终端)。
为该“用户”或会话运行 Shell 的进程称为会话领导者。
4. 还请注意,按“x”按钮关闭终端并不会让您退出该终端。该终端仍在后台运行。如果您想从终端结束会话,您必须按 CTRL+D 或退出来从那里注销。
5. 当您从终端注销时,内核会向会话领导者进程发送 SIGHUP 信号(类似于 kill -1)。现在,终端中运行的所有其他进程都是此会话领导者进程的子进程。这些子进程已形成由此会话领导者进程(父进程)控制的进程组。
6. 会话领导进程向每个子进程发送 SIGHUP,一些进程终止,而一些进程可以选择不终止(那些暂停或在后台运行的进程)。那些选择不终止的进程将成为会话结束进程,并立即被 init 进程(linux 机器中所有进程的父进程)收养。
更多内容请参考链接Linux开发过程模型
答案3
我认为每个终端会话都是一个用户会话。您可以在 X 下拥有多个终端,这些终端是虚拟终端,或者您可以在控制台下拥有真实终端。这些都是会话。这是我的“w”
$ w
15:14:13 up 9 days, 6:02, 8 users, load average: 1,03, 1,19, 1,31
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
argento :0 18set13 ?xdm? 2days 1.58s gdm-session-worker [pam/gdm-password]
argento pts/0 18set13 29:26m 5:26 5:26 rdesktop -g 1200x700 -u administrator -p XXXXXXXXX -d DOMAIN -K srv-wsus
argento pts/1 18set13 9days 0.16s 0.16s /bin/bash
argento pts/2 lun10 5.00s 0.09s 7.55s /usr/bin/python /usr/bin/terminator
argento pts/3 14:40 33:41 0.09s 0.03s vim notes.txt
argento pts/4 gio12 26:04m 0.10s 7.55s /usr/bin/python /usr/bin/terminator
argento pts/5 14:56 17:33 0.11s 0.11s /bin/bash
argento tty2 15:11 1:01 0.09s 0.09s -bash
第二列显示 tty,如您所见,pts 是 xterm(虚拟终端),另一个(tty2)是控制台登录。
答案4
出于管理目的,Linux 进程模型允许进程属于会话。换句话说:会话是一组进程组。关系是 1 个会话有 1+ 个进程组,而进程组又有 1+ 个进程。不要将这个会话概念与 systemd 中的会话用法混淆loginctl
。
大多数进程的会话 ID (SID) 值为零,因为它们不是从登录或 ssh 守护进程分支出来的。SID 通常仅在生成 shell 进程时分配。按照惯例,SID 与第一个进程的 PID 匹配,这就是为什么 SID 通常与给定 tty 的 bash PID 相同。
一个会话可能在任何给定时间与 0-1 个 tty 相关联。因此,如果您打开两个终端,这将生成两个新的 bash 进程,每个进程都有自己的 SID。