我正在尝试编写一个包装器,它将作为会话领导者执行一个脚本。
我对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报告到所有相关命令。
setsid
增加一个额外的标志,比如-w
,只有在存在子进程时它才会等待。目前它的行为不一致:仅当它由组长运行(并且fork)时,它才会立即返回。另外,正如你所说,只有setsid
可以等待其子进程,调用者的bash
无法等待孙子进程。 - Matei Davidfork
操作有点奇怪。我想我的大学操作系统教授不会批准这样做。:-P - ruakh-w
选项),这是您在四年后编写的上面评论中建议添加的内容。我错过了什么? - Piotr Dobrogost