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

时间:2014-03-04 00:02:35

标签: linux unix

任何人都可以建议,如何在BASH unix shell中使用新进程组ID在linux上生成新进程? 非常感谢你!

1 个答案:

答案 0 :(得分:3)

在新流程组中运行命令,例如“emacs xxx.txt”,从命令提示符 ,即以交互方式运行:

setsid emacs xxx.txt &

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

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

setsid setsid emacs xxx.txt

......理由是:

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

    setsid emacs xxx.txt

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

  • 您可以使用'&'来对其进行背景:

    setsid emacs xxx.txt&

    ...但是这会留下一个竞争条件,其中调用脚本可能会在后台进程到达setsid更改进程组(可能会终止子进程)之前退出

  • 所以我们要等待进程组更改发生;嵌套的setsid保证fork,因为 外部setsid不是进程组领导者,并且已经有外部setsid
  • 设置的新进程组ID

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

  1. bash forks child 1,将其留在bash的进程组中
  2. child 1 execs setsid
  3. child 1 setsid看到它不是组长,所以调用setsid系统调用 (创建新会话并为子1提供新进程组) 然后执行内部setsid
  4. 内部setsid看到它是一个组长,所以分叉子2,孩子1 退出
  5. 子2看到它不是组长,所以调用setsid系统调用(创建 一个新的会话,给孩子2一个新的进程组)然后执行 emacs的
  6. 从脚本中的 ,如果您想与命令通信并等待它退出,请参阅bash联机帮助页中的subprocess。