簡體   English   中英

如何使用BASH中的新進程組ID在linux上生成進程

[英]How to spawn process on linux by using new process group id in BASH

任何人都可以建議,如何在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

    ...塊(參見鏈接文章)。 但它確實在運行emacs之前設置了一個新的進程組

  • 你可以用'&'來背景:

    setsid emacs xxx.txt&

    ...但是這會留下一個競爭條件,其中調用腳本可能會在后台進程到達setsid更改進程組(可能會終止子進程)之前退出

  • 所以我們要等待進程組的更改發生; 保證嵌套的setsid是fork,因為外部的setsid不是進程組的負責人,並且已經有外部setsid設置的新進程組ID

即當我們將setsid加倍時,序列是:

  1. bash forks child 1,將它留在bash的進程組中
  2. 孩子1個高管
  3. child 1 setsid看到它不是組長,因此調用setsid系統調用(創建新會話並為子1提供一個新進程組)然后執行內部setsid
  4. 內部setid看到它是一個組長,所以分叉子2,孩子1退出
  5. 子2看到它不是組長,所以調用setsid系統調用(創建一個新的會話並給孩子2一個新的進程組)然后執行emacs

在腳本中 ,如果要與命令通信並等待它退出 ,請參閱bash聯機幫助頁中的subprocess。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM