Terminalden arka planda çalışan programlar


136

Bir programı bir kabuğun arka planında, programı çalışır halde bırakırken kabuğunu kapatma özelliğine sahip olarak nasıl çalıştırabilirim? Diyelim ki kullanıcı arayüzümde sorun var ya da herhangi bir nedenle terminal penceresinden bir program başlatmam gerekiyor, diyelim nm-applet:

nm-applet

Başladığında, terminal penceresinin önünü kaplar.

Terminali açık bırakmadan veya tüm terminali meşgul etmeden programı arka planda çalıştırmanın basit bir yolu var mı?

Bu notta, programları terminalden çalıştırmak için bir &komut buldum ve komuta bir işaretçi ( ) ekleyerek diğer girişlere izin vermesini sağladım :

nm-applet &

Ancak terminalde başlatılan herhangi bir işlem terminal kapatıldıktan sonra öldürüldüğü için bu pek kullanışsızdır.                                                                        


7
nohup 'komut' & Bu iş gibi görünüyor. Bununla bir problemin var mı?
OVERTONE

Yanıtlar:


173

Son zamanlarda beğenmeye geldim setsid. Sadece terminalden bir şey çalıştırıyormuş gibi görünmeye başlar, ancak bağlantıyı kesebilirsiniz (terminali kapatın) ve çalışmaya devam eder.

Bunun nedeni, komutun gerçekten devre dışı kalması ve girişin geçerli terminale ulaşması sırasında tamamen farklı bir ebeveyne (terminali kapattıktan sonra hayatta kalan) ait olmasıdır.

Bir örnek:

setsid gnome-calculator

Ayrıca disownbir süreci mevcut ağaçtan ayırmak için kullanılabilecek oldukça kısmi biriyim . Arka plan ve işareti ile birlikte kullanın:

gnome-calculator & disown

Ayrıca alt parantezleri parantezle yumurtlamayı da öğrendim. Bu basit yöntem işe yarar:

(gnome-calculator &)

Ve tabiki nohupdediğiniz gibi. Vahşi değilim nohupçünkü ~/nohup.outsormadan benden yazmaya meyilli . Buna güveniyorsan, senin için olabilir.

nohup gnome-calculator

Ve uzun vadeli süreçler için, screenbağlantılar arasında oturumları canlı tutan diğer sanal terminal-muxerler gibi şeyler var . Bunlar muhtemelen sizin için gerçekten geçerli değil çünkü terminal çıkışına geçici olarak erişmek istiyorsunuz, ancak bir süre sonra geri dönmek ve en son terminal etkinliğini görüntülemek istiyorsanız, ekran muhtemelen en iyi seçim olacaktır.

İnternet derslerle doludur screenancak işte basit bir hızlı başlangıç:


Oli, EKRAN durumunda =: 0 birlik - yukarıdakilerden hangisini kullanacağınızı ve neden kullanacağınızı değiştirin?
Natty

4
Kendi kabuk oturumunda sürü sarın @nuttyaboutnatty: sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown. Her şey için doğru şekilde çatal olduğundan emin olmak için benim çözümüm bu.
Oli

1
@ nuttyaboutnatty Demek istediğim bu ama iki örnekle --replacesonuçlanmayacaksınız, çünkü kulağa nasıl geldiğini ve aslında eski örneğe son veriyor. Xsession içinden ikinci kez çalıştırılması, kopyayı TTYn'e bağlı olarak sonlandırır ve gerekirse, gelecekte kullanmanıza izin verir. Muhtemelen bunu yapmanın daha iyi bir yolu var, ama her ihtiyacım olduğunda aklıma ne geliyor?
Oli

1
Mükemmel, benim için işe yarayan alt kabuk '(cüce-hesap makinesi)' idi. Arka planda bir mono konsol uygulamasını başlatmak için kullanıyorum. Diğer tekniklerle, mono uygulama anında çökecektir.
Nikolaos Georgiou

2
Gelecekteki kullanıcılara not : nohup.outstdout ve sterr'nin yeniden yönlendirilmesiyle oluşturma işlemi bastırılabilir /dev/null:nohup firefox &> /dev/null &
Sergiy Kolodyazhnyy

55

İşte birlikte gideceğim iki yol. İlk olarak, bir terminalden çalıştırmamak; hit Alt+ F2koşmak iletişim kutusunu açın ve oradan (olmadan &) çalıştırmak için.

Bir terminalden koş

nm-applet &

Ancak terminali kendiniz KAPATMAYIN. Diğer bir deyişle, kapatmak için X düğmesine basmayın ve menü çubuğundan File -> Exit kullanmayın. Terminali bu şekilde kapatırsanız, içinde çalışan bash'e bir HUP (Hang UP) sinyali gönderir, bu sırayla HUP sinyalini tüm çocuklarına gönderir (bu nedenle nohup bu nedenle çalışır).

Bunun yerine, kabuğunu + çalıştırarak exitveya vurarak çıkın . bash daha sonra çocuklarından vazgeçecek, sonra arka plan işlemlerini devam ettirerek çıkacak. Bash çıkınca, terminal çocuk sürecini kaybetti, bu yüzden de kapanacak.CtrlD

Hepsini bir kerede yapmak:

nm-applet & exit

Bu harika! Bunu asla bilemezsiniz ve bundan bahseden tek kişi sizsiniz. Kesinlikle bu Masaüstü Ortamında benim en sevdiğim yaklaşım. Çok kötü, daha fazla oy veremem; p
7hi4g0

Bunu farklı bir uygulamayla denedim ve başarısız oldu: matlab & exitİki ayrı komut olarak çalıştırmak iyi çalıştı:matlab & exit
MattKelly

OP'nin terminali kapatmanın neden arka plan programlarının çökmesine neden olduğunu söylediğini merak ediyordum. Penceredeki "x" tuşuyla bir terminali kapatmayı hiç denemedim.
user1717828

x düğmesi öldürmeden temiz bir şekilde çıkmaz, exit komutu çıkar. x düğmesini bunun yerine bir çıkış komutuna getirebilirsin ...
Tim Baker

14

Gösterdiğin gibi koşabilirsin

nohup nm-applet &  

terminali kapatırken bitiş sinyalini yoksaymak için. Bununla ilgili bir sorun yok.


Başka alternatif var mı? Sadece
bilimler

Wikipedia'da ( en.wikipedia.org/wiki/Nohup ) echo command | at nowçalışmam için kullanamadığım bir öneri var .
desgua,

2
Bir simgeye veya programa çift tıkladığınızda kullanıcı arayüzünden nasıl çalıştığını merak ediyorum.
OVERTONE

execnohup <command> &arka planda bir işlemi çalıştırmak ve mevcut kabuk istemini döndürmek için bir alternatif sunar .
JSStuball

12

Diğer pek çok cevabın eksik olduğu şeylerden biri, şu anda kabuğu engelleyen çalışan bir işlemin nasıl çözüleceğidir. Çoğu terminalde ve mermide, Ctrl+ Zçalışan işlemi durduracak ve bir giriş istemine geri döndürecektir. O zaman yayınlayabilirsin

bg

çalışan işlemi arka plana göndermek için. Konu

fg

yerine çalışan işlemi ön plana çıkarmak.

EDIT : Bu cevapta daha fazla ayrıntıyı daha sonra keşfettim.


7

(exec PROGRAM &> /dev/null & )Alt kabuğun PID'ini ele geçirmesine izin vermek için kullanın PROGRAM. Birkaç kez bu yaklaşımı birkaç farklı programla test ettim. Orijinal terminalin kapatılmasının yeni doğmuş program üzerinde bir etkisi yoktur.

Küçük demo:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working

Hmmm (exec firefox), Firefox'tan çıkana kadar terminali kapattı ... ve terminali kapatan kabuğunu ve alt kabuğunu SIGHUPs
kos

Cevabımı düzenledim. Başka birkaç programla test edildi. Bu versiyonda kontrol terminalini sarkan firefox veya başka bir program görmedim
Sergiy Kolodyazhnyy

benim için iyi çalışıyor
Zanna

Bash exec kullanmanın gerekli olduğuna inanmıyorum, bir nedenden ötürü PID'ye ihtiyacınız olabilir.
marinara

2

Byobu terminalini tavsiye edebilirim. İşleminizi F6 tuşuna basarak kolayca ayırabilirsiniz.


1

Yukarıdaki cevapların iyi olmasına rağmen, MATLAB'ı arka planda nasıl kullandığım konusunda 2 sent vermek istiyorum.

sudo -b matlab

-bSudo etiket arka planda uygulamaları çalıştırabilir. Bu komutu yürüttükten sonra da terminali kapatabilirsiniz.

Muhtemelen, ilgisiz ama kabuk komutlarını açıklamak için kullanabileceğiniz harika bir web sitesi var. http://explainshell.com/explain/8/sudo


0

Bunun doğru yolu olduğunu bilmiyorum ama bir öncekini bırakarak başka bir oturuma başlıyorum. Mesela ahududu üzerinde basit bir web sunucusu koştum. web.py olanı. sonra yalnız bırakırken yeni bir seans başlatıyorum. bu kadar. diğer oturumda çalışmış olsanız bile, hala güncellenmeye devam ettiğiniz için de faydalıdır.


2
Ubuntu'ya Sormaya Hoş Geldiniz! Bunun nasıl yapılacağı hakkında ayrıntılı bilgi vermek için bu cevabı düzenlemenizi öneririm . (Ayrıca bkz İyi bir cevap yazmak nasıl? Cevapların türlü Ask Ubuntu en değerli kabul yaptığınız hakkında genel öneri niteliğinde değildir.)
David Foerster

0

KDE kullanılması durumunda da kstart, programınızı terminalden bağımsız olarak çalıştıracak olanı kullanabilirsiniz . Ayrıca KDE ortamının komut için doğru şekilde ayarlandığından da emin olur. ( kstart.cppBaşvuru için kaynak koduna bakın . Gördüğünüz gibi oradan kullanır KProcess::startDetachedve KProcesstüretilir QProcessve startDetachedyeni bir işlem başlatır ve bu işlemden ayrılır.)

Benzer kde-openya xdg-openda veya gnome-open.


Bu haliyle, neredeyse bir cevaptan çok bir yorum gibi gözüküyor. Lütfen genişletmek için düzenleyin . Sadece bir astar vermeyin; neden haklı olduğunu açıklayın, ideal olarak alıntılarla. Açıklamasız cevaplar kaldırılabilir.
Anonim2
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.