Terminal aracılığıyla bir GUI uygulamasını nasıl temizlersiniz (bu yüzden sonlandırma için beklemez)?

68

Bazı GUI uygulamaları, Terminal komut satırı aracılığıyla temiz bir şekilde başlatılır.

Bazıları bunu yapmaz ve Terminal'in uygulamanın sonlanmasını beklemesine neden olur.
... ve hatta o zaman, bazıları komut satırını "serbest bırakmaz".

Gizemli ampersan "& amp;" Soneki, terminalin işlemi arka plana koymasına neden oluyor gibi görünüyor ... (ama orada ne olduğundan emin değilim).

Terminal üzerinden bir uygulama başlatmanın bir yolu var mı, böylece "bekleme" etkisi yok mu? ... tıpkı F2 aracılığıyla bir şey başlatmak gibi.

Komut satırının tekrar kullanılabilir olmasını istiyorum (hemen arka planda bir şey olmadan ve terminalde sistem mesajını yazarken).

    
sordu Peter.O 31.10.2010 11:50

10 cevap

17

Gedit'in vakasında, her zaman bir kopyasını açık tutuyorum. Mevcut bir kopyanız olduğu sürece, terminalden gedit çağrısını başlatır ve terminali kapatmak gedit'i öldürmez.

Diğer şeyler için, başkalarının söyledikleri de işe yarayacaktı. % Co_de% hayranıyım ... Ama bir terminale ihtiyacınız varsa, ayrılabilir ancak daha sonra yeniden ekleyebilirsiniz, nohup dosyasına bakmak istersiniz.

  1. Bir terminalde çalıştırın ve ardından itme çıkışını tutan bir şey çalıştırın. Django geliştirme sunucusunu kullanıyorum ancak screen veya hatta irssi iyi örnek olabilir.
  2. Terminali öldür ve yeni bir tane başlat.
  3. watch uptime ve BOOM uygulamasını çalıştırın, geri girdiniz.

screen -r , bundan daha büyüktür ve daha iyi bir terminal deneyimi için screen ile birleştirebilirsiniz. Etrafını oku.

    
verilen cevap Oli 31.05.2011 14:25
79

gedit 'in, ayrılmak istediğiniz program olduğunu varsayalım (aka. "disown", "disentangle", "decouple"). Tam olarak ne yapmak istediğinize bağlı olarak farklı yollar vardır:

Program zaten çalışıyor

evlatlıktan:

Çalışmakta olan bir programla bunu yapmak istiyorsanız disown -h yoludur (yani, nohup 'sini unuttuysanız). İlk önce Ctrl + Z kullanarak durdurmalısınız. Daha sonra bg [jobId] kullanarak brackground'a yerleştirebilirsiniz (ör.% Co_de%). % Co_de% kullanarak işlerinde çalışan işlerin bir listesini alırsınız. Bundan sonra onu bg 1 kullanarak terminalden ayırabilirsiniz. Örnek terminal oturumu:

[email protected]:~$ gedit 
^Z
[1]+  Stopped                 gedit
[email protected]:~$ jobs
[1]+  Stopped                 gedit
[email protected]:~$ bg 1
[1]+ gedit &
[email protected]:~$ disown -h %1
[email protected]:~$ exit

Program henüz başlatılmamış

nohup

jobs , tüm makineler için her zaman mevcut değildir. Önceden ayrıştırmak istediğinizi biliyorsanız:

nohup gedit &

Belki de kabuk çıktısını da programa bir sahte giriş kaynağına yönlendirmek isteyeceksiniz, yani: disown -h %[jobId] . Çıktıyı, onun tarafından rahatsız edilmemesi veya daha sonra kullanması için yeniden yönlendirmek istersiniz. Boş giriş, ssh içindeki hickup'ların önlenmesine yardımcı olabilir.

altkabuk:

ile benzer bir etki elde edebilirsiniz

[email protected]:~$ (geany 2>&1 /dev/null &)

Köşeli parantezler, gedit'i çalıştırmak için yeni bir alt kabuk açar. nohup , kabuk çıktısını hiçbir yere yeniden yönlendirmez (çıktının bastırılması). Ve sonunda nohup ./myprogram > foo.out 2> bar.err < /dev/null & işlemi arka plana yerleştirir.

Terminal çoğullaması

Ayrıca, ekran veya byobu . Temelde programı kendi terminalinde çalıştırıyorsunuz. Diğer nedenlerle de byobu'yi gerçekten tavsiye edebilirim. Aşağıda, ilk adımlarınız için kullanışlı olabilecek bir boybu-kısayol listesi verilmiştir:

Faydalı:

  • F2 Yeni bir pencere oluştur
  • F3 Bir sonraki pencereye git
  • F4 Önceki pencereye git
  • F6 Oturumdan çıkın ve çıkış yapın
  • Shift-F6 Oturumdan çıkar, ancak çıkış yapmayın
  • F7 Kaydırma / arama moduna gir
  • Ctrl-F5 Herhangi bir SSH / GPG soketini veya aracısını yeniden bağlayın

Daha az kullanışlı:

Shift-F2 Ekranı yatay olarak ayır - Ctrl-F2 Ekranı dikey olarak ayır - Shift-F3 Odağı bir sonraki bölüme taşıyın - ÜstKrkt-F4 Odağı önceki bölüme taşı - Shift-F5 Tüm bölünmeleri daralt - F5 Tüm durum bildirimlerini yenileyin - F8 Geçerli pencereyi yeniden adlandır - F9 Byobu Yapılandırma Menüsünü Başlat - F12 GNU Ekranının Escape Tuşu - Alt-Sayfaup Bu pencerenin geçmişini gözden geçirin - Alt-Pagedown Bu pencerenin geçmişi boyunca ileri git - Ctrl-a -! Byobu’nun tüm tuş açıklıklarını açar veya kapatır.

'at' deamon ve diğerleri

2>&1 /dev/null , planlanmış bir zamanda bir komutu çalıştırmak için güzel ve kullanışlı bir araçtır. Kabuktan bir komutu çıkarmak için 'yanlış kullanılır':

echo './myprogram myoption1 myoption2' | at now

Ayrıca, & ve at 'ye bakabilirsiniz, ancak diğer yöntemler yeterli olmalıdır.

    
verilen cevap con-f-use 31.05.2011 14:28
25
  

Gizemli ampersan "& amp;" soneki, terminalin işlemi arka plana koymasına neden oluyor gibi görünüyor ... (ama orada ne olduğundan emin değilim).

Yapıyor ve çoğu zaman istediğin şey. & Amp; kullanmayı unutursanız, programı ctrl-z ile askıya alabilir, ardından bg komutuyla arka plana yerleştirebilir ve o kabuğunu kullanmaya devam edebilirsiniz.

'stdin, stdout ve stderr süreci hala terminale bağlı; İstediğiniz şekilde / dev / dev / null veya başka bir dosyadan (örneğin, bir çıktı günlüğünü bir yere kaydetmek) yönlendirebilirsiniz:

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

İşlemi işlerde görebilir, ön plana (fg komutu) geri getirebilir ve sinyal gönderebilirsiniz (komutu öldür).

Bazı grafik programlar terminalden ayrılacaktır; durum buysa, "normal" komutunu çalıştırdığınızda, ve "çıkışlar" grafik programını başlattığını fark edersiniz.

İşte kısa bir komut dosyası , bunu ~/bin :

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename %pre%): missing command" >&2
  exit 1
}
prog="$(which "")"  # see below
[ -z "$prog" ] && {
  echo "$(basename %pre%): unknown command: " >&2
  exit 1
}
shift  # remove , now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "[email protected]" &  # [email protected] is all args

Yeniden yönlendirme yapmadan önce programı ($ prog) araştırıyorum, bu sayede bunların yerini belirlemek için hatalar raporlanabilir. "Runbg komutlarını çalıştır ..." olarak çalıştır; Çıktıyı bir yere kaydetmeniz gerekiyorsa, stdout / err dosyasını bir dosyaya yönlendirebilirsiniz.

Yönlendirmeler ve hata işleme dışında, bu htorque cevabı .

    
verilen cevap Roger Pate 31.10.2010 12:25
20

nohup

kullanın
  

nohup, bekletme sinyalleriyle belirli bir komutu çalıştıran bir programdır   yoksayıldı, böylece komut arka planda çalışmaya devam edebilir   Ebeveyn süreci sona erdikten sonra. Manga ’ya bakın

Örneğin:

nohup gedit something
    
verilen cevap Florian Diesch 31.05.2011 14:10
18

Bir uygulamayı başlatmak ve başlatılan terminalden çıkartmak & amp;!.

firefox &!
    
verilen cevap Rick 31.10.2010 13:20
4

Terminali açın, ekran yazın, çalıştırmak istediğiniz komutu yazın, terminali kapatın. Program, GNU Ekranı oturumunda çalışmaya devam etmelidir.

    
verilen cevap RobinJ 31.05.2011 17:00
1

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

$ (nohup gedit 2>/dev/null &)
    
verilen cevap wesleycoder 31.12.2012 00:20
0

Pek çok insanın düşündüğü gibi, düşünmek gereken şey nohup. Ancak nohup terminalde açık kalır ve program aktivitesini tahriş eden terminalde gösterir. Bundan kaçınmak için terminali daha sonra kapatabilirsiniz. Kullandığım çok basit bir çözüm buldum.

nohup gedit & exit

Ve bu kadar. Gedit açılır ve gedit başladığında terminali kapatır. Gedit şimdi terminal ile ilişkili değil, aktif kalır.

    
verilen cevap Lokesh Devnani 03.09.2015 19:25
0

Bu, bir komut dosyasının içinde bile çalışır (Diğer adlar gibi, '& amp;' fragmanı, etkileşimli olmadıkları için komut dosyalarına normal olarak izin verilmez):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'
    
verilen cevap Sam 02.01.2018 20:40
0

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

$ (some-program &) &>/dev/null

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
    
verilen cevap Eyal Levin 13.06.2018 10:43

Etiketlerdeki diğer soruları oku