Vím, jak přesměrovat výstup a jak je potlačit v bash. Nyní předpokládejme, že jsem omylem zapomněl k příkazu připojit část přesměrování výstupu (např. 2>&1
nebo > /tmp/mystdout
) a můj proces na pozadí již nějakou dobu běží, mohu se přesto změnit na stdout
a stderr
jsou psány? Opravdu bych rád nezabil a nerestartoval aplikaci.
Abych byl konkrétnější, jak požádal Gilles ve svém komentáři, rád bych si s tím pohrál v těchto scénářích konkrétně:
- nesprávný výstupní soubor
- zapomněli jste přesměrovat
stderr
nastdout
nebo kombinaci obou
Např. Mám spuštěný Apache a vidím deskriptory souborů:
/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log
Přijatá odpověď:
Můžete to udělat pomocí přesměrování (https://github.com/jerome-pouiller/reredirect/).
reredirect -m /dev/null <PID>
Počáteční výstup vašeho procesu můžete později obnovit pomocí něčeho jako:
reredirect -N -O <M> -E <N> <PID>
(<M>
a <N>
jsou poskytovány předchozím spuštěním přesměrování).
přesměrování README
také vysvětluje, jak přesměrovat na jiný příkaz nebo přesměrovat pouze stdout nebo stderr.