我正在嘗試編寫一個將執行腳本作爲會話負責人的包裝器。 我對linux命令setsid
的行爲感到困惑。考慮這個劇本,叫test.sh
:linux命令setsid
#!/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報告給所有相關的命令。
你說得對。我想知道是否值得提議'setsid'帶上一個額外的標誌,例如'-w',如果有的話,它應該等到它的孩子出現在那兒。事實上,我覺得它的行爲是不一致的:當且僅當它由組長領導(並且分叉)時它立即返回。另外,就像你說的,只有'setsid'可以等待它的孩子,調用的'bash'不能等待一個孫子。 – 2012-03-19 13:14:04
是的;一般來說,沒有「等待」的「fork」有點奇怪。我不認爲我的大學操作系統教授會批准。 :-P – ruakh 2012-03-19 13:21:52