it-swarm-tr.com

Çalışan bir işlemi reddedebilir ve yeni bir ekran kabuğuyla nasıl ilişkilendirebilirim?

SSH Shell'de çalışan bir programım var. Geri dönmek istediğimde duraklatmak ve yürütmeyi duraklatmak istiyorum.

Bunu yapmayı düşündüğüm bir yol, sahipliğini bir ekran Shell'e aktarmak ve böylece orada çalışmasını sağlamaktı.

Devam etmenin farklı bir yolu var mı?

164
levesque

GNU screen kullanmak en iyi seçenektir.

İlk oturum açtığınızda ekranı çalıştırmaya başlayın - screen -D -R Komutunu çalıştırıyorum, komutunuzu çalıştırıyorum ve CTRL-Z İle bağlantısını kesip askıya alıyorum ve sonra CTRL-A Ve D.

Makineye tekrar giriş yaptığınızda, screen -D -R Çalıştırarak yeniden bağlanın. Daha önce olduğu gibi aynı Kabuğun içinde olacaksın. Yaptıysanız askıya alınan işlemi görmek için jobs çalıştırabilir ve yeniden ön plan yapmak için %1 (Veya ilgili iş #) çalıştırabilirsiniz.

88
Andrew Yochum

Programın “sahipliğini” Kabuk'tan disown yerleşik ile iptal edebilirsiniz:

# press Ctrl+Z to suspend the program
bg
disown

Ancak bu yalnızca Shell'e programdan SIGHUP sinyali göndermemesini söyler. Program, terminal ile olan herhangi bir bağlantıyı, genellikle standart giriş, çıkış ve hata akışları olarak tutacaktır. Bunları başka bir terminale yeniden bağlamanın bir yolu yoktur. ( Ekran her pencere için bir terminal öykünerek çalışır, böylece programlar ekran penceresine eklenir.)


Programı bir hata ayıklayıcıya ekleyerek (yani ptrace ) ve open, dup ve close. Bunu yapan birkaç araç vardır; bu zor bir işlemdir ve bazen bunun yerine işlemi kilitlerler. Olasılıklar arasında (yanıtlardan toplanan bağlantılar Çalışan bir işlemi nasıl reddedebilir ve yeni bir ekran kabuğuyla nasıl ilişkilendirebilirim? ve Önceden başlatılmış bir işlemi Nohup/ekranlayabilir miyim? =):

Bir işlemi terminaller arasında taşımak veya beğenilmeyen bir kişiyi yeniden bağlamak için örn. reptyr .

67
jofel

En sevdiğim çözüm tmux kullanıyor, oturumu ayırabilir ve başka bir terminale tekrar takabilirsiniz.

Önceki oturumdan ayrıldığınızda terminali güvenle kapatabilirsiniz; daha sonra tmux attach Oturumu kapatmış olsanız bile oturuma geri dönmek için.

28
daisy

Ayrıca, çalışan programları başka bir terminale yeniden bağlamanızı sağlayan retty adlı küçük bir yardımcı program da vardır.

21
adamg

Düzenli kullanmıyorum, ancak neercs bunu desteklediğini iddia ediyor. Daha iyi bölme yönetimi gibi çeşitli fantezi özelliklere sahip bir screen- benzeri bir programdır, ancak sunduğu en önemli şey, bir işlemi bölmeye içe aktarabilme yeteneğidir

19
Michael Mrozek

Sadece duraklatmak ve daha sonra yeniden başlatmak istiyorsanız, kill ile STOP veya CONT sinyali kullanabilirsiniz.

İlk önce PID süreçlerini

$ ps aux

Ardından sinyalleri işleme dahil edilen PID'ye gönderin

$ kill -STOP <PID>

$ kill -CONT <PID>
9
yunzen

ThomasHabets "injcode" tam olarak ihtiyacım olan şey gibi görünüyor:

https://github.com/ThomasHabets/injcode

Injcode programı, önceden biliyor olsanız da olmasanız da ekran veya tmux çalıştırıyor olsanız da, rastgele bir kodun çalışan bir sürece enjekte edilmesini sağlar.

README'den:

Örnek 1: irssi'yi bir terminalden diğerine taşıma

Belki bir ekrana taşıyın.

İlk olarak irssi'yi bir terminalde başlatın.

Injcode'u başka bir terminalde çalıştırın: $ injcode -m retty

Irssi şimdi yeni bir kontrol terminaline sahip olmak üzere ikinci terminale taşınmalıdır.

9
user2688272

Bu benim için çalıştı:

  1. bg süreç
  2. jobs -l işlem numarasını bul
  3. tmux Shell pencere yöneticisini başlat
  4. reptyr -L PROCESSNUMBER

reptyr 's -L bunun çalışması için gerekliydi:

-L Like '-l', but also redirect the child's stdio to the slave.

bu hata nedeniyle:

$ reptyr 30622

[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied

Ve -L ile

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
1
kqw