GNU/Linux >> Znalost Linux >  >> Linux

Jak zobrazit výstup běžícího procesu v jiné relaci Bash?

Nechal jsem skript spuštěný na vzdáleném počítači z doby, kdy jsem na něm lokálně pracoval. Mohu se připojit přes SSH k počítači jako stejný uživatel a vidět skript spuštěný v ps .

$ ps aux | grep ipcheck
myuser  18386  0.0  0.0  18460  3476 pts/0    S+   Dec14   1:11 /bin/bash ./ipchecker.sh

Jednoduše se odesílá na stdout v místní relaci (spustil jsem ./ipchecker.sh vytvořit místní terminálové okno, žádné přesměrování, žádné použití screen atd).

Mohu přesto z relace SSH zobrazit výstup tohoto spuštěného příkazu (bez jeho zastavení)?

Zatím nejlepší, co jsem našel, je použít strace -p 18386 ale po obrazovce mi létají hordy textu, je až příliš podrobný. Mohu zastavit strace a pak prosít výstup a najít text, který přenesete vytištěný na stdout, ale je velmi dlouhý a matoucí, a samozřejmě, když je zastaven, mohl bych něco přehlédnout. Chtěl bych najít způsob, jak vidět výstup skriptu naživo, jako bych pracoval lokálně.

Může to někdo zlepšit? Jasnou odpovědí je restartování skriptu s přesměrováním nebo na screen session atd., toto není kritický skript, takže bych to mohl udělat. Spíše to však vidím jako zábavné učení.

Přijatá odpověď:

Pokud vše, co chcete udělat, je špehovat existující proces, můžete použít strace -p1234 -s9999 -e write kde 1234 je ID procesu. (-s9999 vyhýbá se zkrácení řetězců na 32 znaků a write systémové volání, které vytváří výstup.) Pokud chcete zobrazit pouze data zapsaná na konkrétním deskriptoru souboru, můžete použít něco jako strace -p1234 -e trace= -e write=3 abyste viděli pouze data zapsaná do deskriptoru souboru 3 (-e trace= zabraňuje protokolování systémových volání). To vám neposkytne výstup, který již byl vytvořen.

Pokud se výstup posouvá příliš rychle, můžete jej napojit na pager, například less , nebo jej odešlete do souboru s strace -o trace.log … .

U mnoha programů můžete přesměrovat následný výstup pomocí hacku ptrace, buď na váš aktuální terminál, nebo na novou relaci obrazovky. Viz Jak mohu odmítnout běžící proces a přiřadit jej k novému prostředí obrazovky? a další propojená vlákna.

Všimněte si, že v závislosti na tom, jak je váš systém nastaven, možná budete muset spustit všechny tyto strace příkazy jako root, i když proces běží pod vaším uživatelem bez dalších oprávnění. (Pokud proces běží jako jiný uživatel nebo má setuid nebo setgid, budete muset spustit strace jako root.) Většina distribucí umožňuje procesu pouze sledovat své potomky (to poskytuje mírnou bezpečnostní výhodu – zabraňuje přímému vložení malwaru, ale nebrání nepřímému vložení úpravou souborů). Toto je řízeno kernel.yama.ptrace_scome sysctl.

Související:Jak vyhrát hru Cloud Operations s automatizací Kubernetes a snížit náklady v tomto procesu
Linux
  1. Je možné vysledovat Builtin Commands To Bash?

  2. Linux – jak získat čas nástěnných hodin běžícího procesu?

  3. Jak přizpůsobit automatické doplňování Bash tak, aby vypisovalo soubory v jiném adresáři?

  1. Jak získat Tty ve kterém Bash běží?

  2. Jak zobrazit běžící procesy libovolného uživatele v SSH?

  3. Může být ID vlákna vícevláknového procesu stejné jako ID procesu jiného běžícího procesu?

  1. Jak mohu udržet proces při životě po ukončení relace putty?

  2. Jak mohu znát absolutní cestu běžícího procesu?

  3. Jak získat pouze ID všech běžících procesů?