Terminal'de başlatılan uygulamanın istenmeyen bir şekilde çıkmasını nasıl önleyebilirim?


10

Terminal gibi uygulamaları aşağıdaki gibi komutlarla başlatırım:

/Applications/Mail.app/Contents/MacOS/Mail &

Önemli olan  &.

  • Unix / Linux / Solaris için:

    • Okulda &, programı eklemenin kendi başına canlı olmasını sağladığını öğrendim  .
    • xeyes &Kabuğu kapattıktan sonra bile programın güvenli bir şekilde çalıştırıldığını ve güvenli çalıştığını hatırlıyorum  .
  • Mac OS X'te (İçeride Unix):

    1. İle bir uygulama  &başlatıyorum ve Terminal penceresini kapatıyorum: uygulama kapanıyor!
    2. Bu istenmeyen davranış Mac OS X'te neden oluyor?
    3. Bu nasıl düzeltilebilir?

Yanıtlar:


7

Gerçekleştirmek istediğiniz şeyi başarmanın "standart" yolu (OS X ve Linux, FreeBSD veya diğer sistemlerde) şu komutu kullanmaktır nohup:

nohup program &

Bu başlar - programçünkü arka planda kabuğa göre çalışır &- ve nohup komutu nedeniyle kapatma sinyallerini yoksayar.

Bu şekilde, kabuğu kapatsanız bile program çalışmaya devam eder. Terminal.app'ı kapattığınız için kabuğu kapatmanız ya da bilgisayara ssh bağlantısıyla veya benzer bir bağlantıyla bağlantıyı kestiğiniz için kabuğu kapatmanız önemli değildir.


1
Bu nohup.out, geçerli klasörde bir dosya oluşturur . Yazacak bir şey olmadığında bile. Birkaç hafta sonra Mac'imin nohup.outher yerinde dosyalara sahip olurdum . :-(
Nicolas Barbulesco

1
@NicolasBarbulesco kullanın ya nohup command>/dev/null&ya command&disown.
Lri

6

Bir terminal penceresini kapattığınızda, kabuğa bir SIGHUP (kapatma sinyali) gönderir ve daha sonra başlattığı tüm işlemlere SIGHUP gönderir . Bu, bash ve diğer birçok mermi için geleneksel davranıştır ve bunun geleneksel çözümü nohup kullanmaktır.

Farklı Unix makinelerinin farklı olabileceği yollar vardır, bu nedenle kullandığınız belirli terminal emülatörlerinin veya kullandığınız belirli mermilerin farklı davranması mümkündür. Ancak OS X'e özgü değildir. Örneğin, aynı konuda Ubuntu'da bir soru var.


6

"" Ve &" işaretini kullanarak Terminal'e işlemi kabuğun arka planında çalıştırmasını söylersiniz. Böylece, kabuğu kapattığınızda (ve işlemi öldürdüğünüzde), GUI (Mail.app'nin kendisi) de kapanacaktır.

Posta'yı terminalden başlatmak için doğru komut:

open -a Mail; exit

Düzenleme: Ben sadece U & L Stack Exchange bu buldum : Ve işareti bir kabuk komut dosyası satırının sonunda ne anlama geliyor? Verilen cevaplar mükemmel ve neler olup bittiğini tam olarak daha ayrıntılı ve şimdiye kadar yapabileceğimden daha iyi açıklıyor! Bunu okumanızı tavsiye ederim.


Uygulamaya komut satırı parametrelerini iletmeye ne dersiniz? /Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Şunun

2
@NicolasBarbulesco Bu ayrı bir soru - açık için adam sayfasına bakın ve burada bir soru düşünüyorum
user151019

Belirli bir uygulamayı başlatmak, içinde /Applicationsolmak değil, belirli bir yolda başlatmak ? /Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Şunun

@NicolasBarbulesco [tam yol] veya cd'yi dizine açın ve [file] dosyasını açın. IE: ~ / De * / Fire * ... et cetera değeriyle eşleşen başka bir dize olmadığını varsayarak daha kısa gösterim olarak ~ / ana klasörünüz ve "asterisk" özel karakteri için kullanabilirsiniz. Veya basit bir komut dosyası yazın: cat> nameofscript ..... #! / bin / sh .... açık [tam yol] .... ^ D ..... chmod + x nameofscript ...... \ nameofscript .... ve isteğe bağlı, mv nameofscript $ PATH / kişiseliniz. Adam okuma adam açık öneririz. Bu basit bir komut ve basit bir komut olarak takas o kadar güçlü değil.
njboot

1
Üzgünüz, hala -a argümanını kullanmanız gerekiyor:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot

4

Çözümü buldum:

(/Applications/Mail.app/Contents/MacOS/Mail &)

Basit, güzel ve işe yarıyor!

Parantezler  ( )komutu bir alt kabukta başlatır.


--ve & & beklemeden programdan kabuğa geri döner, böylece çıkmaya başladığınız program olmadan kabuğu kullanmaya devam edebilir veya sonlandırabilirsiniz.
r_alex_hall

3

@jksoegaard uygun komutlara sahiptir, ancak yorumda belirttiğiniz gibi bir nohup.out dosyası oluşturur. Nohup.out dosyasının oluşturulmasını durdurmak için STDOUT ve STDERR öğelerini başka bir yere yönlendirmeniz gerekir. Komutun tamamı olurdu nohup program &>/dev/null &. Bu, programınızı arka planda çalıştırarak SIGHUP'u yok sayar ve tüm STDOUT ve STDERR öğelerini / dev / null öğesine gönderir.

Ancak, nohup eklemeyi hatırlamıyorsanız (orijinal sorunuzda olduğu gibi), SIGHUP'u disown -arhyoksaymak için arka plandaki tüm çalışan işleri işaretlemek için komutu kullanabilirsiniz .


Güzel cevap, ama yine de karmaşık. Ve güzel profil resmi. :-)
Nicolas Barbulesco

0

Ya da deneyebilirsin open -a /Applications/Mail.app

Kullanım: açık [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s] [- b] [-a] [dosya adları] [--args argümanları]
Yardım: Aç dosyaları kabuktan açar.
      Varsayılan olarak, her dosyayı o dosya için varsayılan uygulamayı kullanarak açar.
      Dosya bir URL biçimindeyse, dosya URL olarak açılır.
Seçenekler:
      -a Belirtilen uygulama ile açılır.
      -b Belirtilen uygulama paketi tanıtıcısıyla açılır.
      -e TextEdit ile açılır.
      -t Varsayılan metin düzenleyici ile açılır.
      -f Standart girişten girişi okur ve TextEdit ile açılır.
      -F --fresh Uygulamayı yeni, yani pencereleri geri yüklemeden başlatır. Adsız belgeler hariç kaydedilmiş kalıcı durum kaybolur.
      -R, --reveal Finder'da açmak yerine seçer.
      -W, --wait-apps Kullanılan uygulamalar kapatılana kadar engeller (zaten çalışıyor olsalar bile).
          --args Kalan tüm argümanlar argv'de açılmak yerine uygulamanın main () işlevine iletilir.
      -n, --new Zaten çalışıyor olsa bile uygulamanın yeni bir örneğini açar.
      -j, --hide Gizli uygulamayı başlatır.
      -g, --background Uygulamayı ön plana getirmez.
      -h, --header Verilen dosya adlarıyla eşleşen üstbilgileri üstbilgi dosyası konumlarında arar ve açar.
      -s -h için kullanılacak SDK; verilirse, yalnızca adları bağımsız değişken değeri içeren SDK'lar aranır.
                        Aksi takdirde, her platformdaki en yüksek sürüm SDK kullanılır.

-2

Bir çözüm buldum: Kötülükle kötülükle savaşmak.

Uygulamamı bu tür bir komutla başlattım:

/Applications/Mail.app/Contents/MacOS/Mail & exit

Kabuk hemen çıkar. Ve ben Terminal penceresini kapattıktan sonra bile, uygulama hayatta.

Ancak bu çözüm çok kullanışlı değil.


1
Gerçekten açık olarak paketlenmiş Uygulamaları açıyor olmalısınız . Paket içeriği kanonik olduğu kadar değiştiğinden bu da geleceğin kanıtıdır.
Ian C.

@Ian - Burada özellikle belirli bir yoldaki, içinde olmayan ve Mac'imle /Applicationsbirlikte paketlenmemiş uygulamaları açmakla ilgileniyorum .
Nicolas Barbulesco

1
.appklasörlere "paketler" denir ve openkomut, ister /Applicationsklasörde isterse başka bir klasörde olsun, bunları başlatabilir . Bu bağlamdaki "paket" terimi, "OS X ile gönderilen" anlamına gelmez.
kimse

open simgesini tıklatmakla aynıdır. OP'nin istediği uygulamayı komut satırından başlatmakla aynı şey değil.
Ted Bigham
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.