GNU/Linux >> Linux Esercitazione >  >> Linux

Intercetta l'input e l'output da un eseguibile specifico

L'opzione 1 sarebbe modificare il codice sorgente dell'app chiamante e inserire tee nella pipeline di output per ottenere una copia dell'output per la revisione in quella fase.

L'opzione 2 sarebbe quella di scrivere uno script wrapper attorno all'eseguibile in questione. Uno script rapido che trasmette stdin e argomenti all'app reale, quindi invia l'output in una posizione che puoi rivedere e lo risputa allo stesso modo in cui l'app dovrebbe essere solo un paio di righe da montare. Mettilo in un posto speciale e aggiungi quella posizione all'inizio della tua variabile PATH, quindi esegui la tua applicazione.

#!/bin/sh
cat - | /path/to/realapp [email protected] | tee /tmp/debug_output

Puoi ottenere molte informazioni su un programma chiamandolo sotto strace . Questo mostra tutte le chiamate di sistema effettuate dal programma, che a volte possono essere troppe informazioni, ma possono essere di grande aiuto per trovare cosa non va.

Il primo approccio consiste nell'eseguire la tua grande applicazione in strace . È probabile che ciò produca molto output e rallenti la tua applicazione.

strace -s9999 -efile,process -f -o bigapp.strace bigapp

Se la grande applicazione è interattiva, potresti preferire avviarla e collegarvi strace una volta che sei pronto per attivare i calcoli. Prendi nota dell'ID del processo dell'applicazione, ad esempio 12345, ed esegui

strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345

Se è sufficiente osservare quell'eseguibile esterno, allora come hanno già suggerito altre risposte, sostituisci quell'eseguibile con uno script wrapper. Puoi spostare l'eseguibile con un nome diverso e mettere lo script wrapper al suo posto, o mettere lo script wrapper davanti al solito eseguibile nel PATH , o configura l'applicazione per chiamare il tuo script wrapper invece del solito eseguibile, qualunque cosa sia conveniente. Crea quello script wrapper

#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "[email protected]"

Spiegazione dei parametri strace utilizzati:

  • -e seleziona le chiamate di sistema da tracciare. Puoi specificare le chiamate di sistema per nome o utilizzare alcune categorie come file (open , close , read , write , …) e process (fork , execve , …).
  • -f fa in modo che strace segua i fork, cioè traccia i sottoprocessi così come il processo originale.
  • -o seleziona il nome del file contenente la traccia. $$ è un costrutto di shell che rappresenta l'ID del processo del processo di shell (a causa dell'uso di exec nell'ultimo script wrapper, che sarà anche l'ID del processo dell'applicazione ausiliaria).
  • -s9999 mostra così tanti byte per read e write e altre chiamate.

Piuttosto che cambiare il tuo percorso, dovresti spostare il binario che ti interessa da "binary" a "binary.orig" e sostituirlo con uno script. Hai detto che sei interessato agli argomenti, quindi vorrai scrivere anche quelli in un file. Probabilmente sarai anche interessato all'output del comando "env". Scarica tutte le variabili di ambiente attualmente attive. Le variabili d'ambiente sono spesso utilizzate da un programma per influenzare il comportamento di un altro programma che chiama.


Linux
  1. Lavorare con l'output di input e il reindirizzamento degli errori in Linux

  2. Come acquisire le sessioni del terminale e l'output con il comando di script Linux

  3. Come funzionano l'input da tastiera e l'output di testo?

  4. Rimuovere i caratteri di controllo (inclusi i codici e i colori della console) dall'output dello script?

  5. MYSQL differisce nell'output dallo script

Come eseguire comandi dall'input standard utilizzando Tee e Xargs in Linux

Spiegazione del reindirizzamento di input e output su Linux

Come vedere l'output di uno script PHP?

Spiegazione:input, output e reindirizzamento degli errori in Linux

Shell Scripting Part4 – Input, Output e Reindirizzamento

Come estrarre un valore (in una specifica riga e colonna) da un file e assegnarlo a una nuova variabile