我正在尝试编写一个将执行脚本作为会话负责人的包装器。 我对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