GNU/Linux >> Linux Esercitazione >  >> Linux

Come visualizzare l'output di un processo in esecuzione in un'altra sessione Bash?

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.

Correlati:come vincere il gioco delle operazioni cloud con Kubernetes Automation e ridurre i costi nel processo
Linux
  1. È possibile tracciare i comandi integrati su Bash?

  2. Come modificare il reindirizzamento dell'output di un processo in esecuzione?

  3. Linux:come ottenere l'ora dell'orologio da parete di un processo in esecuzione?

  4. Come personalizzare il completamento automatico di Bash per elencare i file in un'altra directory?

  5. Come ottenere il Tty in cui è in esecuzione Bash?

Come utilizzare il comando di lettura Bash

Come elencare i processi in esecuzione in Linux

Reptyr:sposta un processo in esecuzione da un terminale all'altro senza chiuderlo

Come visualizzare i processi in esecuzione di qualsiasi utente in SSH?

Come posso aumentare il buffer di scorrimento all'indietro in una sessione dello schermo in esecuzione?

Come staccare la sessione ssh senza uccidere un processo in esecuzione?