GUI linux programlarını komut satırından başlatmak, ancak komut satırından ayırmak nasıl?


89

Bunu daha önce aradım, ancak bir cevap bulamadım.

Windows'ta bir konsol pencerem açıksa, yazın winmineve enter tuşuna basın, cmd programından tamamen ayrı olarak Mayın Tarlası görünecektir. Minesweeper örneği, bildiğim herhangi bir şekilde komut istemine bağlı değildir; Minesweeper ailesinin komut isteminin o örneğine ayarlanması dışında. Bununla birlikte, Linux'ta farklı.

Linux'ta açık bir konsol pencerem varsa, emacsyazıp enter tuşuna basın, Emacs açılacak, ancak komut satırına bağlı görünüyor. Özellikle, bu Emacs örneği kapanana kadar komut satırını kullanamayacağım anlaşılıyor. Linux'ta Windows davranışını çoğaltmanın bir yolu var mı?

Teşekkürler!



Lütfen cevabı geekosaur'a verin.
Joshua Robison

Windows7'de minesweeper.exe burada C: \ Program Files \ Microsoft Games \ Minesweeper bu yüzden minesweeper.exe genel olarak çalışmaz .. bu dizin yolda olmadığından .. Ve neyse, Windows versiyonunu
belirtmelisiniz

Yanıtlar:


10

In bash, detachaşağıdaki gibi kullanılan bir yerleşiktir:

emacs &
detach %+ # or % + the number in brackets printed after the above

İçinde zsh, tek bir işlemde arkaplan ve ayırma işlemlerini yapabilirsiniz:

emacs &|

108

Append &komutsatırına:

emacs &

Bu, arka plandaki emakları koyacaktır ve terminalinizi kullanmaya devam etmenizi sağlayacaktır.

Bunun hala emacs'ı terminalinizin bir alt işlemi olarak bırakacağını ve terminalden çıktığınızda da emacs'den çıkacağını unutmayın. Bunu önlemek için, şunu yazın:

(emacs &)

Parantezler, terminale emacs işlemini terminalden ayırmasını söyler.

Yine de, programdan stdout ve stderr mesajları terminalde görünecektir. Bunu önlemek için şunları kullanın:

(emacs &> /dev/null &)

9
Özellikle (emacs &) ipucunu seviyorum.

1
Görevi daha önce başlattıysanız (emancs), sonra uykuya almak için CTRL-Z tuşlarını kullanın ve sonra arka plana göndermek için "bg" komutunu kullanın.
Jayan

@ StockTrace: Bunu yaparsanız ve terminalinizi kapatırsanız, emacs de öldürür.
Nathan Fellman

1
Tamam .. Eskiden "nohup" kullanıyordum. Süreç başladıktan sonra yapılamaz ...
Jayan

Terminal penceresinde Ctrl+ tuşlarına basıldığında Cbu komut verildi, işlem öldürüldü: <
Richard de Wit

21

Kullanın nohup. Bunun gibi, böyle:nohup amarok &

Bu yardımcı olur umarım.


19

Ben yayınlanmıştır bir cevap çeşitli kaynaklardan cevapları ile benzer bir konu daha eski bir konuya. Aşağıda bu konu için uyarlanmış cevabın bir kopyası verilmiştir.


Aşağıdaki işler:

$ (gui_app &> /dev/null &)

Bu Nathan Fellman'ın cevabı artı yönlendirmesi.

"&> / dev / null" stdout ve stderr komutunu null cihaza yönlendirir. Son işaret ve işlemin arka planda çalışmasını sağlar. Komut etrafındaki parantezler "gui_app" in bir alt kabukta çalışmasına neden olur.

Bunu yapmak, "gui_app" işlemini bu komutu çalıştırdığınız konsoldan ayırır. Pencereyi kapatsanız bile, üst terminal emülatörü çalışıyorsa, "gui_app" kapanmaz. Bunu koştum daha sonra "pstree" komutuyla işlem ağacına baktım ve bu yolla başlayan bir uygulamanın "init" için alt işlem olacağı bulundu.

Örneğin,

$ gui_app &> /dev/null &

arka planda uygulamayı çalıştıracak, ancak konsol işleminin alt işlemi olacak ve terminali kapattığınızda sona erecek. (Çıkış komutunu veya Ctrl-D'yi kullanarak terminalden bashtan çıkmasına rağmen, arkaplan işlemini yerine koymak için bash'nin temizlenmesini sağlar.)

"nohup", NawaMan'ın önerdiği gibi çalışır, ancak çıkış ve hatayı varsayılan olarak bir dosyaya yönlendirir. JeffG'nin yanıtladığı gibi, "disown" komutu (kabukta mevcutsa) bir arka plan işlemi başlattıktan sonra işlemi terminalden ayırabilir:

$ gui_app &
$ disown

(BTW bunların tümü bash için geçerlidir. Diğer kabukları bunun için başka yöntemlere / sözdizimine sahip olduklarından eminim.)

Bazı referanslar: Uzaklaştırma Süreçleri (UNIX Elektrikli El Aletleri)

Bir GUI uygulamasına yapılan basit bir çağrıysa - karmaşık seçenekler ve benzerleri olmadan - "gmrun" veya dmenu gibi ( başlatıcı : yüksek ses) başlatıcı kullanmak da iyi bir seçenektir. Bir tuş kombinasyonuna bağlayın. Henüz bir başlatıcısı kullanmıyorum, ancak bu ikisini denedim.

NOT: Diğer iş parçacığı raporlarının yorumlarında CarlF, GUI uygulamalarının "gui_app &" yöntemi ile başlatıldığını, ana terminalden çıktığında kapanmadığını bildirdi. Sanırım terminali farklı yollarla kapatıyorduk. Terminal emülatörünün içinde çalıştığı pencereyi kapatıyordum. Terminal emülatörünü kabuktan (çıkış komutu veya Ctrl-D) geçiyor olabilir. Bunu test ettim ve bash aracılığıyla çıkmanın GUI'yi durdurmadığını gördüm, CarlF'ın dediği gibi terminalin arka plan süreci olarak başladım. Arka plan işlemlerini, temizlenme şansı verildiği zaman başlatmaya kalkar gibi görünüyor. Aslında, bu bir alt kabukta arka plan işleminin başlatılmaya başlandığı mekanizma olmalıdır.


11

util-linux, setsid adı verilen ve temel olarak çıkardığı işlemleri yapan bir araç içerir:

$ setsid someprogram

Bu someprogramyeni bir oturumda çalışacak .


9

xemacs &Arka planda XEmac'ları açmak için yazmaya çalışın .

Lütfen buna "Windows davranışını taklit" olarak bakmayın. Ahh.

Ayrıca yapabilirdin:

  • Yeni bir terminal aç
  • Terminali kullanmak yerine programı başlatmak için Alt + F2 veya pencere yöneticinizi kullanın
  • GNU Ekranını Kullan

7

Aşağıdaki kodu "sessiz arka plan" için "sbg" adlı yürütülebilir bir komut dosyasına koydum. Başlatılmakta olan programın kabuktan tamamen ayrılması için gerekli olan her şeyi yapar: stdin, stdout ve stderr /dev/nullkomutunu / dan yönlendirir, askıları yok sayar, arka planda çalışır ve ayırır.

#!/bin/bash
nohup "$@" &>/dev/null & disown %%

O zaman sadece yapabilirsin sbg emacs. Ayrıca istediğiniz argümanları geçirebilirsiniz: sbg emacs --daemon FILE1 FILE2.


komut dosyası çözümü benim için en iyi sonucu verdi. Teşekkürler!! (gui_app &> /dev/null &)onun yerine kullanılmasına rağmen (@ EMPraptor'un cevabı)
Jimi Oke


3

bash kullanıyorsanız işlemi iptal edebilirsiniz:

% firefox &
% disown 


1

Diğer cevapların dediği gibi, aşağıdakileri kullanabilirsiniz:

$ emacs &

&Gerçi unutursanız , sadece basın ve Ctrl-zsonra kullanın bg:

[1]+  Stopped                 emacs
$ bg
[1]+ emacs &
$

Bilginize: Ctrl-zemacs işlemini durdurur bgve arka plana gönderir.



0

Bunu sana ekle ~/.bashrc:

debug_trap_skip()
{
    local cmd_type=$(type -t "$1")

    # Empty cmd_type is for inexistent command or variable definition, exclude them
    # and shell builtins except echo, set and env:
    [[ -z "$cmd_type" || "$cmd_type" = builtin && "$1" != echo && "$1" != set && "$1" != env ]] &&
        return 0

    return 1
}

debug_trap_x11()
{
    if ldd `which $1`|grep -q libX11
    then
        setsid "$@"
        return 0
    fi
    return 1
}

debug_trap()
{
    [[ -n "$COMP_LINE" ]] && return  # do nothing if completing
    [[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ]] && return
    debug_trap_skip $BASH_COMMAND && return 0
    debug_trap_x11 $BASH_COMMAND && return 1

    return 0
}

shopt -s extdebug
trap debug_trap DEBUG

Şimdi hangi programların X11 olduğunu hatırlamak zorunda değilsiniz ve onlar için özel manipülasyonlar yapıyorsunuz çünkü otomatik olarak ayrılacaklar. Not setsiddaha iyidir nohupneye ihtiyacınız olmayan sonuncusu blok HUP sinyali çünkü.

PS Şimdi sen zaten winmineLinux'tasın.

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.