会话和组不是一回事。让我们把事情弄干净:
一个会话由一个或多个进程组组成,并且可以有一个控制终端。当会话有一个控制终端时,该会话在任何时候都只有一个前台进程组和一个或多个后台进程组。在这种情况下,前台进程组中的每个进程都可以看到所有终端生成的信号和输入。
此外,当会话具有控制终端时,shell 进程通常是会话领导者,指示哪个进程组是前台进程组(隐含地使其他组成为后台进程组)。组中的进程通常由线性管道放置在那里。例如,ls -l | grep a | sort 通常会创建一个新的进程组,其中ls、grep 和sort 存在。
支持作业控制的 Shell(也需要内核和终端驱动程序的支持),例如 bash,为每个调用的命令创建一个新的进程组——如果你调用它在后台运行(使用& 表示法),该进程组未获得终端的控制权,shell 将其设为后台进程组(而前台进程组仍然是 shell)。
因此,如您所见,在这种情况下,您几乎肯定不想创建会话。您想要创建会话的典型情况是,如果您正在守护进程,但除此之外,创建新会话通常没有多大用处。
您可以将脚本作为后台作业运行,正如我所提到的,这将创建一个新的进程组。由于fork() 继承了进程组ID,因此脚本执行的每个进程都将在同一个组中。例如,考虑这个简单的脚本:
#!/bin/bash
ps -o pid,ppid,pgid,comm | grep ".*"
这会打印如下内容:
PID PPID PGID COMMAND
11888 11885 11888 bash
12343 11888 12343 execute.sh
12344 12343 12343 ps
12345 12343 12343 grep
如您所见,execute.sh、ps 和 grep 都在同一个进程组(PGID 中的值)。
所以你想要的只是:
/path/to/myscript &
然后你可以用ps -o pid,ppid,pgid,comm | grep myscript查看myscript的进程组ID。要向组发送信号,请将其发送给组长(PGID 是组长的PID)。发送到组的信号会传递给该组中的每个进程。