Estoy tratando de escribir un contenedor que ejecutará un script como líder de la sesión. Estoy confundido por el comportamiento del comando de Linux setsid
. Considere este script, llamado test.sh
:comando de 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
La salida varía en función de si se ejecuta o de origen:
$ 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
Por lo tanto, me parece que setsid
vuelve inmediatamente cuando el guión es de origen, pero espera a su hijo cuando se ejecuta el script. ¿Por qué la presencia de una tty controladora tiene algo que ver con setsid
? ¡Gracias!
Editar: Para aclarar, agregué el informe pid/ppid/sid a todos los comandos relevantes.
Tienes razón. Me pregunto si valdría la pena proponer que 'setsid' tome una bandera extra, digamos' -w', en cuya presencia debería esperar a su hijo si hay uno. Tal como están las cosas, creo que su comportamiento es inconsistente: regresa inmediatamente si y solo si es dirigido por un líder de grupo (y se bifurca). Además, como dices, solo 'setsid' podría esperar a su hijo, la invocación' bash' no puede esperar a un nieto. –
Sí; y solo en general, es un poco extraño "tenedor" sin "esperar". No creo que mi profesor de Sistemas Operativos de la universidad lo haya aprobado. :-PAG – ruakh