it-swarm-eu.dev

Jak připojím terminál k oddělenému procesu?

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é?

107
Rogach

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

117

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.)

34
NiKiZe

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.

12
andcoz

[~ # ~] 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 /.

  • pokud je to odkaz na/dev/null => je uzavřen
  • pokud je to odkaz na/dev/pts/X nebo soket => je otevřený

Viz Nohup pro více informací o tom, jak udržet procesy v chodu.

6
Coren

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).

5