2012-01-28 9 views
8

Grazie! La mia base: ho avviato un lungo processo di "configurazione" interattivo (diciamo sotto "schermata"), e ho realizzato che ho sempre bisogno di rispondere "no" finché non vedo una determinata parola chiave. Sembra una perdita di tempo per farlo a mano (per non dire che posso facilmente perdere la parola chiave ..)Cattura STDIN/STDERR/STDOUT di un processo DOPO che è stato avviato, utilizzando la riga di comando?

Così sembra che io voglia pipe (una copia di) STDERR/STDOUT su un filtro, e anche essere in grado di iniettare nello STDIN di un processo (console), DOPO che è stato avviato, utilizzando la riga di comando? Esiste una soluzione pronta?

I seguenti strumenti sembrano aiutare. Per acquisire l'output, utilizzare

strace -ewrite -p $PID 

Non è pulito (mostra righe come: scrivere (#,)), ma funziona! Ma dice handle UTF8 correttamente?

per reindirizzare l'output, fare qualcosa di simile

printf '..input..' >/dev/pts/33 

ma non è chiaro come trovare il giusto dispositivo ..

+0

È necessario aggiungere la risoluzione come risposta e accettarla. – Daenyth

risposta

6

risolto in Linux (apparentemente Linux-specifico):

reptyr -s PID 

attribuisce un processo ad un altro terminale e/o espone input e output come tubi.

1

Perché vuoi fare questo ??

Non è possibile in modo Posix-ly portatile! Forse /proc/1234/fd/0 e /proc/1234/fd/1 e /proc/1234/fd/3 pseudo-file (per il processo 1234) potrebbero essere una brutta possibilità! E anche quello potrebbe non funzionare in alcuni casi (ad esempio per i tubi).

In particolare, ritengo che la semantica di SIGPIPE inviati al processo se nessuno sta leggendo un tubo sarebbe rotto ...

E non credo che si sarebbe in grado di mantenere la pseudo- qualità tty di es stdout.

Quindi, in sostanza, è meglio trovare un modo diverso per raggiungere i tuoi obiettivi generali, che non hai spiegato esplicitamente.

Se il tuo caso d'uso è uno strano script configure, puoi riavviarlo e alimentarlo con un tuo script personale (in shell, python, perl, ecc ...). Non perdere tempo per provare a prendere un processo esistente configure, basta riavviarlo in modo appropriato.

sguardo anche al comando screen (e come viene implementato!)

+0

Grazie! La mia base: ho avviato un lungo processo di "configurazione" interattivo (diciamo sotto "schermata"), e ho realizzato che devo rispondere "no" –

+0

Grazie! La mia base: ho avviato un lungo processo di "configurazione" interattivo (diciamo sotto "schermata"), e ho realizzato che ho sempre bisogno di rispondere "no" finché non vedo una determinata parola chiave. Sembra una perdita di tempo per farlo a mano (per non dire che posso facilmente perdere la parola chiave ..) –

+0

Grazie ancora! Il mio punto è che a volte sarebbe molto utile essere in grado di farlo, con qualsiasi processo; 'configure' è solo un esempio ... 'screen' può fare qualcosa del genere, ma non del tutto: puoi filtrare (: exec! .. | less) sia input che output, ma non entrambi. Sembra che io debba scrivere il mio script allora .. –

3

Questo è possibile, ma non è abbastanza.Il processo è il seguente:

  1. uso gdb per connettersi al processo già in esecuzione
  2. corsa p close(<fd>) dove <fd> è il descrittore di file che si desidera modificare
  3. corsa p creat("<path to file">, <perms>) per inviare l'output del chiusa fd da qualche parte altro

Vedere This Link per informazioni più dettagliate

+4

Invece di 'close()' sul file fd, potresti voler creare il nuovo file fd prima ('creat()', 'open()', etc) quindi usare 'dup2()' per sostituire il fd che vuoi cattura, e quindi 'close()' la nuova fd. Il motivo è che 'open()' etc darà sempre il valore fd più basso disponibile, quindi se chiudi un fd e lo apri subito dopo, non c'è alcuna garanzia che tu possa recuperare lo stesso fd. Forse non è così importante per stdin/stdout/stderr perché sono fd 0,1,2, ma vale la pena menzionare per il caso generale. – FatalError

+0

@FatalError +1 al tuo commento, buone informazioni generali per avere – SiegeX

+0

piccolo programma reptyr -s PID fa proprio questo –

Problemi correlati