gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:00:02 25 4
gpt4 key购买 nike

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

最佳答案

要在新进程组中从命令提示符运行命令,例如“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

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

  • 您可以使用“&”将其设置为背景:

    setsid emacs xxx.txt &

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

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

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

  1. bash fork 子进程 1,将其保留在 bash 的进程组中
  2. 子 1 执行人设置 ID
  3. child 1 getsid 发现它不是组长,因此调用setsid 系统调用(这会创建新 session 并为子进程 1 提供一个新进程组)然后执行内部setsid
  4. 内部setsid看到它是组长,所以 fork 子2,子1退出
  5. 子进程 2 发现它不是组组长,因此调用setsid系统调用(这会创建一个新的 session 并为子进程 2 提供一个新的进程组),然后执行emacs

脚本内,如果您想要与命令通信并等待其退出,请参阅 bash 联机帮助页中的 subprocess。

关于linux - 如何通过在 BASH 中使用新进程组 ID 在 Linux 上生成进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22160196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com