Rediriger STDERR / sortie standard d'un processus APRÈS avoir été lancé, à l'aide de la ligne de commande?
Dans le shell que vous pouvez faire de la redirection, >
<
, etc., mais que diriez-vous APRÈS un programme est démarré?
Voici comment j'en suis venu à poser cette question, un programme en cours d'exécution en arrière-plan de mon terminal maintient la sortie ennuyeux texte. C'est un processus important, donc je dois ouvrir un autre shell pour éviter le texte. Je voudrais être en mesure de >/dev/null
ou une autre redirection afin que je puisse continuer à travailler dans la même coquille.
- Je sais que la façon la plus simple de rediriger la sortie standard STDOUT/STDERR est à DUP2 leurs descripteurs de fichiers AVANT de bifurquer. C'est assez pratique, et sans doute la façon dont les coquilles accomplir dès maintenant. Pas sûr que ce donne une réponse, mais je pense que cela diminue les chances d'être un bon.
- reptyr
Vous devez vous connecter pour publier un commentaire.
Court de la fermeture et la réouverture de votre ats (c'est à dire à la déconnexion et à l'arrière, ce qui peut également mettre fin à certaines de vos processus d'arrière-plan dans le processus, vous n'avez qu'un seul choix à gauche:
par exemple:
Vous pouvez également envisager de:
screen
; écran fournit plusieurs virtuel Ats vous pouvez basculer entre les deux sans avoir à ouvrir de nouvelles SSH/telnet/etc, des séances denohup
; cela vous permet de fermer et de rouvrir votre session sans perdre aucun processus d'arrière-plan dans le... processus.open("/path/to/new/stdout",O_WRONLY)
. O_WRONLY ne sera probablement pas disponible, bien que sa valeur est1
sur Linux/glibc.1025
activeO_APPEND
en plus deO_WRONLY
, ce qui est pratique si vous redirigez les deux stderr et stdout vers le même fichier.Cela va faire:
Ce n'est pas que propre (présente des lignes comme:
write(#,<text you want to see>)
), mais qui fonctionne!Vous pouvez également n'aime pas le fait que les arguments sont abrégées. Pour contrôler que l'utilisation de la
-s
paramètre qui définit la longueur maximale des chaînes de caractères affichés.Il attrape tous les flux, de sorte que vous pouvez filtrer que d'une certaine façon:
montre seulement descripteur 1 appels.
2>&1
est de rediriger STDERR pour STDOUT, commestrace
écrit sur la sortie STDERR par défaut.sudo
est nécessaire.aussi vladr (et d'autres) l'excellence de la recherche:
créer les deux fichiers dans le même répertoire, quelque chose dans votre chemin d'accès, par exemple $HOME/bin:
silence.gdb, contenant (à partir de vladr réponse):
et de silence, contenant:
Maintenant, la prochaine fois vous oubliez de rediriger firefox, par exemple, et votre terminal commence à être encombré avec l'inévitable "(firefox-bin:5117): Gdk-WARNING **: XID collision, de la difficulté de l'avant" messages:
Vous pouvez également rediriger gdb sortie vers /dev/null si vous ne voulez pas le voir.
--batch-silent
qui supprime la sortie et ne pas jeter vous dans le gdb console si quelque chose va mal (par exemple, manque de processus). BTW,$!
se réfère à la plus récente de la tâche en arrière-plan, mais je ne pense pas qu'il peut être utilisé dans le script lui-même. Je utiliser un alias:alias silencebg='silence $!'
Rediriger la sortie d'un processus en cours d'exécution à un autre terminal, de fichier ou de l'écran:
À l'intérieur de gdb:
Détacher un processus en cours d'exécution à partir de bash terminal et de la garder vivante:
Explication:
20818 - juste un exemple d'exécution de processus pid
p - impression de la commande gdb
fermeture(1) - proche sortie standard
/dev/pts/4 - terminal à écrire
close(2) - proche de la sortie d'erreur
/tmp/myerrlog - fichier pour écrire
q - quitter gdb
bg %1 - run arrêtée travail 1 sur fond
renier %1 - détacher de travail 1 du terminal
stdin
(descripteur de fichier0
) est fermé.p open("/tmp/myerrlog", 2)
?Pas une réponse directe à votre question, mais c'est une technique que j'ai trouvé utile au cours de la dernière quelques jours: Exécution de la commande initiale à l'aide de l'écran", puis détacher.
c'est script bash partie basée sur la réponse à la question précédente, qui rediriger le fichier journal en cours d'exécution d'un processus ouvert, il est utilisé comme postscript dans
logrotate
processushttps://www.isi.edu/~yuri/dupx/
Vous pouvez utiliser reredirect (https://github.com/jerome-pouiller/reredirect/).
Type
et sorties standard et d'erreur) seront écrits dans le FICHIER.
reredirect README explique aussi comment faire pour restaurer l'état d'origine de processus, comment faire pour rediriger vers une autre commande ou de rediriger uniquement stdout ou stderr.
reredirect
également fournir un script appelérelink
qui permet de rediriger vers des terminaux actuels:(reredirect semble avoir les mêmes fonctionnalités que Dupx décrit dans une autre réponse, mais, il ne dépend pas de Gdb).