6
votes

Comment rediriger la sortie de / dev / null

J'ai une application qui exécute la commande A comme ci-dessous:

> & / dev / null

Je peux configurer , mais je n'ai aucun contrôle sur . Toute la sortie générée par cette commande va à / dev / null . Je veux que la sortie soit visible à l'écran ou redirigée vers un fichier journal.

J'ai essayé d'utiliser freopen () et des fonctions associées à la réouverture / dev / null dans un autre fichier, mais ne pouvait pas le faire fonctionner.

Avez-vous d'autres idées? Est-ce possible du tout?

Merci pour votre temps.

PS: Je travaille sur Linux.


5 commentaires

Qu'est-ce que cela a à voir avec Perl?


À moins que vous ne puissiez changer la commande dans le script, je pense que vous n'avez pas de chance. Une fois que cela a été redirigé à NULL, vous ne pouvez pas le récupérer car tous les descripteurs de fichiers que vous pourriez partager avec elle (STDIN, STDOUT, STDOUT) sont partis.


Vous avez donc le contrôle de la commande, mais pas la redirection de celui-ci? Si tel est le cas, je dirais que e-T172 a raison, ou du moins aussi juste que vous allez obtenir: Stackoverflow.com/questions/2507569/... sinon, veuillez mettre à jour pour clarifier.


Je peux configurer la , mais sans contrôle sur les . # > & / dev / null exécutera la commande sans commutateurs! :( J'ai édité ma question pour le rendre plus clair.


Cette question n'est-elle pas plus appropriée pour Serverfault? Qu'est-ce que cela a à voir avec c? Envisagez-vous d'écrire un programme C pour remplacer ? Celui qui capturerait les arguments puis appellerait la commande mais rediriger sa sortie dans un fichier journal?


12 Réponses :


8
votes

Terrible hack:

Utilisez un éditeur de texte en mode binaire Ouvrez l'application, recherchez '/ dev / null /' et remplacez-le par une chaîne de la même longueur xxx

  • Faites une sauvegarde d'abord
  • Soyez prudent
  • Soyez très soigné
  • ai-je mentionné la sauvegarde?

4 commentaires

Clarification: Ouvrez l'exécutable binaire avec l'éditeur de texte. Quelque part dans le gibberish des trucs binaires, il devrait y avoir "/ dev / null", ce que vous remplacez comme suggéré ci-dessus.


@XU: Je l'avais fait plus tôt. Remplacé / dev / null avec une chaîne d'espaces de longueur égale. Cela fonctionne, mais pour chaque version de la demande, le piratage de l'exécutable est fastidieux ... Je pensais à écrire un programme qui fait une redirection pirater et appelle la . Ce sera un effort unique.


@GOWTham: (approches alternatives) (1) Écrivez un programme qui fait le «remplacer» ... (2) Accédez au développeur de l'application et (poliment) Demander une option de configuration qui vous permet de rediriger à un journal. déposer ..


@GowTham: La commande est-elle appelée un script Perl que vous pouvez modifier? Si oui, vous pouvez ré-ouvrir STDIO dans un autre fichier.



3
votes

Ajoutez # à la fin de votre commande, il devient donc #> & dev / null , commentant ainsi la partie indésirable.


1 commentaires

@ E-T172: Bonne idée. J'ai oublié de mentionner les . La commande est appelée > & / dev / null



1
votes

Vous pouvez le faire avec un processus déjà en cours d'exécution à l'aide de GDB. Voir la page suivante: http: //etbe.coker.com.au/2008/02/27/redirecting-Output-de-A-Running-Process/


0 commentaires

1
votes

Pouvez-vous créer un alias pour cette commande? Si tel est le cas, l'alias elle à une autre commande qui déverse une sortie à un fichier.


0 commentaires

1
votes

Edit: Ce n'est pas une bonne idée et ne vaut certainement pas la peine d'essayer à moins que vous sachiez ce que cela peut casser. Cela fonctionne pour moi, peut également travailler pour vous.

OK, c'est un très mauvais piratage et probablement pas la peine d'être fait. En supposant qu'aucune des autres commandes ne fonctionne et que vous n'avez tout simplement pas accès à la binaire / application (qui contient la commande avec / dev / null ) et vous ne pouvez pas rediriger la sortie sur un autre fichier (en remplaçant / dev / null ).

Ensuite, vous pouvez supprimer / dev / null ( $> RM / dev / null ) et créer votre propre fichier à sa place (de préférence avec une liaison soft) où toutes les données peuvent être dirigées. . Lorsque vous avez terminé, vous pouvez créer une fois de nouveau / dev / null à l'aide de la commande suivante:

$> mknod -m 666 / dev / null C 1 3

juste pour être très clair, c'est un piratage mauvais nécessite certainement les autorisations de racine pour travailler. Il est fort probable que votre fichier ré-dirigé puisse contenir des données de nombreuses autres applications / binaires qui exécutent et utilisent / dev / null comme évier.


4 commentaires

Juste pour ajouter, j'ai essayé cela sur ma machine qui est une Fedora en cours d'exécution 2.6.30. Cette information est telle que le nombre majeur et mineur peut être différent pour MKNOD sur d'autres plates-formes / environnement.


Ce serait génial si «pourquoi-my-réponse-a-t-il été voté» est expliqué comme commentaire. Je sais que c'est un hack (mentionné silencieux clairement) et c'est explicitement ce que l'affiche recherchait "... mais je n'ai aucun contrôle sur ...".


Supprimer / Dev / Null va au-delà d'être un piratage. C'est une idée complètement brisée. Il affecte l'ensemble du système (tout nouveau ouvert sur le chemin de chemin), pas seulement le script / programme ciblé. Il doit être "réparé" après que vous ayez terminé. Et cela nécessite un accès root. La réponse ici n'est pas de "rediriger / dev / null", mais pour rouvrir les descripteurs existants ouverts à l'origine de / dev / null.


@Chris bien, ce que j'ai mentionné exactement que cela ne vaut pas la peine de faire. Être un "mauvais" piratage est plus en perspective - pour tout environnement de production, cela n'a certainement pas raison - mais si j'ai mon environnement de débogage et je besoin la sortie pour voir quelque chose - je peux très bien Préfère ce hack. Néanmoins, merci pour des commentaires - j'ai édité le message.



1
votes

Le fichier de périphérique / dev / tty code> fait référence à la prise de contrôle de votre application - si cela n'a pas changé, cela devrait fonctionner:

freopen("/var/log/myapp.log", "a", stdout);
freopen("/var/log/myapp.err", "a", stderr);


0 commentaires

2
votes

Votre application exécute probablement une coquille et la transmettez-la de la ligne de commande.

Vous devez le faire exécuter un script écrit par vous. Ce script remplacera > / dev / null null> dans la ligne de commande avec >> / votre / journal code> et appelez la vraie shell avec la ligne de commande modifiée. P> La première étape consiste à modifier la coque utilisée par l'application. Modification de la variable d'environnement shell code> devrait suffire, c'est-à-dire exécuter votre application comme p> xxx pré>

si cela ne fonctionne pas, essayez momentanément de lier / bin / sh code> à votre script. p>

myshell code> appellera la coque d'origine, mais après le remplacement des paramètres suivants: P>

#!/bin/bash
sh ${1+"${@/\>\/dev\/null/>>\/your\/log}"}


0 commentaires

4
votes

Étant donné que vous pouvez modifier la commande que vous exécutez que vous pouvez utiliser un script simple shell comme wrapper pour rediriger la sortie dans un fichier. xxx

Si vous enregistrez cela dans votre chemin comme capture_output. SH Ensuite, vous pouvez ajouter capture_output.sh au début de votre commande pour ajouter la sortie de votre programme à logfile.


0 commentaires

0
votes

dans Perl, si vous voulez simplement rediriger stdout à quelque chose de légèrement plus utile, vous pouvez simplement faire quelque chose comme: xxx

au début de votre script , et ça va le rediriger pour le reste de votre script.


0 commentaires

0
votes

Dans le sens de la réponse d'E-T172, pouvez-vous définir le dernier interrupteur sur (ou l'ajouter à elle):

; echo 


0 commentaires

1
votes

Ce n'est peut-être pas vraiment redirigé, mais cela permet d'obtenir la sortie partout où elle est envoyée

strace -ewrite -p $ pid

Ce n'est pas si cleen (montre des lignes comme: écrire (#,)), mais fonctionne! (et est une ligne unique: D) Vous pourriez également détester le fait, que les arguments sont abrégés. Pour contrôler ce paramètre Utilisez -s qui définit la longueur maximale des chaînes affichées.

Il attrape tous les flux. Vous voudrez peut-être filtrer cela en quelque sorte.

Vous pouvez le filtrer:

strace -ewrite -p $ pid 2> & 1 | grep "écrire (1"

montre uniquement descripteurs 1 appels. 2> & 1 est de rediriger stardr to stdout, car Strace écrit à Sterrr par défaut.


0 commentaires

0
votes

Si vous pouvez mettre quelque chose en ligne avant de passer des choses à / dev / null (pas sûr si vous avez affaire à une commande codée en dur), vous pouvez utiliser tee pour rediriger quelque chose de votre choix. < P> Exemple de Wikipedia qui permet une escalade d'une commande: xxx

http://en.wikipedia.org/wiki/tee_ (commande)


0 commentaires