Jeg har latt et skript kjøre på en ekstern maskin fra da jeg jobbet lokalt på den. Jeg kan koble meg til maskinen via SSH som samme bruker og se at skriptet kjører i ps
.
$ ps aux | grep ipcheck
myuser 18386 0.0 0.0 18460 3476 pts/0 S+ Dec14 1:11 /bin/bash ./ipchecker.sh
Det skrives rett og slett ut til stdout på en lokal økt (jeg kjørte ./ipchecker.sh
fra et lokalt terminalvindu, ingen omdirigering, ingen bruk av screen
osv.)
Er det mulig å se utdataene fra denne kommandoen fra en SSH-sesjon (uten å stoppe den)?
Så langt er det beste jeg har funnet å bruke strace -p 18386
, men jeg får horder av tekst som flyr opp på skjermen, det er altfor detaljert. Jeg kan stoppe strace
og deretter gå gjennom output og finne teksten som blir skrevet ut til stdout, men den er veldig lang og forvirrende, og det er klart at mens den er stoppet kan jeg gå glipp av noe. Jeg vil gjerne finne en måte å se skriptutskriftene live som om jeg jobbet lokalt.
Er det noen som kan forbedre dette? Det åpenbare svaret er å starte skriptet på nytt med omdirigering eller i en skjerm
økt etc, dette er ikke et oppdragskritisk skript, så jeg kunne gjøre det. Snarere skjønt, jeg ser dette som en morsom læringsøvelse.
Hvis du bare vil spionere på en eksisterende prosess, kan du bruke strace -p1234 -s9999 -e write
, der 1234 er prosessens ID. (-s9999
unngår at strenger avkortes til 32 tegn, og write
er systemkallet som produserer utdata). Hvis du bare vil se data som er skrevet på en bestemt fildeskriptor, kan du bruke noe sånt som strace -p1234 -e trace= -e write=3
for bare å se data som er skrevet til fildeskriptor 3 (-e trace=
forhindrer at systemkallene logges). Da får du ikke utdata som allerede er produsert.
Hvis utdataene ruller for fort, kan du pipe dem inn i en personsøker, for eksempel less
, eller sende dem til en fil med strace -o trace.log ...
.
I mange programmer kan du omdirigere påfølgende utdata med et ptrace-hack, enten til den aktuelle terminalen eller til en ny skjermøkt. Se https://unix.stackexchange.com/questions/4034/how-can-i-disown-a-running-process-and-associate-it-to-a-new-screen-shell og andre tilknyttede tråder.
Vær oppmerksom på at avhengig av hvordan systemet ditt er satt opp, kan det hende du må kjøre alle disse strace
-kommandoene som root selv om prosessen kjører under din bruker uten ekstra rettigheter. (Hvis prosessen kjører som en annen bruker eller er setuid eller setgid, må du kjøre strace
som root). De fleste distribusjoner tillater bare at en prosess sporer sine barn (dette gir en moderat sikkerhetsfordel - det forhindrer noe direkte skadevareinjeksjon, men forhindrer ikke indirekte injeksjon ved å endre filer). Dette styres av kernel.yama.ptrace_scome
sysctl.
Jeg anbefaler å lage en navngitt pipe (mkfifo
) og deretter skrive til den filen. Deretter leser du fra den. Du kan alltid gjøre det med ting som tail
, for å minimere utdata osv. Hver gang du tømmer røret (leser fra det), blir det tømt, så utdataene blir ikke bevart.
Det andre alternativet er å skrive alt til en fil (omtrent som en loggfil) og deretter analysere den når som helst. Dette er å foretrekke hvis du ønsker å bevare all utdata.
Du kan kanskje kikke på den eksterne skjermen ved å bruke ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scale
, der localhost
skal erstattes med påloggingsinformasjonen til den eksterne serveren og :0.0
med skjermnummeret til det grafiske brukergrensesnittet.
Bruk x11vnc
, som er en VNC-server for X-session på skjermen.
Når du kjører på en av de 6 virtuelle konsollene, prøv sudo setterm -dump 2 -file /dev/stdout
, der du erstatter 2
med den aktuelle vc.