Odpojil jsem proces od terminálu, jako je tento:
$ process &
Ten terminál je nyní dlouho uzavřený, ale process
stále běží a já chci poslat nějaké příkazy do stdin tohoto procesu. Je to možné?
Ano to je. Nejprve vytvořte potrubí: mkfifo /tmp/fifo
. K procesu se připojte pomocí gdb: gdb -p PID
Pak zavřete stdin: call close (0)
; a znovu jej otevřete: call open ("/tmp/fifo", 0600)
Nakonec odepište (z jiného terminálu, protože gdb bude pravděpodobně viset):
echo blah > /tmp/fifo
Když původní terminál již není přístupný ...
reptyr
může být to, co chcete, viz https://serverfault.com/a/284795/187998
Citace odtud:
Podívejte se na reptyr , což přesně dělá. Stránka github obsahuje všechny informace.reptyr - nástroj pro "re-ptying" programy.
reptyr je nástroj pro převzetí existujícího spuštěného programu a jeho připojení k novému terminálu. Zahájili jste dlouhodobý proces přes ssh, ale musíte odejít a nechcete jej přerušit? Stačí spustit obrazovku, pomocí reptyru ji chytit, a pak zabít ssh relaci a hlavu doma.
POUŽÍVÁNÍ
reptyr PID
"reptyr PID" vezme proces s id PID a připojí jej k vašemu aktuálnímu terminálu.
Po připojení přebírá proces vstup a zápis na nový terminál, včetně ^ C a ^ Z. (Bohužel, pokud to na pozadí, budete stále muset spustit "bg" nebo "fg" ve starém terminálu. To je pravděpodobně nemožné opravit přiměřeným způsobem, aniž by záplatování Shell.)
Jsem si jistý, že nemůžete.
Zkontrolujte pomocí ps x
. Pokud má proces ?
as ovládající tty , již do něj nemůžete posílat vstupy.
9942 ? S 0:00 tail -F /var/log/messages
9947 pts/1 S 0:00 tail -F /var/log/messages
V tomto příkladu můžete odeslat vstup do 9947
dělá něco jako echo "test" > /dev/pts/1
. Druhý proces (9942
) není dosažitelný.
Příště můžete použít obrazovka nebo tmux , abyste se této situaci vyhnuli.
[~ # ~] editovat [~ # ~] : Jak řekl Stephane Gimenez, není to tak jednoduché. Umožňuje pouze tisknout na jiný terminál.
Můžete se pokusit napsat tento proces pomocí /proc. Měl by být umístěn v /proc/ pid /fd/0, takže jednoduchý:
echo "hello" > /proc/PID/fd/0
měl by to udělat. Nezkoušel jsem to, ale měl by fungovat, pokud má tento proces stále platný deskriptor souboru stdin. Můžete to zkontrolovat pomocí ls -l
on /proc/ pid /fd /.
Viz Nohup pro více informací o tom, jak udržet procesy v chodu.
Pouze ukončuji příkazový řádek pomocí &
proces úplně neodpojí, pouze jej spustí na pozadí. (S zsh
můžete použít &!
abyste ji skutečně odpojili, jinak to musíte udělat disown
později).
Když proces běží na pozadí, nebude již přijímat vstup od svého ovládacího terminálu. Můžete jej však poslat zpět do popředí pomocí fg
a poté znovu načte vstup.
V opačném případě není možné externě změnit své filedescriptory (včetně stdin) nebo znovu připojit ztracený ovládací terminál ... pokud nepoužíváte nástroje pro ladění (viz odpověď Ansgara , nebo se podíváte na retty
příkaz).