Dans le shell, vous pouvez effectuer une redirection, >
<
etc., mais qu'en est-il APRÈS qu'un programme ait démarré?
Voici comment j'en suis venu à poser cette question, un programme s'exécutant en arrière-plan de mon terminal continue de produire du texte ennuyeux. C'est un processus important donc je dois ouvrir un autre shell pour éviter le texte. J'aimerais pouvoir >/dev/null
ou une autre redirection afin de pouvoir continuer à travailler dans le même shell.
Réponses:
À moins de fermer et de rouvrir votre tty (c'est-à-dire se déconnecter et se reconnecter, ce qui peut également mettre fin à certains de vos processus d'arrière-plan dans le processus), vous n'avez plus qu'un choix:
par exemple:
Vous pouvez également envisager:
screen
; écran fournit plusieurs TTY virtuels auxquels vous pouvez basculer sans avoir à ouvrir de nouvelles sessions SSH / telnet / etcnohup
; cela vous permet de fermer et de rouvrir votre session sans perdre aucun processus d'arrière-plan dans le processus ...la source
open("/path/to/new/stdout",O_WRONLY)
. O_WRONLY ne sera probablement pas disponible, cependant; sa valeur est1
sur Linux / glibc.1025
activeO_APPEND
en plus deO_WRONLY
, ce qui est pratique si vous redirigez à la fois stderr et stdout vers le même fichier.Cela fera:
Ce n'est pas si propre (affiche des lignes comme:)
write(#,<text you want to see>)
, mais ça marche!Vous pourriez également ne pas aimer le fait que les arguments soient abrégés. Pour contrôler cela, utilisez le
-s
paramètre qui définit la longueur maximale des chaînes affichées.Il capture tous les flux, vous pouvez donc filtrer cela d'une manière ou d'une autre:
affiche uniquement les appels du descripteur 1.
2>&1
est de rediriger STDERR vers STDOUT, commestrace
écrit dans STDERR par défaut.la source
sudo
soit nécessaire.riffing de l'excellente recherche de vladr (et d'autres):
créez les deux fichiers suivants dans le même répertoire, quelque chose dans votre chemin, par exemple $ HOME / bin:
silence.gdb, contenant (d'après la réponse de vladr):
et silence, contenant:
Maintenant, la prochaine fois que vous oubliez de rediriger firefox, par exemple, et votre terminal commence à être encombré par les inévitables messages "(firefox-bin: 5117): Gdk-WARNING **: XID collision, trouble ahead":
Vous pouvez également rediriger la sortie de gdb vers / dev / null si vous ne voulez pas la voir.
la source
--batch-silent
qui supprime la sortie et ne vous décharge pas dans la console gdb si quelque chose ne va pas (par exemple, processus manquant). BTW,$!
fait référence au travail d'arrière-plan le plus récent, mais je ne pense pas qu'il puisse être utilisé dans le script lui-même. J'utilise un alias:alias silencebg='silence $!'
Rediriger la sortie d'un processus en cours vers un autre terminal, fichier ou écran:
À l'intérieur de gdb :
Détachez un processus en cours d'exécution du terminal bash et gardez-le en vie:
Explication:
20818 - juste un exemple de l'exécution du processus pid
p - imprimer le résultat de la commande gdb
close (1) - fermer la sortie standard
/ dev / pts / 4 - terminal à écrire pour
fermer (2) - fermer la sortie d'erreur
/ tmp / myerrlog - fichier vers écrire dans
q - quitter gdb
bg% 1 - exécuter le travail 1 arrêté en arrière-plan
désavouer% 1 - détacher le travail 1 du terminal
la source
stdin
(descripteur de fichier0
) est fermé.p open("/tmp/myerrlog", 2)
?Ce n'est pas une réponse directe à votre question, mais c'est une technique que j'ai trouvée utile ces derniers jours: exécutez la commande initiale en utilisant 'screen', puis détachez.
la source
il s'agit d'une partie de script bash basée sur les réponses précédentes, qui redirige le fichier journal lors de l'exécution d'un processus ouvert, elle est utilisée comme postscript dans le
logrotate
processusla source
https://www.isi.edu/~yuri/dupx/
la source
Vous pouvez utiliser reredirect ( https://github.com/jerome-pouiller/reredirect/ ).
Type
et les sorties (standard et erreur) seront écrites dans FILE.
reredirect README explique également comment restaurer l'état d'origine du processus, comment rediriger vers une autre commande ou rediriger uniquement stdout ou stderr.
reredirect
fournir également un script appelérelink
qui permet de rediriger vers le terminal actuel:(reredirect semble avoir les mêmes fonctionnalités que Dupx décrit dans une autre réponse mais, cela ne dépend pas de Gdb).
la source