Terminal üzerinden bir GUI uygulaması nasıl başlatılır?


78

Bazı GUI uygulamaları Terminal komut satırı üzerinden temiz bir şekilde başlatılır, ancak bazıları işlemez ve Terminal'in uygulamanın sonlandırılmasını beklemesine neden olur. O zaman bile bazıları komut satırını "serbest bırakmaz".

Gizemli ve &son eki, terminalin süreci arka plana sokması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 "bekle" etkisi olmaz, tıpkı Alt+ aracılığıyla bir şey başlatmak gibi F2?

Komut satırının hemen arka planda olmasını ve terminalde hala arka planda bir şey olmadan tekrar olmasını istiyorum.


Htorque'un isteği üzerine kabul ettiğin cevabını sildim. Lütfen başka bir cevap seçebilir misiniz (ilk önce htorque'in seçimini kaldırmanız gerekir - sayfanın alt kısmında kırmızı renkte gizlenmelidir)
Oli

1
Halen çalışmakta olan bir Programla başa çıkma yöntemi (con-f-use tarafından belirtildiği gibi) bu durum için iyidir, ancak benim asıl sorumum terminal dağınıklığı olmadan temiz lansmanla ilgili olduğu için , kabul ettim screen(Oli tarafından belirtildi) ve RobinJ). Onun kabiliyetinden etkilendim; hakkında okuduktan ve denedikten sonra ... Sadece şunu yazmayı gerektirir: screen -d -m gedit(veya screen geditsonra Ctrl+a dayırma) ... ve hala gedit'in terminal görünümüne (uyarı mesajları için vb.) tam erişimim screen -rolsa bile bu sırada orijinal terminal penceresini
kapattınız

BTW, terminale atfettiğiniz bazı şeyler aslında kabuk tarafından yapılır, örneğin &komut son ekini yorumlar. Bu açıklama için faydalı olabilir: Terminal, Konsol, Kabuk ve Komut Satırı arasındaki fark nedir?
wjandrea

Yanıtlar:


17

Gedit'in durumunda, ben sadece sürekli bir kopyasını tutarım. Çalışan bir kopyanız olduğu sürece, geditaramaları terminalden başlatmak ve ardından terminali kapatmak gedit'i öldürmez.

Diğer şeyler için, başkalarının söylediklerini de işe yarayabilir. Ben hayranıyım nohup... Ama eğer bir terminale ihtiyacınız varsa, ayırabilirsiniz ancak daha sonra tekrar takabilirsiniz, bakmak istersiniz screen.

  1. Bir terminalde çalıştırın ve daha sonra çıkışı zorlayan bir şey çalıştırın. Django geliştirme sunucusunu kullanıyorum ancak irssihatta watch uptimeiyi örnekler de olabilirdi.
  2. Terminali öldür ve yenisini başlat.
  3. Koş screen -rve BOOM, geri döndün.

screenondan çok daha büyük ve byobudaha iyi bir terminal deneyimi için bunu birleştirebilirsiniz . Oku.


Bu, ekranın ne yaptığını / yapabildiğini anladığım ilk gerçek içgörü ... terminal ipucu için teşekkürler ...
Peter.O

ekran artık mevcut değil, ancak tmux ekranın yerini alabilir. (yeni bir tmux oturumu başlatmak için tmux, ctrl + b, sonra kapatmak için d tuşuna basın ve yeniden bağlamak için tmux bağlayın)
Gman Smith 02.04.2006

84

Diyelim ki geditbağımsız program ("ayrılmamış", "ayrılmamış", "ayrık") çalıştırmak istediğiniz programdır. Tam olarak ne yapmak istediğinize bağlı olarak farklı yollar vardır:

Program zaten çalışıyor

çıkmamak:

disown -hZaten çalışan bir programla bunu yapmak istiyorsanız gitmenin yoludur (yani, unutmuşsanız nohup). İlk önce Ctrl+ tuşlarını kullanarak onu durdurmanız gerekir Z. Ardından bg [jobId](örn. bg 1) Kullanarak arkaplana girebilirsiniz . Çalışanlarının işlerini kullandıkları bir listesini alırsınız jobs. Bundan sonra kullanarak terminalden ayırabilirsiniz disown -h %[jobId]. Örnek terminal oturumu:

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

Program henüz başlatılmadı

nohup

nohuptüm makinelerde her zaman mevcut değildir. Önceden ayırmak istediğinizi biliyorsanız, şunu kullanırsınız:

nohup gedit &

Belki de kabuk çıktısını ve programınıza sahte bir giriş kaynağını yönlendirmek isteyeceksinizdir nohup ./myprogram > foo.out 2> bar.err < /dev/null &. Çıktının, rahatsız edilmemesini veya daha sonra kullanmasını yönlendirmek istersiniz. Boş-giriş, ssh içindeki hıçkıranların önlenmesine yardımcı olabilir.

altkabuk:

İle benzer bir etki elde edebilirsiniz

$ (geany >/dev/null 2>&1 &)

Parantezler gedit'i çalıştırmak için yeni bir alt >/dev/null 2>&1kabuk açar. Kabuk çıkışını hiçbir yere yönlendirmez (çıkışı bastırır). Ve &sonunda süreci arkaplana koyar.

Terminal çoğullama

Ayrıca ekran veya byobu kullanarak terminal çoğullama . Temel olarak programı kendi terminalinde çalıştırıyorsunuz. Gerçekten de diğer nedenlerle byobu önerebilirim. İlk adımlarınız için kullanışlı olabilecek boybu kısayolların bir listesi aşağıdadır:

İşe yarar:

  • F2 Yeni bir pencere oluştur
  • F3 Bir sonraki pencereye geç
  • F4 Önceki pencereye taşı
  • F6 Oturumdan ayrıl ve oturumu kapat
  • Shift-F6 Oturumdan ayırın, ancak oturumu kapatmayın
  • F7 Geri kaydırma / arama moduna girin
  • Ctrl-F5 Herhangi bir SSH / GPG soketini veya aracısını yeniden bağlayın

Daha az kullanışlı:

  • Shift-F2 Ekranı yatay olarak bölme
  • Ctrl-F2 Ekranı dikey olarak bölme
  • Shift-F3 Odağı bir sonraki bölmeye taşı
  • Shift-F4 Odağı bir önceki bölüme taşı
  • Shift-F5 Tüm bölmeleri daralt
  • F5 Tüm durum bildirimlerini yenile
  • F8 Geçerli pencereyi yeniden adlandır
  • F9 Byobu Konfigürasyon Menüsünü Başlatın
  • F12 GNU Ekranın Kaçış Anahtarı
  • Alt-Pageup Bu pencerenin geçmişini geriye doğru kaydır
  • Alt-Pagedown Bu pencerenin geçmişinde ilerleyin
  • Ctrl-a-! Byobu'nun tüm tuşlarını aç veya kapat

'At' daemon ve diğerleri

atzamanlanmış bir zamanda bir komut çalıştırmak için güzel bir yararlı küçük araçtır. Bir komutu kabuktan ayırmak 'yanlış kullanılmış' olabilir:

echo './myprogram myoption1 myoption2' | at now

Ayrıca setsidve içine bakabilirsiniz start-stop-daemon, ancak diğer yöntemler yeterli olmalıdır.


İpucu: Yalnızca bir iş varsa, iş kimliği isteğe bağlıdır, örneğin, yerine bg %1sadece yazabilirsiniz bg.
MasterMastic

25

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

O yapar ve sık sık istediğin bu. & Kullanmayı unutursanız, programı ctrl-z ile askıya alabilir, ardından bg komutuyla arkaplana koyabilir ve bu kabuğu kullanmaya devam edebilirsiniz.

Stdin, stdout ve stderr işlemi hala terminale bağlı; / / / dev / null dizinindeki dosyaları veya başka bir dosyaya yönlendirebilirsiniz (örneğin, bir çıktı günlüğünü bir yere kaydedin):

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

İşlemi işlerde görebilir, ön plana geri getirebilir (fg komutu) ve sinyalleri gönderir (kill komutu).

Bazı grafik programları terminalden ayrılacak; eğer öyleyse, "normal" komutunu çalıştırdığınızda, grafiksel programın başladığını ve "çıkışlar" olduğunu fark edeceksiniz .


İşte kısa bir komut dosyası , bunu runbg olarak adlandırdığım ~ / bin içine yerleştirebilirsiniz:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, 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" "$@" &  # $@ is all args

Yeniden yönlendirmeden önce programı ($ prog) arayacağım, böylece onu bulmadaki hatalar bildirilebilir. "Komutunu çalıştır ..."; çıktıyı bir yere kaydetmeniz gerekiyorsa, hala stdout / err dosyasını bir dosyaya yönlendirebilirsiniz.

Yönlendirmeler ve hata işleme hariç, bu htorque'un cevabına eşdeğerdir .


Tamam, teşekkürler ... Görünüşe göre ctrl-z(askıya alma) komut satırına tekrar erişmeme izin veriyor, ancak bgaskıya alınmadığı anlaşılana kadar GUI'yi boş bırakıyor . (mantıklı) ... GUI'den ayrılabileceğim başka bir komut var mı ... Aha! Şimdi ne demek istediğinizi anlıyorum sighals (kill command)... (bu sinyalleri ilginç şeyler) .. Ben ddaşamalı olarak istatistikleri çıkarmak için bir kod pasajı kullandım .. ve kill+ SİNYAL kullandı ... Bir "işi çıkarmak için belirli bir SİNYALİ var mı "?
Peter.O

Sadece senin yorumuna Rick'in cevabını farkettim ... disown İşleri - p gedit`` ı denedim ve işi kaldırıyor gibiydi .... (ama el ile gedit'i kapattığımda Terminal'de sistem mesajları aldım ama sanırım ... Şu anda berbat bir Terminalim var ... çok fazla deney yapıyor :(
Peter.O

@ fred: İşler kabuk tarafından yönetilir, böylece hiçbir sinyal bunu kontrol edemez. Birkaç mermiyi başlatmanın en iyi yolunu bulabilirsiniz - birkaç GUI terminali sekmelere izin verir ve ekranı veya tmux'u kullanabilirsiniz.

2
@fred: jobs -p commandbir seferde arka planda çalışan bir komutun birden fazla örneğini varsa daha iyi çalışma . jobsdoğru iş kimliğini bulmak için kullanabilirsiniz ve daha sonra işin PID'sini jobs -p <job-id>almak için kullanabilirsiniz. Şahsen ben alt kabuğu ile sürümünü çok daha kolay buluyorum. ;-)
htorque

2
@htorque, fred: Son işi bırakıp bash yapmak için parametreler olmadan disown yapabilirsiniz:gedit & disown

22

Bir uygulamayı başlatmak ve onu başlatılan terminal kullanımından ayırmak için &!

firefox &!

6
Bilmek güzel, ama bu sadece zsh gibi görünüyor. Bash'ta disown <pid-of-command>, komutu arka planda başlattıktan sonra manuel olarak çalıştırmanız gerekir .
htorque

İlginç ... zsh 'e bakacağım, fakat bir Linux acemi olarak, şu an bash ile bağlı kalacağım ... Teşekkürler
Peter.O

ünlem işareti ne işe yarar?
natty

1
! Uygulama sürecini terminal işleminden koparacak, böylece terminali kapanmadan başlatılmadan kapatabilirsiniz. Bir zsh şey gibi görünüyor, ama kullanışlı.
Rick

Ama bu bash de @ htorque çalıştı .... Yani bir sorun değil sanırım.
Jasser,

20

kullanım nohup

nohup, verilen sinyallerin yok sayılmasıyla verilen bir komutu çalıştıran bir programdır, böylece komut üst işlemi sona erdikten sonra arka planda çalışmaya devam edebilir. Man sayfasına bakınız

Örneğin:

nohup gedit something

2
Nedir nohup? Lütfen detaylandırın.
Oxwivi

3
nohup, verilen sinyallerin yok sayılmasıyla verilen bir komutu çalıştıran bir programdır, böylece komut üst işlemi sona erdikten sonra arka planda çalışmaya devam edebilir. Bkz manpage
Florian Diesch

Aslında cevabımın yanlış olduğunu düşünüyorum. Daha fazla düşünce üzerine, nohupbu senaryoda kullanılmalıdır.
boehj

2
Etkileşimli bir kabuk bir SIGHUP sinyali aldığında, tüm childs'larına bir SIGHUP sinyali gönderebilir (veya ayarlarına bağlı olarak değil). Bir terminal kapatıldığında bu olabilir (ya da tekrar değil). Böyle bir sinyali kullanmaya hazır olmayan bir çocuk varsayılan eylemi yürütecektir, yani çıkış. nohupUygulaması (ve disownbash yerleşik) sinyal uygulaması ulaşmak için izin vermez.
enzotib

2
Dikkat edilmesi gereken şey nohup, geçerli dizinde adı verilen bir dosya oluşturmasıdır nohup.out. Daha fazla bilgi için man sayfasına bakınız. disownBu nedenle ve disownfırlattıktan sonra işe yaradığı için tercih ediyorum gedit.
Flimm

4

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


GNU Ekranı tam olarak nedir?
Oxwivi

Fikri doğru anladıysam, komut satırı için bir tür pencere yöneticisi var. Komut satırı arayüzü oturumunda aynı anda birden fazla program çalıştırmanıza izin verir.
RobinJ

Byobu?
Oxwivi

Bunun gibi bir şey, sadece Byobu kullanımı daha kolaydır. Yanılmıyorsam, Byobu GNU Ekranı için sadece daha kolay bir arayüz.
RobinJ


1

xdg açık

Bu genel amaçlı yardımcı programa bir göz atın: https://linux.die.net/man/1/xdg-open

Bu, dosya yöneticinizde göreceli bir konum açar.

 $ xdg-open .

Bu pdf okuyucusunda pdf dosyasını açacaktır.

 $ xdg-open foo.pdf

Web URL'lerini bile sağlayabilirsiniz

$ xdg-open www.google.com

0

Pek çok insanın düşündüğü gibi, dikkate alınacak bir şey yok. Ancak terminalde nohup hala açık kalır ve terminalde tahriş edici olan program aktivitesini gösterir. Bundan kaçınmak için terminali daha sonra kapatabilirsiniz. Kullandığım çok basit bir geçici çözüm buldum.

nohup gedit & exit

Ve bu kadar. Gedit başlar ve gedit başladığında terminali kapatır. Gedit şimdi terminalle ilişkili olmadığı için aktif kalır.


0

Bu bile bir komut dosyası içinde çalışır (Diğer adlar gibi, '&' fragmanının normalde komut dosyalarına izin vermez çünkü etkileşimli değildirler):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'

0

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

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

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
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.