GNU/Linux >> Linux Esercitazione >  >> Linux

Come non fare nulla per sempre in modo elegante?

Ho un programma che produce informazioni utili su stdout ma legge anche da stdin . Voglio reindirizzare il suo output standard su un file senza fornire nulla sullo standard input. Fin qui tutto bene:posso fare:

program > output

e non fare nulla in tty.

Tuttavia, il problema è che voglio farlo in background. Se lo faccio:

program > output &

il programma verrà sospeso ("sospeso (tty input)").

Se lo faccio:

program < /dev/null > output &

il programma termina immediatamente perché raggiunge EOF.

Sembra che ciò di cui ho bisogno sia un pipe in program qualcosa che non fa nulla per un periodo di tempo indefinito e non legge stdin . I seguenti approcci funzionano:

while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &

Tuttavia, questo è tutto molto brutto. Ci ha essere un modo elegante, usando le utilità standard di Unix, per "non fare nulla, indefinitamente" (per parafrasare man true ). Come potrei raggiungere questo obiettivo? (I miei criteri principali per l'eleganza qui:niente file temporanei; niente attese o risvegli periodici; niente utilità esotiche; il più breve possibile.)

Risposta accettata:

Nelle shell che li supportano (ksh, zsh, bash4), puoi avviare program come co-processo.

  • ksh :program > output |&
  • zsh , bash :coproc program > output

Questo avvia program in background con il suo input reindirizzato da una pipe . L'altra estremità del tubo è aperta al guscio.

Tre vantaggi di questo approccio

  • nessun processo aggiuntivo
  • puoi uscire dallo script quando program muore (usa wait ad aspettarlo)
  • program terminerà (ottenere eof sul suo stdin se la shell esce).

Linux
  1. Come salvare l'output dei comandi in un file in Linux

  2. Come ordinare l'output per dimensione?

  3. Come reindirizzare l'output di un programma su un file zip?

  4. Come fa un programma a decidere se avere o meno stampe a colori?

  5. Chiusura dell'output standard (>&-)?

Procedura:Introduzione alla programmazione – Controllo del flusso

Modi brillanti su come eseguire un programma in Linux

Come scrivere ed eseguire un programma C in Linux

Come posso ordinare du -h output per dimensione

Come eseguire il grep dell'output di ps con le intestazioni

Come interrompere l'output del ping?