深入理解Linux进程组和会话:从概念到实践

3、Linux进程组和会话相关命令4、实践演示在Linux系统中,可以查看当前系统运行所有程序以及它们所属于哪些PGID和SID:Linux进程组和会话相关命令在Linux环境下。

在Linux系统中,进程是操作系统中最基本的执行单位。每个进程都有一个唯一的PID(Process ID),用于标识该进程。但是,在实际应用中,我们经常需要将多个相关联的进程组合成一个整体来进行管理和控制。这就是Linux进程组和会话的概念。

什么是Linux进程组?

Linux进程组(Process Group)指的是一组相关联的子进程,它们共享同一个PGID(Process Group ID)。每个PGID都由一个非负整数来表示,且与其中任意一个子进程的PID相同。当我们对某个父级或者顶级Shell发送信号时,这些信号将被发送到该父级或顶级Shell所在的所有子孙级别上。

通过命令“ps -o pid,pgid,cmd”可以查看当前系统运行所有程序以及它们所属于哪些PGID:

如上图所示,当前系统中有3个进程组,它们的PGID分别为1、2和3。

什么是Linux会话?

Linux会话(Session)是一个或多个进程组的集合。每个会话都有一个唯一的SID(Session ID),用于标识该会话。当我们启动一个新的Shell时,它将成为一个新的进程组,并且该进程组将成为一个新的会话。在同一台机器上登录多次或者通过SSH连接到另一台机器上时,每次登录都将创建一个新的会话。

通过命令“ps -o pid,pgid,sid,cmd”可以查看当前系统运行所有程序以及它们所属于哪些PGID和SID:

如上图所示,当前系统中有两个会话,其中第一个包含了PGID为1、2和4 的三个子进程;第二个包含了PGID为5和6 的两个子进程。

Linux进程组和会话相关命令

在Linux环境下,我们可以使用以下命令来管理和控制进程组和会话:

1. jobs:查看当前Shell中的作业列表。

2. fg:将后台作业切换到前台运行。

3. bg:将前台作业转换为后台运行。

4. kill -SIGCONT PID:恢复一个被暂停的进程或者进程组。

5. kill -SIGSTOP PID:暂停一个正在运行的进程或者进程组。

6. setsid command arg1 arg2… :创建一个新会话,并在其中执行指定命令。此时,该命令所在的进程将成为新会话中唯一的成员,并且其PID、PGID和SID都相同。如果该命令是Shell,则该Shell也将成为新会话中唯一的成员,从而脱离原来所属于的任何会话和终端。

实践演示

我们可以通过以下步骤来演示Linux进程组和会话相关操作:

1. 打开终端窗口,并输入以下命令:

“`

$ sleep 300 &

这个命令启动了一个名为“sleep”的程序,并让它在后台休眠300秒钟。由于没有指定输出文件或重定向标准输出流,因此该程序不产生任何输出信息并立即返回到终端提示符下。同时,在启动这个程序时,Bash shell自动分配了一个PID给它(假设该PID为1234)。

2. 再次输入以下命令:

$ jobs

深入理解Linux进程组和会话:从概念到实践

这个命令将显示当前Shell中的作业列表。由于我们刚才启动的“sleep”程序在后台运行,因此它应该在列表中显示出来:

[1]+ Running sleep 300 &

其中,“[1]”表示该作业编号为1,“+”表示它是当前正在运行的作业,“Running”表示它正在执行“sleep 300 &”这个命令。

3. 输入以下命令:

$ fg %1

这个命令将把编号为1的后台进程切换到前台运行。由于该程序没有产生任何输出信息,因此我们看不到任何变化。但是,终端窗口现在已经被占用了,并且只有等待程序执行完毕或者按下Ctrl-C键中断程序才能够回到终端提示符下。

4. 按下Ctrl-C键,或者等待一段时间后再按下Ctrl-Z键(暂停进程),可以使得程序退出并返回到Shell提示符下。

5. 输入以下命令:

$ sleep 600 &

[2] 4567

这个命令启动了另一个名为“sleep”的程序,并让它在后台休眠600秒钟。同样地,Bash shell自动分配了一个PID给它(假设该PID为4567)。

6. 输入以下命令:

[1]- Done sleep 300

[2]+ Running sleep 600 &

这个命令将显示当前Shell中的作业列表。由于我们刚才启动的“sleep”程序在后台运行,因此它应该在列表中显示出来。注意到,编号为1的作业已经结束,并且标记为“Done”。

7. 输入以下命令:

$ bg %2

这个命令将把编号为2的前台进程转换为后台运行。由于该程序没有产生任何输出信息,因此我们看不到任何变化。

8. 再次输入以下命令:

这个命令将显示当前Shell中的作业列表。由于我们刚才启动的“sleep”程序在后台运行,因此它应该在列表中显示出来,并且标记为正在运行(Running)。

Linux进程组和会话是Linux系统管理和控制多个相关联进程最常用、最基本、也是最重要的机制之一。理解了其概念和使用方法能够帮助开发人员更好地管理系统资源、提高系统稳定性、保证数据安全性等方面