Comment changer la redirection de sortie d'un processus en cours?

11

Je sais comment rediriger la sortie et comment les supprimer dans bash. Maintenant, supposons que j'ai accidentellement oublié d'ajouter la partie de redirection de sortie à la commande (par exemple, 2>&1ou > /tmp/mystdout) et que mon processus d'arrière-plan est déjà en cours d'exécution depuis un certain temps, puis-je quand même changer où stdoutet où stderrj'écris? Je voudrais vraiment ne pas tuer et redémarrer l'application.

Pour être plus précis comme l'a demandé Gilles dans son commentaire, je voudrais en jouer dans ces scénarios en particulier:

  • fichier de sortie incorrect
  • oublié de rediriger stderrversstdout

ou une combinaison des deux

Par exemple, j'ai Apache en cours d'exécution et je peux voir les descripteurs de fichiers:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log
gertvdijk
la source
Passer à un autre terminal? Ou vers un fichier? Si vous vous contentez de vous attacher au terminal actuel ou à une nouvelle session d'écran, voir Comment puis-je désavouer un processus en cours et l'associer à un nouveau shell d'écran?
Gilles 'SO- arrête d'être méchant'

Réponses:

8

Vous pouvez le faire en utilisant reredirect ( https://github.com/jerome-pouiller/reredirect/ ).

reredirect -m /dev/null <PID>

Vous pouvez restaurer la sortie initiale de votre processus plus tard en utilisant quelque chose comme:

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

( <M>et <N>sont fournis par le lancement précédent de reredirect).

reredirect READMEexplique également comment rediriger vers une autre commande ou rediriger uniquement stdout ou stderr.

Jérôme Pouiller
la source
3

Ce n'est pas possible. Ou du moins pas facile. Vous pourriez avoir de la chance d'attacher gdb au processus et de le manipuler dans gdb, mais cela peut conduire à des plantages tout aussi facilement que le succès.

Dennis Kaarsemaker
la source
1
Il existe des outils pour cela de nos jours .
Gilles 'SO- arrête d'être méchant'
N'hésitez pas à les partager, je voterai favorablement la réponse :)
Dennis Kaarsemaker
Hum, je l'ai déjà fait .
Gilles 'SO- arrête d'être méchant'
1
Pas assez. Tous les outils liés dans l'autre bogue concernent la connexion à une autre session terminal / écran. Pas de redirection vers un autre fichier. Bien qu'il ne soit probablement pas difficile de corriger reptyr pour rediriger vers un fichier à la place.
Dennis Kaarsemaker
J'ai regardé un peu la source de reptyr et je suis d'accord avec la partie "pas facile" de la réponse. Pourrait approfondir quelque peu plus tard.
gertvdijk
2

Vous devez utiliser reptyr pour attacher un autre processus à votre nouveau terminal actuel. Par exemple: installez et utilisez l' screenutilitaire GNU , et lancez-y la reptyrcommande pour "récupérer" les autres redirections du processus (et le terminal de contrôle) et les attacher au nouveau terminal actuel (le screenprocessus, si vous avez lancé reptyrdepuis screen). L'avantage de le faire à partir d'une screensession est qu'une fois sous screen, il sera alors facile de se déconnecter et de s'y reconnecter (par exemple, fermer votre session locale, rentrer à la maison et la rouvrir).

Olivier Dulac
la source
Merci pour votre réponse, mais cela ne m'aide pas avec mon cas car je ne pose pas de question sur le détachement / retrait du terminal. Veuillez relire ma question et l'exemple en particulier.
gertvdijk
ah, dans ce cas: lisez le code reptyr, découvrez comment le modifier pour ne rediriger que stdout ou stderr. Ensuite, exécutez-le à partir d'un autre shell qui redirige ce flux nouvellement attaché vers l'endroit où vous voulez qu'il aille? (ou, mieux, en utilisant la source reptyr, faites la redirection directement)
Olivier Dulac