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 i stderr)
  • -p PID – numer procesu, który ma być śledzony

Demonstracja

  1. 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
    done

    Skrypt ten wyświetli numer PID z jakim został uruchomiony oraz bedzie wyświetlał komunikat co dwie sekundy.

  2. Uruchomić powyższy skrypt:
    $ bash ./trace_test.sh
  3. 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 skrypt trace_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 :).

Źródła