Çocuklarını öldürmeden bir terminali nasıl kapatabilirim (önce “ekran” olmadan)?


35

Bazen gnome-terminalinde bir uygulama çalıştırıyorum, fakat sonra birden bire cüceyi yeniden başlatmam gerekiyor. Sanırım sorunun cevabı da yararlı, o zaman bir şeylerin olduğu SSH ile olan bağlantısını kesmek istiyorum.

Gnome'un terminal ağacı şöyle görünür:

gnome-terminal
    bash
        some-boring-process

'Dan' bashçıkarabilirim ' gnome-terminal(veya some-boring-processbash ' dan çıkarabilir ve çıkışını bir yere yönlendirebilir miyim)? Eğer sadece öldürürsem gnome-terminal, bashtüm alt işlemlerini yapacak şekilde öldürülecek


Yanıtlar:


48

Eğer some-boring-processmevcut bash oturumda çalışıyor:

  1. ctrl-zsana bash istemi vermek için onu durdurmak
  2. arka planda koymak bg
  3. iş numarasını not alın veya jobskomutu kullanın.
  4. İşlemi bu bash oturumundan şununla ayırın disown -h %1(orada asıl iş numarasını girin).

Bu çıktıyı yönlendirmek için hiçbir şey yapmaz - sıkıcı sürecinizi başlattığınızda bunu düşünmeniz gerekir. [Düzenle] Yeniden yönlendirmenin bir yolu varmış gibi görünüyor https://gist.github.com/782263

Ama cidden, ekrana bak. Aylardır çalışan uzaktaki bir sunucuda kabukları var.


Teşekkür ederim. Cevabınızı seçtim, çünkü soruyu cevaplayan tek kişi oydu ( zaten çalışan bir işlemdi). Zaten screenbazen kullanıyorum , sorunları olmasına rağmen ve hayatımdaki her bash seansı için kullanmak istemiyorum
valya '

Her bash seansı için değil, çok zaman harcadığınız her uzak makine için kullanırsınız.
Glenn jackman

Çıktının yönlendirilmesi hakkında bilgi ekleme özgürlüğünü aldım, lütfen gözden geçirin!
valya

[root @ server ~] # bg -bash: bg: geçerli: böyle bir iş yok
Muhammad Dyas Yaskur

Neden var bash: bg: current: no such job?
Muhammad Dyas Yaskur

10

Bu tam olarak ekran ve tmux için yaratılmış. Kabuk ekran / tmux oturumu içinde çalıştırın ve istediğiniz zaman bağlantısını kesebilir / yeniden bağlayabilirsiniz. Ayrıca bir gnome-terminalinde çalışan çoklu kabuk oturumlarına sahip olabilirsiniz.


Teşekkürler, ama kabul edilen cevaba yorum yaptığım gibi: 1. soru zaten çalışan süreci ile ilgiliydi. 2. screensorunları var ve hayatımdaki her bash seansı için kullanmak istemiyorum
valya

6

screen, tmuxveya dtach(muhtemelen ile dvtm) bunun için harikadır, ancak bunlardan birini kullanmayı düşünmediğiniz bir şeyse, kaldıraç yapabiliyor olabilirsiniz nohup.


Teşekkürler, ama kabul edilen cevaba yorum yaptığım gibi: 1. soru zaten çalışan süreci ile ilgiliydi. 2. screensorunları var ve hayatımdaki her bash seansı için kullanmak istemiyorum
valya

@ valya Bir çözüm bulduğunuza sevindim. Ancak net olmak gerekirse nohup, -p(varsa) seçeneğini kullanarak çalışan bir işlem üzerinde çalışır .
Hank Gay

@Hank Gay: Man sayfalarında bir -pseçenek göremiyorum nohup; hangi sistemdesin
Mikel

@Mikel Endişelenmeyi bırakmayı ve sevmeyi öğrenmeden önce , bir Solaris kutusundaki seçeneği tmuxkullandım -p. Ayrıca bir melez CentOS kutusunda (muhtemelen zshonu destekleyen bir yerleşimi var mı?) Yapmanın belli belirsiz anılarım var ama bu konuda herhangi bir belge bulamıyorum.
Hank Gay

@Hank Gay: Ne Ubuntu Linux sistemimde ne bashde zshsağlar nohup.
Mikel

4

Eğer sadece arka planını oluşturmaktan ve devam ettirmek yerine çocuk süreciyle etkileşime devam etmek istiyorsan, aslında bir süreci mevcut tty'inden “çalmak” ve yeniden bağlamak için kavram kanıtı olan retty adı verilen bir program var . mevcut olan.

Bununla birlikte, bazı montaj kodlarının yeniden eklenen uygulamanın yığına yapıştırılması dahil olmak üzere bazı korkunç şeyler yapar. Ve bu kod x86_64 için güncellenmedi.

Kullanıcı alanındaki işlemi bir dosyaya dondurup daha sonra geri yüklenebileceği (muhtemelen başka bir tty'de) , belki de daha iyi bir yaklaşım gerektiren başka bir program var. Bu kriyoptur ve bu proje de durmuş görünüyor. kavram kanıtı aşamasıdır ve kodda olduğu gibi modern Linux ile çalışmaz. Ah iyi.

Bunun bütünlük için burada olması gerektiğini düşündüm. Korkunç vudu için sakıncası yoksa, bu olasılık alanı içindedir - en azından teorik olasılık.


1
Bu bana bana gist.github.com/782263 'u hatırlatıyor ... oh, bu fikir benim soruma da cevap veriyor gibi görünüyor
valya

2

Ne olursa olsun bitirmek istediğim bir şeyi ateşlersem (sistem yeniden başlatılırsa), nohuparka planda kullanır ve çalıştırırım. Ekrandan ve benzerlerinden farklı olarak işlemlere yeniden bağlanamazsınız. Ancak, herhangi bir çıktının başka bir yerinde yönlendirmesini engelleme içinde bulunabilir nohup.out.

screenBir işlem için terminalleri değiştirmek istediğimde kullanıyorum . Evden / işten bir süreci başlatmak ve diğerine geçmek gibi. Diğer herhangi bir terminal oturumunda olduğu gibi, çıkış sonunda arabellek üstünden kaydırılır.

EDIT: Süreci daha önce başlattıysanız , işlem kapandığında sinyalin gönderilmesini disownönlemek için işlemi yapabilirsiniz HUP.


Teşekkürler, ama kabul edilen cevaba yorum yaptığım gibi: 1. soru zaten çalışan süreci ile ilgiliydi. 2. screensorunları var ve hayatımdaki her bash seansı için kullanmak istemiyorum
valya

@ valya Çalışan bir sürecin program grubundan bağlantısının kesilmesi için referanslar gördüm. Bunu yapmak için hiçbir araç bilmiyorum. Aracın std IO kanallarını da yönlendirmesi gerekebilir. Sanırım bir kere çalışmış olabilirim, ama hiçbir şeyin daha basit olmadığına karar verdim.
BillThor

1

Terminal oturumu sona erdiğinde HUP sinyali almayan bir işlem (PID) yapabilirsiniz. Aşağıdaki komutu kullanın:

nohup -p PID

nohup: invalid option -- 'p'. Ne nohuptür bir sistem üzerinde hangi sürümle çalışıyorsunuz?
Anthon

Ben çoğunlukla Solaris ve AIX kullanıyorum. Linux için disown komutunu kontrol etmelisiniz.
Tony,

Evet, -pLinux'ta seçenek yok , bu yüzden bu cevap Solaris ve AIX'e özgü. Yine de bilmek güzel
Sergiy Kolodyazhnyy

1

Bu komut, alt süreci üst öğeden ayırır ve başlatma işlemine atar :

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
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.