Я пытаюсь написать оболочку, которая будет выполнять скрипт в качестве лидера сеанса.
Меня смущает поведение команды 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 ко всем соответствующим командам.