2014-03-04 6 views
3

Может ли кто-нибудь посоветует, как создать новый процесс на Linux, используя новый идентификатор группы процессов в оболочке UNIX от UNIX? Большое вам спасибо!Как обработать процесс на linux с помощью нового идентификатора группы процессов в BASH

+0

Возможный дубликат [linux command setsid] (http://stackoverflow.com/questions/9677306/linux-command-setsid) –

ответ

3

Чтобы выполнить команду, например «Emacs xxx.txt», в новой группе процессов, из командной строки т.е. в интерактивном режиме:

setsid emacs xxx.txt & 

Как описано в «командной setsid Linux» связаны между собой, поведение команды setsid может быть неожиданным (и в Linux, который я использую, теперь man-страница вообще не помогает). Так что ...

Если вы хотите, чтобы породить команду из сценария и иметь команду продолжить после того, как скрипт завершает, двойной setsid:

setsid setsid emacs xxx.txt 

... Рассуждение :

  • когда Баш вызывает setsid во время сценария, setsid сохраняет процесс группового идентификатора процесса интерпретатора Баша, и так:

    setsid emacs xxx.txt

    ... блоки (см. Связанную статью). Но это установить новую группу процессов перед запуском Emacs

  • вы можете фоне его '&':

    setsid Emacs xxx.txt &

    ...но это оставляет условие гонки, когда вызывающий скрипт может выйти до того, как фоновый процесс достигнет точки, в которой setsid изменяет группу процессов (что может убить подпроцесс)

  • , поэтому мы хотим дождаться изменения группы процессов ; вложенная setsid гарантированно раскошелиться, потому что внешний setsid не является лидером группы процессов, и уже есть новый идентификатор группы процесса установки наружной setsid

т.е. когда мы удваиваем setsid последовательность такова:

  1. Баш вилы ребенок 1, оставляя его в группе процессов BASh в
  2. ребенок 1 Execs setsid
  3. ребенка 1 setsid видят это не является лидер группы, и поэтому вызывает setsid системного вызова (что создает новую сессию и дает ребенок 1 новый групповой процесс) , а затем EXECS внутреннего setsid
  4. внутренний setsid видит является лидером группы, так вилы ребенок 2, ребенок 1 выходит
  5. ребенок 2 видит, что это не лидер группы так называет setsid системного вызова (который создает новый сеанс и дает ребенку 2 новый процесс группы), а затем EXECS Emacs

от в сценарии, если вы хотите общаться с командой и ждать его, чтобы выйти из, см. подпроцесс в man-странице bash.