Czasem istnieje następująca sytuacja: musimy zobaczyć co dana aplikacja wypisuje na ekranie, ale jest ona uruchomiona na innym terminalu (do którego nie mamy dostępu) lub też działa w tle i jej komunikaty lądują w nicości (czyli /dev/null
). Można to zrobić za pomocą polecenia strace
. Polecenie to służy generalnie do śledzenia wywołań systemowych.
strace -f -e trace=write -e write=1,2 -p PID
Opis opcji konfiguracyjnych:
- -f – śledzi także procesu potomne monitorowanego procesu
- -e trace=write – śledzenie informacji zapisu
- -e write=1,2 – deskryptory plików, dla których mają być śledzone zapisy (tutaj
stdout
istderr
) - -p PID – numer procesu, który ma być śledzony
Demonstracja
- Utworzyć skrypt o nazwie
trace_test.sh
1
2
3
4
5
6
7
8
9#!/bin/bash
echo PID: $$
for I in `seq 1 1000`
do
echo "Linia $I"
sleep 2
doneSkrypt ten wyświetli numer PID z jakim został uruchomiony oraz bedzie wyświetlał komunikat co dwie sekundy.
- Uruchomić powyższy skrypt:
$ bash ./trace_test.sh
- Należy teraz otworzyć drugą konsolę i wykonać w niej polecenie:
strace -f -e trace=write -e write=1,2 -p PID
W miejsce
PID
należy wpisać numer wyświetlony przez skrypttrace_test.sh
. Przykładowy wynik działania:Process 14589 attached - interrupt to quit
--- SIGCHLD (Child exited) @ 0 (0) ---
write(1, "Linia 5\n", 8) = 8
| 00000 4c 69 6e 69 61 20 35 0a Linia 5. |
Process 14598 attached
Process 14589 suspended
Process 14589 resumed
Process 14598 detached
--- SIGCHLD (Child exited) @ 0 (0) ---
write(1, "Linia 6\n", 8) = 8
| 00000 4c 69 6e 69 61 20 36 0a Linia 6. |
Process 14599 attached
Process 14589 suspended
Process 14589 resumed
Process 14599 detached
--- SIGCHLD (Child exited) @ 0 (0) ---
write(1, "Linia 7\n", 8) = 8
| 00000 4c 69 6e 69 61 20 37 0a Linia 7. |
Process 14601 attached
Process 14589 suspended
Process 14589 detached
Process 14601 detached
Analiza takich danych może nie jest najłatwiejsza, ale zawsze dobrze mieć trochę więcej informacji :).