input di processo in background


14

se voglio visualizzare "aaa" sullo schermo:

(1)$: echo aaa | cat                 ... works OK
(2)$: echo aaa | ( cat )             ... works OK
(3)$: echo aaa | ( cat & )           ... NOT working
(4)$: ( echo aaa & ) | cat           ... works OK 
(5)$: echo aaa | ( cat <&0 & )       ... works ok in BASH (but not in SH)
(6)$: echo aaa | ( cat <&3 & ) 3<&0  ... works ok in BASH and SH

la congregazione da (3) e (4) -> il processo separato ha ancora un output collegato che può essere controllato, usato, reindirizzato ..., ma non input!

La mia domanda è: qualcuno capisce perché e come funziona la linea (5) ???

... "<& 0" è l'abbreviazione di "0 <& 0", perché il reindirizzamento da 0 a 0 è una soluzione e ciò che accade realmente dietro l'input di un processo distaccato. I subshell non sono il problema, usare le parentesi graffe {...} anziché (...) fornisce gli stessi risultati.

... e domanda2: esiste una soluzione migliore per "dare input al processo distaccato" rispetto alla riga (6).

Risposte:


12

Sì, come richiesto da POSIX , i comandi avviati in background &vengono reindirizzati all'input standard /dev/null.

E senza dubbio

{ cmd <&3 3<&- & } 3<&0

è il modo più ovvio per aggirare il problema.

Tuttavia, non è chiaro il motivo per cui si desidera eseguire parte della pipeline in background.


la ragione era ottenere PID di un comando specifico all'interno della catena di tubi (cmd1 | {cmd2 &; pid2 = $ !;} | cmd3 ..., quindi / dev / null == & 0 è standard per i processi BG, sai anche perché "0 <& 0" funziona in bash ... ed è sicuro?
Asain Kujovic

3
@OmerMerdan POSIX dice In tutti i casi, il reindirizzamento esplicito dell'input standard avrà la precedenza su questa attività , che contraddice in qualche modo ciò che ha detto sopra, quindi credo che la bashinterpreti (e che sembri un'interpretazione ragionevole) come annullare il /dev/nullreindirizzamento. Ora, non molte shell fanno lo stesso. Ash e Pdksh no.
Stéphane Chazelas,

Perché è 3<&-necessario il componente ed è sicuro utilizzarlo (non chiuderà il tubo prima che venga letto l'intero input)?
mvorisek,

1
@Mvorisek, che fd 3 viene utilizzato solo temporaneamente per ripristinare lo stdin originale. Lo chiudiamo perché cmdnon è necessario. Lo chiudiamo dopo averlo duppato su fd 0 ( <&3abbreviazione di 0<&3).
Stéphane Chazelas,

1
@Mvorisek, nohupreindirizza anche stdin a / dev / null, in modo da avreste bisogno di: { nohup sh -c 'cmd <&3 3<&-' & } 3<&0. Oppure(trap '' HUP; cmd <&3 3<&- > nohup.out 2>&1 &) 3<&0
Stéphane Chazelas il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.