Sto provando a scrivere un wrapper che eseguirà uno script come leader di sessione. Sono confuso dal comportamento del comando linux setsid
. Considerate questo script, chiamato test.sh
:comando 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
L'uscita varia a seconda se è eseguito o di provenienza:
$ 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
Quindi, mi sembra che setsid
restituisce immediatamente quando lo script è di provenienza, ma aspetta il suo bambino quando viene eseguito lo script. Perché la presenza di un terminale di controllo non ha nulla a che fare con setsid
? Grazie!
Modifica: per chiarimenti, ho aggiunto pid/ppid/sid a tutti i comandi pertinenti.
Hai ragione. Mi chiedo se valga la pena di proporre che 'setsid' prenda una bandiera in più, diciamo' -w', sulla cui presenza dovrebbe aspettare il suo bambino se ce n'è uno. Così com'è, sento che il suo comportamento è incoerente: ritorna immediatamente se e solo se è gestito da un capogruppo (e si biforca). Inoltre, come dici tu, solo 'setsid' può aspettare il suo bambino, il bash di invocazione non può aspettare un nipotino. –
Sì; e, in generale, è un po 'strano "fork" senza "wait'ing". Non credo che il mio professore di Sistemi operativi universitari avrebbe approvato. :-P – ruakh