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


159

Bir SSH kabuğunda çalışan bir programım var. Duraklatmak ve geri döndüğümde uygulamasını duraklatmak istiyorum.

Bunu yapmayı düşündüğüm bir yol, sahipliğini bir ekran kabuğuna aktarmak, böylece orada çalışmaya devam etmekti.

Devam etmenin farklı bir yolu var mı?


8
Ayrıca bakınız Çoktan başlatılmış bir işlemden nohup / screen görüntüleyebilir miyim? ve (şu anda) burada bahsedilmeyen ptrace tabanlı çözümlerden bahseden, düşürülmüş SSH oturumunda çalışan Resume komutu .
Gilles

Unix.stackexchange.com/a/4039/13496 gibi sorulardan retty ve neercs hakkında duyuyorum . Hmmm ... Bir dahaki sefere bir süreç çalıştırmadan önce "burada ekran " bir katman gibi bir smth olup olmadığını merak ediyorum Gelecekte en üst terminali kaybetmem gerekir mi, stdin / out / err içinde geri çekilmeyi kolaylaştıracak
Marcos

Bu sorudaki ikincil / örtük mesele, kulağıma gelemiyorum ... neden arka planda , stdin için ihtiyaç duymayan / beklemiyorsa, yeni / yeni başlatılmış bir kişi varken kabuk neden askıya alınmış bir işi reddetti ? Alıştığım muamele bu, burada neyin farklılaştığını bilmemek ...
Marcos

Yanıtlar:


86

GNU'yu kullanmak screenen iyisidir.

Ekran yayınlanmaya başladığında ilk giriş - Gitmem screen -D -R, senin komutunu çalıştırın, ve ya ayırma veya onu askıya CTRL-Zardından basarak ekrandan ayırın CTRL-Asonra D.

Makineye tekrar giriş yaptığınızda, tekrar çalıştırarak bağlanın screen -D -R. Daha önce olduğu gibi aynı kabukta olacaksın. Bunu jobsyaptıysanız askıya alınmış işlemi görmek için koşabilir ve %1tekrar ön plana çıkarmak için (veya ilgili işi #) çalıştırabilirsiniz .


2
Vay canına, GNU Screen'in cevabının şu anda en düşük not olduğuna inanamıyorum. Bir şey mi eksik?
Faheem Mitha

1
Belki! Bana en iyisi gibi geldi.
Andrew Yochum

1
Geriye dönüp bakıldığında, buna göre plan yapabilmeniz ve süreçlerinizi ekran ortamından başlatabilmeniz şartıyla, en acısız çözüm olduğu açıkça görülüyor. Neyse, resmi cevabı verdim!
levesque

28
Bence bu soruya cevap vermiyor. Soru " Çalışan bir programım var " ile başlar . Bu cevap henüz çalışmadığını
sanıyor

evet o açıkça bir ekran oturumu içine almak istediğini yazdı :-)
Florian Heigl

112

Programın “sahipliğini” kabuğundan disownyerleşik olarak iptal edebilirsiniz :

# press Ctrl+Z to suspend the program
bg
disown

Ancak bu yalnızca kabuğa kabuk SIGHUPçıkınca programa bir sinyal göndermemesini söyler . Program, terminalle olan bağlantılarını, genellikle standart giriş, çıkış ve hata akışları olarak koruyacaktır. Bunları başka bir terminale tekrar bağlamak mümkün değildir. ( Ekran her pencere için bir terminal taklit ederek çalışır, böylece programlar ekran penceresine eklenir.)


O (yani kullanarak bir hata ayıklayıcı programını ekleyerek farklı bir dosyaya FileDescriptorları boşaltmanın takın mümkündür ptrace) ve çağrı yapma open, dupve close. Bunu yapan birkaç araç var; Bu zor bir işlemdir ve bazen işlem yerine çökeceklerdir. Olasılıklar (cevaplardan toplanan bağlantılar arasında Çalışan bir işlemi nasıl reddedebilir ve yeni bir ekran kabuğuyla ilişkilendirebilirim?) Ve daha önce başlatılmış bir işlemi nohup / ekranlayabilir miyim? ):


disownişlemi iş kontrol listesinden siler.
ctrl-alt-delor

3
Neden olmasın disown -h?
Cees Timmerman

@CeesTimmerman İşi kabuğun iş masasında bırakan, ancak bunun avantajı nedir?
Gilles

@Gilles: Demek ki hala yapabilirsin fgya killda kendi başına mı biteceğini gör.
Peter Cordes

Bahsedilen kamu hizmetleri bir grup süreçle (örn. bzcat a.bz2 | grep text) Çalışıyor mu? Adam reptyr, süreçleri çocuklarla taşımayı desteklemediğini söylüyor.
dma_k

64

Bir işlemi terminaller arasında hareket ettirmek veya yok olmuşları yeniden bağlamak için, örneğin reptyr kullanabilirsiniz .


1
Evet, kurtardı, teşekkürler! Yazarın web sitesini benzer veya daha eski araçlardan daha iyi nasıl çalıştığını okudum. ncurses programları için.
Marcos

4
Bu harika; Bir arkadaşının ssh ile doğrudan çalıştırarak ve sonra bir trene binmeye ihtiyaç duyarak çalışmalarını sürekli kaybetme konusundaki zorluğunu çözmelidir. "Hata! Ekranı kullanmayı unuttum. Tekrar."
Adam Katz

3
+1 Kabul edilen screencevap elbette ideal olsa da, özellikle çalışmakta olan bir süreci ya da benzerini taşımak için özel bir yol isteyen soruyu yanıtlamıyor screen. Ayrıca bu cevaba bakınız: serverfault.com/a/284795
toxefa

1
Mutlak canlı koruyucu. Kullanıcı onayı beklerken oturmakta olan apt dist yükseltme işlemine yeniden bağlanmama izin verdi.
şubatta

28

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

Önceki oturumdan ayrıldığınızda terminali güvenle kapatabilirsiniz; daha sonra tmux attachoturumu kapatsanız bile oturuma geri dönmek için kullanın .


1
Ayrıca oturumunuzu arkadaşınızla paylaşabilir ve birden çok pencere, bölme ve çok daha fazlasını kullanabilirsiniz! love it ^ _ ^
igor

kullanma örneği lütfen?
Vitaly Zdanevich

21

Ayrıca, çalışan programları başka bir terminale tekrar takmanızı sağlayan retty adı verilen küçük bir yardımcı program vardır.


19

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


2
İlginç. Kirli ( ptrace) çalıyor , ancak sadece dosya tanımlayıcılarını değiştirmiyor, süreci zorluyor. Kapmak mümkün find /, ancak etkileşimli bir bash çöktü.
Gilles

@Gilles Ne zaman denedim nasıl gittiğini hatırlayamıyorum, ama büyük bir üne sahip değil, oldukça düzenli bir şekilde başarısız olduğu söylendi
Michael Mrozek

9

Sadece duraklatmak ve daha sonra yeniden başlatmak istiyorsanız, killile STOPveya CONTsinyal kullanabilirsiniz .

İlk başta PID ile süreçleri öğrenmek

$ ps aux

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

$ kill -STOP <PID>

$ kill -CONT <PID>

9

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

https://github.com/ThomasHabets/injcode

Enjeksiyon programı, önceden tanıdığınız ve ekran veya tmux çalıştırıp çalıştırmadığınızı fark etmeden, keyfi bir kodun çalışan bir işleme enjekte edilmesini sağlar.

README'den:

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

Belki bir ekrana taşırız.

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

Enjeksiyon kodunu başka bir terminalde çalıştır: $ injcode -m retty

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


1

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

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

reptyr'nin -Lçalışması için bu almak 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.