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>&1
ou > /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ù stdout
et où stderr
j'é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
stderr
versstdout
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
linux
bash
io-redirection
gertvdijk
la source
la source
Réponses:
Vous pouvez le faire en utilisant reredirect ( https://github.com/jerome-pouiller/reredirect/ ).
Vous pouvez restaurer la sortie initiale de votre processus plus tard en utilisant quelque chose comme:
(
<M>
et<N>
sont fournis par le lancement précédent de reredirect).reredirect
README
explique également comment rediriger vers une autre commande ou rediriger uniquement stdout ou stderr.la source
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.
la source
Vous devez utiliser reptyr pour attacher un autre processus à votre nouveau terminal actuel. Par exemple: installez et utilisez l'
screen
utilitaire GNU , et lancez-y lareptyr
commande pour "récupérer" les autres redirections du processus (et le terminal de contrôle) et les attacher au nouveau terminal actuel (lescreen
processus, si vous avez lancéreptyr
depuisscreen
). L'avantage de le faire à partir d'unescreen
session est qu'une fois sousscreen
, 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).la source