linux会话session

linux会话

什么是linux session

我们常见的 Linux session 一般是指 shell session。Shell session 是终端中当前的状态,在终端中只能有一个 session。 当我们打开一个新的终端时,总会创建一个新的 shell session。这表明会话是我们和shell交互的一个过程。

就进程间的关系来说,session 由一个或多个进程组组成。一般情况下,来自单个登录的所有进程都属于同一个 session。

会话是由会话中的第一个进程创建的,一般情况下是打开终端时创建的 shell 进程。该进程也叫 session 的领头进程。Session 中领头进程的 PID 也就是 session 的 SID。

$ ps -o pid,ppid,pgid,sid,tty,comm

在这里插入图片描述

总结:session就是一组进程的集合,session id就是这个session中leader的进程ID。

在这里插入图片描述
Session 中的每个进程组被称为一个 job,有一个 job 会成为 session 的前台 job(foreground),其它的 job 则是后台 job(background)。

一般情况下 session 和终端是一对一的关系,当我们打开多个终端窗口时,实际上就创建了多个 session。

Session 的意义在于多个工作(job)在一个终端中运行,其中的一个为前台 job,它直接接收该终端的输入并把结果输出到该终端。其它的 job 则在后台运行。

支持 job control 的 shell 必须能够控制在某一时刻由哪个 job 使用终端。否则,可能会有多个 job 试图同时从终端读取数据,这会导致进程在接收用户输入时的混乱。为了防止这种情况发生,shell 必须按照预定的协议与终端驱动程序协作。

shell 一次只允许一个 job(进程组)访问控制终端。 来自控制终端的某些输入会导致信号被发送到与控制终端关联的 job(进程组)中的所有进程。该 job 被称为控制终端上的前台 job。由 shell 管理的其他 job 在不访问终端的情况下,被称为后台 job。

通常,新的 session 由系统登录程序创建,session 中的领头进程是运行用户登录 shell 的进程。

新创建的每个进程都会属于一个进程组,当创建一个进程时,它和父进程在同一个进程组、session 中。

将进程放入不同 session 的惟一方法是使用 setsid 函数使其成为新 session 的领头进程。这还会将 session 领头进程放入一个新的进程组中。

当 session 中的所有进程都结束时 session 也就消亡了。

session 与终端的关系

如果 session 关联的是伪终端,这个伪终端本身就是随着 session 的建立而创建的,session 结束,那么这个伪终端也会被销毁。

如果 session 关联的是 tty1-6,tty 则不会被销毁。因为该终端设备是在系统初始化的时候创建的,并不是依赖该会话建立的,所以当 session 退出,tty 仍然存在。

系统的进程管理不允许有脱单的进程,即任何进程都必须要属于某个组,某个会话。

会话是由多个进程组构成的,进程组是由多个进程构成的。

一个 session 可以有一个控制终端, 通俗意义讲我们 ssh 远程连接到终端, 其实就是创建了一个终端. 但是一个 session 中最多只能有一个进程组在前台运行, 也就是连接上终端后对你的终端输入输出进行管控的那个进程组. 但我们在终端敲入一个中断信号的符号时, e.g. Ctrl+c, 这个中断信号就会发送给这个进程组的所有进程成员。

每一个进程都隶属于独一无二的进程组中. 当子进程创建后, 与父进程就同属于一个进程组中, 进程组用进程组 ID 进行识别.

启动deamon进程,这类进程需要和父进程划清界限,所以需要启动一个新的session。

进程组组长

  • 每个进程除了有一进程ID之外,还属于一个进程组
  • 进程组是一个或多个进程的集合
  • 每个进程组有一个组长进程。组长进程的进程组ID等于其进程ID
  • 进程组组长可以创建一个进程组,创建该组中的进程,然后终止
  • 只要在某个进程组中有 一个进程存在,则该进程组就存在,这与其组长进程是否终止无关
  • 进程组组长可以使用setpgid函数创建

每个进程组有一个唯一的进程组ID。进程组ID是一个正整数,用pid_t数据类型表示

getpgrp函数
功能:返回调用该函数的进程的进程组ID

getpgid函数
功能:返回参数pid进程的进程组ID
如果参数为0,则返回调用此函数的进程组ID。此时getpgid(0)函数等同于getpgrp()函数

获取会话首进程的进程组ID(getsid函数)

  • Single UNIX Specification只说明了会话首进程,而没有会话ID这个概念
  • 所以,可以将会话首进程的进程ID视为会话ID
  • 功能:getsid函数返回参数所指向的进程所在的会话的会话首进程的进程组ID(因为会话首进程总是一个进程组的组长,所以返回的进程组ID与首进程ID是相同的)
  • 通常:一个进程的会话ID是登录shell的ID(登录shell是一个会话的会话首进程 )

nohup

Linux session(会话)
参考URL: https://www.cnblogs.com/sparkdev/p/12146305.html

如果我们在 session 中执行了 nohup 等类似的命令,当 session 消亡时,相关的进程并不会随着 session 结束,原因是这些进程不再受 SIGHUP 信号的影响。

如果我们在 session 中执行了 nohup 等类似的命令,当 session 消亡时,相关的进程并不会随着 session 结束,原因是这些进程不再受 SIGHUP 信号的影响。

setsid

Linux session(会话)
参考URL: https://www.cnblogs.com/sparkdev/p/12146305.html

setsid 会创建一个新的 session,它的目的是让进程在后台执行命令,实现方式就是让命令进程运行在一个新的与终端脱离的 session 中。看下面的示例:

setsid 会创建一个新的 session,它的目的是让进程在后台执行命令,实现方式就是让命令进程运行在一个新的与终端脱离的 session 中。

当一个进程通过调用 setsid 成为一个新的 session 领头进程时,它会与控制终端断开连接。

会话相关常用命令

使用tty命令,查看本会话的会话号:

[root@dev workspace]# tty
/dev/pts/0
[root@dev workspace]#

使用w 命令,查看当前有哪些会话登录在服务器上。

[root@dev workspace]# w
 17:34:57 up 5 days,  6:43,  1 user,  load average: 0.00, 0.01, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    121.19.37.12    17:23    1.00s  0.03s  0.00s w
[root@dev workspace]#

打印sid

ps -o pid,ppid,pgid,sid,comm

在ssh会话中查找客户机的IP地址

  1. 检查是否存在名为:
    $SSH_CLIENT 或 $SSH_CONNECTION
$ echo $SSH_CLIENT | awk '{ print $1}'
1.2.3.4
$ echo $SSH_CONNECTION | awk '{print $1}'
1.2.3.4
  1. pinky 命令
    您可以使用以下命令:
    Pinky将显示所有登录用户,而不仅仅是您自己。
pinky

参考

APUE第9章 进程关系、进程组、会话
参考URL: https://www.jianshu.com/p/ebe67c991394
Linux session(会话)
参考URL: https://www.cnblogs.com/sparkdev/p/12146305.html
What is the definition of a “session” in linux?
Linux session和进程组概述
Job Control
Linux TTY/PTS概述
setsid source code
Linux session和进程组概述
参考URL: https://segmentfault.com/a/1190000009152815
Linux——会话(session)
参考URL: https://blog.csdn.net/shenmingxueIT/article/details/108130764

<think>好的,我现在需要帮助用户理解Linux中的会管理、登录shell和session的相关概念。首先,用户提到的引用资料里涵盖了会、进程组、会首进程等基本概念,我需要先梳理这些核心点。 根据引用[4],会期是由一个或多个进程组组成的集合,会ID是首进程的ID。这里的关键是会与进程组的关系,以及会首进程的作用。接着,引用[1]中的APUE第9章可能详细解释了进程组和会的关系,需要确认会是如何被创建和管理的,比如通过setsid系统调用。另外,用户提供的脚本示例(引用[2])展示了如何通过tty终止用户会,这涉及到实际操作中的会管理。 接下来,我需要明确几个概念:登录shell、会、控制终端。用户可能想知道如何创建新会,比如使用setsid命令或daemon进程。此外,作业控制(Job Control)与会的关系,比如前台和后台进程组的切换,这也是会管理的一部分。 然后要考虑用户可能遇到的问题,比如如何查看当前会,使用ps命令查看SID,或者使用w命令查看登录的用户和他们的tty。另外,会的生命周期,比如当终端断开时,会中的进程可能会收到SIGHUP信号,如何处理这种情况,可以使用nohup或disown。 还有引用[3]提到的窗口会管理工具,用户可能对图形界面下的会管理感兴趣,比如保存和恢复窗口布局。这部分可能需要简要说明,但用户的问题主要关注命令行层面的会管理。 现在需要将这些信息组织成结构化的回答,分点解释基本概念、管理操作和实际应用。确保每个部分都引用正确的来源,比如定义部分引用[4],创建会引用[1]中的setsid,终止会引用[2]的脚本示例等。 还要注意用户可能对如何实际操作系统会有疑问,比如创建、终止、查看会,以及会与任务控制的关系。需要提供具体的命令示例,如使用setsid启动新会,使用pkill终止会等。 最后,生成的相关问题要围绕用户可能进一步询问的点,比如会与进程组的区别,守护进程与会的关系,如何防止会终止导致进程退出等。确保问题覆盖用户可能深入的方向。</think>### Linux管理详解 #### 一、基本概念 1. **会Session)** 会是一个或多个**进程组**的集合,每个会有唯一的**会ID(SID)**,由会首进程(Session Leader)的PID决定[^4]。会通常与一个**控制终端(tty/pts)**关联,用于管理用户输入和输出。 2. **登录Shell** 用户登录系统时启动的第一个进程,如`bash`或`zsh`。它作为会首进程,负责创建和管理会中的进程组[^1]。例如: ```bash $ ps -o pid,ppid,pgid,sid,tty,comm PID PPID PGID SID TT COMMAND 1234 1 1234 1234 pts/0 bash # 登录Shell(会首进程) ``` 3. **进程组(Process Group)** 一组相关进程的集合,共享相同的**进程组ID(PGID)**。例如,管道命令`ls | grep .sh`会创建一个包含`ls`和`grep`的进程组。 #### 二、会管理操作 1. **创建新会** - 通过`setsid`命令或系统调用创建独立会(脱离原控制终端): ```bash $ setsid my_daemon # 创建守护进程 ``` - 代码示例(C语言): ```c if (fork() == 0) { // 子进程 setsid(); // 创建新会 // 守护进程逻辑 } ``` 2. **查看会信息** - 显示当前会ID: ```bash $ echo $$ # 当前Shell的PID(即SID) $ ps -p $$ -o sid # 显式查看SID ``` - 列出所有活跃会: ```bash $ w # 显示用户、tty和会[^2] ``` 3. **终止会** - 通过控制终端关闭(如SSH断开)会发送`SIGHUP`信号,默认终止会内进程。 - 手动终止会(引用脚本[^2]): ```bash # 终止所有用户会 usession=$(w | awk 'NR>2{print $2}') for tty in $usession; do pkill -9 -t $tty; done ``` #### 三、实际应用场景 1. **守护进程** 通过脱离会实现后台运行: ```bash $ setsid my_program > /dev/null 2>&1 & ``` 2. **终端复用(tmux/screen)** 创建持久会避免进程因断连终止: ```bash $ tmux new -s my_session # 新建tmux会 $ screen -S my_task # 新建screen会 ``` 3. **作业控制(Job Control)** 管理前台/后台进程组: ```bash $ sleep 60 & # 后台运行 $ fg %1 # 切换到前台 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值