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]# w17: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地址
- 检查是否存在名为:
$SSH_CLIENT 或 $SSH_CONNECTION
$ echo $SSH_CLIENT | awk '{ print $1}'
1.2.3.4
$ echo $SSH_CONNECTION | awk '{print $1}'
1.2.3.4
- 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