Come modificare il reindirizzamento dell'output di un processo in esecuzione?


11

So come reindirizzare l'output e come eliminarli in bash. Supponiamo ora di aver dimenticato per sbaglio di aggiungere la parte di reindirizzamento dell'output al comando (ad es. 2>&1O > /tmp/mystdout) e che il mio processo in background sia già in esecuzione da un po ', posso ancora cambiare dove stdoute dove sto stderrscrivendo? Vorrei davvero non uccidere e riavviare l'applicazione.

Per essere più specifici, come chiesto da Gilles nel suo commento, mi piacerebbe giocherellare in questi scenari in particolare:

  • file di output errato
  • dimenticato di reindirizzare stderrastdout

o una combinazione di entrambi

Ad esempio, ho Apache in esecuzione e posso vedere i descrittori di file:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log

Passare a un altro terminale? O in un file? Se sei soddisfatto di collegarti al terminale corrente o a una nuova sessione dello schermo, vedi Come posso rinnegare un processo in esecuzione e associarlo a una nuova shell dello schermo?
Gilles 'SO- smetti di essere malvagio' il

Risposte:


8

Puoi farlo usando reredirect ( https://github.com/jerome-pouiller/reredirect/ ).

reredirect -m /dev/null <PID>

È possibile ripristinare l'output iniziale del processo in un secondo momento utilizzando qualcosa come:

reredirect -N -O <M> -E <N> <PID>

( <M>e <N>sono forniti dal precedente lancio di reredirect).

reredirect READMEspiega anche come reindirizzare a un altro comando o reindirizzare solo stdout o stderr.


3

Non e possibile. O almeno non facile. Potresti avere un po 'di fortuna legando gdb al processo e giocherellando con esso in gdb, ma questo può portare a crash altrettanto facilmente quanto il successo.



Sentiti libero di condividerli, voterò la risposta :)
Dennis Kaarsemaker il


1
Non proprio. Tutti gli strumenti collegati nell'altro bug riguardano il collegamento a un'altra sessione terminale / schermo. Non si tratta di reindirizzare a un altro file. Anche se probabilmente non è difficile patchare reptyr per reindirizzare invece a un file.
Dennis Kaarsemaker,

Ho esaminato un po 'la fonte di reptyr e concordo maggiormente con la parte "non facile" della risposta. Potrebbe fare un tuffo più profondo in esso qualche tempo dopo.
gertvdijk,

2

È necessario utilizzare reptyr per collegare un altro processo al nuovo terminale corrente. Ad esempio: installa e usa l' screenutilità GNU e in essa avvia il reptyrcomando per "recuperare" i reindirizzamenti dell'altro processo (e il terminale di controllo) e collegarli al nuovo terminale corrente (il screenprocesso, se avviato reptyrda screen). Il vantaggio di farlo da una screensessione è che, una volta sotto screen, sarà facile disconnettersi e riconnettersi ad essa (ad esempio, chiudere la sessione locale, tornare a casa e riaprirla).


Grazie per la risposta, ma non mi aiuta con il mio caso in quanto non sto chiedendo informazioni sul distacco / distacco del terminale. Rileggi la mia domanda e l'esempio in particolare.
gertvdijk,

ah, in quel caso: leggi il codice reptyr, scopri come modificarlo per reindirizzare solo stdout o stderr. Quindi eseguirlo da un'altra shell che reindirizza lo stream appena collegato a dove vuoi che vada? (o meglio, usando la fonte reptyr, esegui direttamente il reindirizzamento)
Olivier Dulac 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.