Ho lasciato uno script in esecuzione su una macchina remota da quando ci lavoravo localmente. Posso connettermi tramite SSH alla macchina come lo stesso utente e vedere lo script in esecuzione in ps
.
$ ps aux | grep ipcheck
myuser 18386 0.0 0.0 18460 3476 pts/0 S+ Dec14 1:11 /bin/bash ./ipchecker.sh
Sta semplicemente eseguendo l'output su stdout su una sessione locale (ho eseguito ./ipchecker.sh
formare una finestra di terminale locale, nessun reindirizzamento, nessun uso di screen
ecc).
C'è comunque da una sessione SSH che posso visualizzare l'output di questo comando in esecuzione (senza interromperlo)?
Finora il meglio che ho trovato è usare strace -p 18386
ma ricevo orde di testo che volano sullo schermo, è troppo dettagliato. Posso interrompere strace
e poi setaccia l'output e trova il testo stampato su stdout ma è molto lungo e confuso, e ovviamente mentre è fermo potrei perdere qualcosa. Vorrei trovare un modo per vedere l'output dello script dal vivo come se stessi lavorando in locale.
Qualcuno può migliorare su questo? La risposta ovvia è riavviare lo script con il reindirizzamento o in una screen
sessione ecc., questo non è uno script mission-critical, quindi potrei farlo. Piuttosto, lo vedo come un divertente esercizio di apprendimento.
Risposta accettata:
Se tutto ciò che vuoi fare è spiare il processo esistente, puoi usare strace -p1234 -s9999 -e write
dove 1234 è l'ID del processo. (-s9999
evita che le stringhe vengano troncate a 32 caratteri e write
la chiamata di sistema che produce l'output.) Se vuoi visualizzare solo i dati scritti su un particolare descrittore di file, puoi usare qualcosa come strace -p1234 -e trace= -e write=3
per vedere solo i dati scritti nel descrittore di file 3 (-e trace=
impedisce la registrazione delle chiamate di sistema). Questo non ti darà un output che è già stato prodotto.
Se l'output scorre troppo velocemente, puoi reindirizzarlo a un cercapersone come less
oppure invialo a un file con strace -o trace.log …
.
Con molti programmi, puoi deviare l'output successivo con un hack di ptrace, sul tuo terminale corrente o su una nuova sessione dello schermo. Vedi Come posso rinnegare un processo in esecuzione e associarlo a una nuova shell dello schermo? e altri thread collegati.
Tieni presente che, a seconda di come è configurato il tuo sistema, potrebbe essere necessario eseguire tutti questi strace
comandi come root anche se il processo è in esecuzione sotto il tuo utente senza privilegi aggiuntivi. (Se il processo è in esecuzione come un utente diverso o è setuid o setgid, dovrai eseguire strace
come root.) La maggior parte delle distribuzioni consente solo a un processo di tracciare i suoi figli (questo fornisce un moderato vantaggio in termini di sicurezza: impedisce l'iniezione diretta di malware, ma non impedisce l'iniezione indiretta modificando i file). Questo è controllato da kernel.yama.ptrace_scome
sysctl.