linux command setsid

Я пытаюсь написать оболочку, которая будет выполнять скрипт в качестве лидера сеанса. Меня смущает поведение команды linux setsid. Рассмотрим этот скрипт с именем test.sh:

#!/bin/bash
SID=$(ps -p $$ --no-headers -o sid)
if [ $# -ge 1 -a $$ -ne $SID ] ; then
  setsid bash test.sh
  echo pid=$$ ppid=$PPID sid=$SID parent
else
  sleep 2
  echo pid=$$ ppid=$PPID sid=$SID child
  sleep 2
fi

Вывод различается в зависимости от того, выполняется ли он или получен из источника:

$ bash
$ SID=$(ps -p $$ --no-headers -o sid)
$ echo pid=$$ ppid=$PPID sid=$SID
pid=9213 ppid=9104 sid= 9104
$ ./test.sh 1 ; sleep 5
pid=9326 ppid=9324 sid= 9326 child
pid=9324 ppid=9213 sid= 9104 parent
$ . ./test.sh 1 ; sleep 5
pid=9213 ppid=9104 sid= 9104 parent
pid=9336 ppid=1 sid= 9336 child
$ echo $BASH_VERSION 
4.2.8(1)-release
$ exit
exit

Итак, мне кажется, что setsidвозвращается немедленно сценарий получен, но он ожидает своего потомка, когда сценарий выполняется. Почему присутствие контролирующего tty должно иметь какое-то отношение к setsid? Спасибо!

Редактировать: Для уточнения я добавил отчеты pid/ppid/sid ко всем соответствующим командам.

12
задан Matei David 13 March 2012 в 04:02
поделиться