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.