Zostawiłem skrypt działający na zdalnej maszynie od czasu, gdy pracowałem nad nim lokalnie. Mogę połączyć się przez SSH z maszyną jako ten sam użytkownik i zobaczyć uruchomiony skrypt ps
.
$ ps aux | grep ipcheck
myuser 18386 0.0 0.0 18460 3476 pts/0 S+ Dec14 1:11 /bin/bash ./ipchecker.sh
Po prostu wyświetla wyjście na standardowe wyjście w lokalnej sesji (uruchomiłem ./ipchecker.sh
z lokalnego okna terminala, bez przekierowania, bez użycia screen
itp.).
Czy w ogóle z sesji SSH mogę wyświetlić dane wyjściowe tego uruchomionego polecenia (bez zatrzymywania go)?
Do tej pory najlepsze, co znalazłem, to użyć, strace -p 18386
ale dostaję hordy tekstu lecącego w górę ekranu, który jest zbyt szczegółowy. Mogę zatrzymać, strace
a następnie przeszukać dane wyjściowe i znaleźć tekst przeniesiony na standardowe wyjście, ale jest on bardzo długi i mylący, i oczywiście, gdy jest zatrzymany, mogę coś przeoczyć. Chciałbym znaleźć sposób, aby zobaczyć wyniki skryptu na żywo, tak jakbym pracował lokalnie.
Czy ktoś może to poprawić? Oczywistą odpowiedzią jest ponowne uruchomienie skryptu z przekierowaniem lub w screen
sesji itp. Nie jest to skrypt o znaczeniu krytycznym, więc mógłbym to zrobić. Uważam to raczej za zabawne ćwiczenie edukacyjne.
źródło
strace -p 4232 -e write
Odpowiedzi:
Jeśli wszystko, co chcesz zrobić, to szpiegować istniejący proces, możesz użyć
strace -p1234 -s9999 -e write
gdzie 1234 to identyfikator procesu. (-s9999
unika się obcięcia ciągów znaków do 32 znaków iwrite
wywołania systemowego, które generuje dane wyjściowe). Jeśli chcesz wyświetlić tylko dane zapisane na określonym deskryptorze pliku, możesz użyć czegoś takiego,strace -p1234 -e trace= -e write=3
aby zobaczyć tylko dane zapisane na deskryptorze pliku 3 (-e trace=
zapobiega systemowi połączenia z logowania). To nie da ci produkcji, która została już wyprodukowana.Jeśli dane wyjściowe są przewijane zbyt szybko, możesz potokować je do pagera, takiego jak
less
, lub wysłać do pliku za pomocąstrace -o trace.log …
.W wielu programach możesz przekierowywać kolejne dane wyjściowe za pomocą hackowania ptrace do bieżącego terminala lub do nowej sesji ekranowej. Zobacz Jak mogę odrzucić działający proces i powiązać go z nową powłoką ekranu? i inne powiązane wątki.
Należy pamiętać, że w zależności od konfiguracji systemu może być konieczne uruchomienie wszystkich tych
strace
komend jako root, nawet jeśli proces jest wykonywany przez użytkownika bez żadnych dodatkowych uprawnień. (Jeśli proces działa jako inny użytkownik lub jest ustawiony jako setuid lub setgid, będziesz musiał uruchomićstrace
jako root). Większość dystrybucji zezwala jedynie na proces śledzenia jego elementów podrzędnych (zapewnia to umiarkowane korzyści bezpieczeństwa - zapobiega bezpośredniemu wstrzyknięciu złośliwego oprogramowania, ale nie zapobiega iniekcji pośredniej przez modyfikację plików). Jest to kontrolowane przezkernel.yama.ptrace_scome
sysctl.źródło
man strace
Możesz uzyskać dostęp do danych wyjściowych za pośrednictwem
proc
systemu plików.1
= stdout,2
= stderrźródło
/dev/null
) - zadziała tylko wtedy, gdy wyjście zostanie przekierowane do pliku.ping google.es
w innej jako root:tail -f /proc/`pgrep ping`/fd/2
i nic nie jest pokazywane.W BSD możesz użyć,
watch
które szpieguje dany tty, npW Linuksie nie będzie to możliwe, jeśli proces nie był uruchamiany pod multiplekserem przed takimi jak
screen
lubtmux
. Zobacz także: Reptyr: Dołącz działający proces do nowego terminalaWydaje się, że jedynym sposobem jest debugowanie procesu (np
strace
,dtrace
/dtruss
,gdb
,lldb
, itd.).Ponieważ używałeś
strace
, aby pobrać dowolne znaczące dane wyjściowe, musisz przefiltrować według wyrażenia kwalifikującego (np.file
), A następnie przeanalizować dane wyjściowe. Oto przykład:Co robi Drukuje operację zapisu procesu (długość 1000) określoną przez PID (użyj,
pgrep
aby znaleźć go po nazwie), przekierowuje standardowy błąd na wyjście (do filtrowania) i drukuje ciąg cudzysłowu.Jeśli masz do czynienia z wyjściami binarnymi, możesz analizować znaki sekwencji specjalnych za pomocą
read
(z-r
) iprintf
(z%b
), npSprawdź
help read
więcej parametrów (np.-n
Aby drukować po określonej ilości znaków, a nie nowej linii).Oto bardziej kompletny przykład:
Aby zapoznać się z przykładami wykorzystującymi dowolny proces, sprawdź: Jak parsować strace w powłoce na zwykły tekst? przy przepełnieniu stosu
źródło
Możliwe, że zerkniesz na ekran zdalny, używając miejsca, w
ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scale
którymlocalhost
ma zostać zastąpione poświadczenia logowania do zdalnego serwera oraz:0.0
numeru wyświetlanego GUI.Użyj
x11vnc
, który jest serwerem VNC dla twojej sesji X na ekranie.Podczas uruchamiania na jednej z 6 konsol wirtualnych spróbuj
sudo setterm -dump 2 -file /dev/stdout
, gdzie zamienisz2
na odpowiedni vc.źródło
Radzę zrobić nazwaną potok (
mkfifo
), a następnie napisać do tego pliku. Następnie przeczytaj z niego. Zawsze możesz to zrobić za pomocą rzeczy takich jaktail
, aby zminimalizować dane wyjściowe itp. Ilekroć wyczyścisz potok (odczyt z niego), zostanie on wyczyszczony, więc dane wyjściowe nie zostaną zachowane.Inną opcją byłoby zapisanie wszystkiego do pliku (podobnie jak plik dziennika), a następnie przeanalizowanie go w dowolnym momencie. To byłoby preferowane działanie, jeśli chcesz zachować wszystkie dane wyjściowe.
źródło
Zawsze można uruchomić proces whith nohup i &
Następnie możesz sprawdzić postęp z dowolnego tty za pomocą:
Działa mi to dobrze.
źródło
Bardzo prostym sposobem na uzyskanie wyniku byłoby przechwycenie wyniku do pliku i dopasowanie tego pliku.
JEŚLI ZROBIĆ: ./ipcheck
INSTEAD DO: ./ipcheck> [zamień na nazwę pliku]
Spowoduje to utworzenie pliku wyjściowego, w którym znajduje się skrypt. Następnie z dowolnej innej powłoki bash możesz po prostu ogonić plik:
tail [zastąp swoją nazwą pliku] -f
źródło
setbuf(3)
), co może powodowaćtail
problemy.Analizowanie danych wyjściowych strace:
Użyłem najwyższej odpowiedzi (z moim identyfikatorem procesu 28223) ...
Aby ustalić, na czym mi zależy
write(9
. (9 jest używane poniżej, prawdopodobnie jest to uchwyt pliku i może być inny dla twojego procesu). Potem napisałem szybki skrypt Ruby, aby go przeanalizować i wyświetlić.Wklej następujące elementy do
/usr/bin/parse_strace.rb
Nie zapomnij
chmod a+x /usr/bin/parse_strace.rb
Wywołuję
strace -xx
(generuje hex, więc wyrażenie regularne pasuje poprawnie), potokując (w tym STDERR) do mojego skryptu9
jako pierwszy argument.I, voila, wyświetla oryginalny STDOUT procesu, nowe linie, kolor i wszystko!
źródło
nie możesz uzyskać identyfikatora procesu i komunikować się z nim z USR1,
który drukuje PID skryptu, a następnie użyj go do
Rozumiem, że USR1 jest sygnałem „zdefiniowanym przez użytkownika”, co oznacza, że ktokolwiek stworzył program, może go użyć do oznaczenia „zamknij” lub „zrzuć logi” lub „drukuj foo tysiąc razy” lub cokolwiek innego.
źródło