如何通过在 BASH 中使用新的进程组 ID 在 linux 上生成进程

use*_*989 5 unix linux

任何人都可以请教,如何通过在 BASH unix shell 中使用新的进程组 ID 在 linux 上生成一个新进程?非常感谢!

Tre*_*lor 6

要在新进程组中运行命令,例如“emacs xxx.txt”,从命令提示符(即交互):

setsid emacs xxx.txt &
Run Code Online (Sandbox Code Playgroud)

如链接的“linux 命令setsid”中所述,setsid 命令的行为可能令人惊讶(在我刚刚使用的 linux 中,联机帮助页根本没有帮助)。所以...

如果要从脚本中生成命令并在脚本退出后继续执行命令,请将 setid 加倍:

setsid setsid emacs xxx.txt
Run Code Online (Sandbox Code Playgroud)

……理由是:

  • 当 bash 在脚本期间调用 setid 时,setsid 会保留 bash 解释器进程的进程组 ID,因此:

    setsid emacs xxx.txt

    ...块(见链接的文章)。但它确实在运行 emacs 之前设置了一个新的进程组

  • 你可以用'&'作为背景:

    setsid emacs xxx.txt &

    ...但这留下了一个竞争条件,其中调用脚本可能会在后台进程到达 setid 更改进程组的点之前退出(这可能会杀死子进程)

  • 所以我们要等待进程组更改发生;嵌套的 setid 保证会分叉,因为外部 setid 不是进程组领导,并且已经有一个由外部 setid 设置的新进程组 ID

即当我们将 setsid 加倍时,序列是:

  1. bash 派生子 1,将其留在 bash 的进程组中
  2. child 1 execs setsid
  3. child 1 setsid 认为它不是组长,因此调用 setsid 系统调用(它创建新会话并为 child 1 提供一个新的进程组),然后执行内部 setid
  4. 内部setsid看到它是组长,所以forks child 2,child 1退出
  5. child 2 看到它不是组长所以调用 setsid 系统调用(它创建一个新会话并给 child 2 一个新的进程组)然后执行 emacs

脚本中,如果你想用命令传达并等待它退出,看到的bash手册页子。