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ı?
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.
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 .
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.
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.
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
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>
ThomasHabets "injcode" tam olarak ihtiyacım olan şey gibi görünüyor:
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.
Bu benim için çalıştı:
bgsüreç
jobs -lişlem numarasını bul
tmuxShell pencere yöneticisini başlat
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