Bagaimana mencegah aplikasi yang diluncurkan di Terminal keluar dengan tidak diinginkan?

10

Saya meluncurkan aplikasi dari Terminal dengan perintah seperti ini:

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

Bagian yang penting adalah  &.

  • Untuk Unix / Linux / Solaris:

    • Saya telah belajar di sekolah bahwa menambahkan program  &membuat hidup sendiri.
    • Saya sangat ingat meluncurkan perintah seperti  xeyes &dan menjalankan program dengan aman bahkan setelah saya menutup shell.
  • Di Mac OS X (Unix inside):

    1. Saya meluncurkan aplikasi dengan  &dan saya menutup jendela Terminal: aplikasi keluar!
    2. Mengapa perilaku yang tidak diinginkan ini terjadi pada Mac OS X?
    3. Bagaimana ini bisa diperbaiki?
Nicolas Barbulesco
sumber
Pertanyaan terkait: apple.stackexchange.com/q/119319/20773
Eric3

Jawaban:

7

Cara "standar" untuk mencapai apa yang ingin Anda capai (pada OS X serta di Linux, FreeBSD atau sistem lain) adalah dengan menggunakan perintah nohup:

nohup program &

Ini akan mulai program, yang akan berjalan di latar belakang relatif ke shell karena &- dan akan mengabaikan sinyal hangup karena perintah nohup.

Dengan cara ini program akan terus berjalan meskipun Anda menutup shell. Tidak masalah jika Anda menutup shell karena Anda menutup Terminal.app, atau Anda menutup shell karena Anda melepaskan koneksi ssh ke komputer, atau serupa.

jksoegaard
sumber
1
Ini membuat file nohup.outdi folder saat ini. Bahkan ketika tidak ada yang bisa ditulis. Setelah beberapa minggu, saya akan memiliki file nohup.outdi mana-mana di Mac saya. :-(
Nicolas Barbulesco
1
@NicolasBarbulesco Gunakan salah satu nohup command>/dev/null&atau command&disown.
Lri
6

Ketika Anda menutup jendela terminal, ia mengirimkan SIGHUP (sinyal hangup) ke shell, yang kemudian mengirimkan SIGHUP ke semua proses yang dimulai . Ini adalah perilaku tradisional untuk bash dan banyak shell lainnya, dan solusi tradisional untuk ini adalah menggunakan nohup.

Ada beberapa cara yang berbeda untuk mesin Unix, jadi mungkin saja emulator terminal spesifik yang Anda gunakan atau cangkang spesifik yang Anda gunakan berperilaku berbeda. Tapi itu tidak spesifik untuk OS X. Misalnya, ada pertanyaan tentang masalah yang sama di Ubuntu.

Alan Shutko
sumber
6

Dengan menggunakan ampersand " &", Anda memberi tahu Terminal untuk menjalankan proses di latar belakang shell itu sendiri. Jadi, ketika Anda menutup shell (dan membunuh prosesnya), GUI (Mail.app sendiri) juga akan menutup.

Perintah yang benar untuk meluncurkan Mail dari terminal hanyalah:

open -a Mail; exit

Sunting: Saya baru saja menemukan ini di U&L Stack Exchange: Apa yang dimaksud ampersand di akhir baris skrip shell? Jawaban yang diberikan sangat bagus dan menjelaskan dengan tepat apa yang terjadi secara lebih rinci dan lebih baik daripada yang pernah saya bisa! Saya sangat merekomendasikan membacanya.

njboot
sumber
Bagaimana dengan meneruskan perintah-perintah baris ke aplikasi? Seperti ini:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco
2
@NicolasBarbulesco Itu adalah pertanyaan terpisah - lihat halaman manual untuk terbuka dan saya pikir pertanyaan di sini
user151019
Bagaimana dengan meluncurkan aplikasi tertentu, tidak di dalam /Applications, tetapi pada jalur tertentu? Seperti ini:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco
@NicolasBarbulesco buka [path lengkap], atau cd ke direktori dan buka [file]. Anda dapat menggunakan ~ / untuk folder rumah Anda dan karakter khusus, "asterisk", karena notasi yang lebih pendek dengan asumsi tidak ada string lain yang sesuai dengan nilainya, yaitu: ~ / De * / Fire * ... dan lain-lain. Atau cukup tulis skrip sederhana: cat> nameofscript ..... #! / bin / sh .... buka [path lengkap] .... ^ D ..... chmod + x nameofscript ...... \ nameofscript .... dan opsional, mv nameofscript $ PATH / yourpersonalbin. Tidak disarankan membaca pria terbuka. Ini adalah perintah yang sederhana, dan sebagai perintah yang sederhana, tradeoffnya tidak terlalu kuat.
njboot
1
Maaf, masih perlu menggunakan argumen -a:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot
3

@jksoegaard memiliki perintah yang tepat tetapi seperti yang Anda sebutkan di komentar, itu membuat file nohup.out. Untuk menghentikan file nohup.out dibuat, Anda perlu mengarahkan ulang STDOUT dan STDERR ke tempat lain. Perintah lengkapnya adalah nohup program &>/dev/null &. Ini akan menjalankan program Anda di latar belakang, mengabaikan SIGHUP, dan mengirim semua STDOUT dan STDERR ke / dev / null.

Namun, jika Anda tidak ingat untuk menambahkan nohup (seperti dalam pertanyaan awal Anda), Anda dapat menggunakan disown -arhperintah untuk menandai semua latar belakang pekerjaan yang berjalan untuk mengabaikan SIGHUP.

Perangkat Lunak Insomnia
sumber
Jawaban yang bagus, namun masih rumit. Dan gambar profil yang bagus. :-)
Nicolas Barbulesco
3

Saya telah menemukan solusinya:

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

Sederhana, cantik, dan berhasil!

Tanda kurung  ( )meluncurkan perintah di sub-shell.

Nicolas Barbulesco
sumber
--dan tombol & kembali dari program ke shell tanpa menunggu, sehingga Anda dapat terus menggunakan shell atau menghentikannya, tanpa program yang Anda mulai keluar.
r_alex_hall
0

Atau Anda bisa mencoba open -a /Applications/Mail.app

Penggunaan: buka [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s] [- b] [-a] [-n] [nama file] [--args argumen]
Bantuan: Buka membuka file dari shell.
      Secara default, buka setiap file menggunakan aplikasi default untuk file itu.
      Jika file tersebut dalam bentuk URL, file tersebut akan dibuka sebagai URL.
Pilihan:
      -a Dibuka dengan aplikasi yang ditentukan.
      -b Dibuka dengan pengidentifikasi bundel aplikasi yang ditentukan.
      -e Dibuka dengan TextEdit.
      -t Dibuka dengan editor teks default.
      -f Membaca input dari input standar dan terbuka dengan TextEdit.
      -F --fresh Meluncurkan aplikasi baru, yaitu, tanpa mengembalikan jendela. Status persisten yang disimpan hilang, tidak termasuk dokumen Tanpa Judul.
      -R, --reveal Memilih dalam Finder daripada membuka.
      -W, --wait-apps Blok sampai aplikasi yang digunakan ditutup (walaupun sudah berjalan).
          --args Semua argumen tersisa diteruskan dalam argv ke fungsi main () alih-alih dibuka.
      -n, --new Buka instance baru aplikasi walaupun sudah ada yang berjalan.
      -j, --hide Meluncurkan aplikasi yang disembunyikan.
      -g, --background Tidak membawa aplikasi ke latar depan.
      -h, --header Pencarian lokasi file header untuk header yang cocok dengan nama file yang diberikan, dan membukanya.
      -s For -h, SDK yang akan digunakan; jika disediakan, hanya SDK yang namanya berisi nilai argumen yang dicari.
                        Kalau tidak, SDK versi tertinggi di setiap platform digunakan.
Halomaple
sumber
-2

Saya telah menemukan solusi: memerangi kejahatan dengan kejahatan.

Saya meluncurkan aplikasi saya dengan perintah semacam ini:

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

Shell keluar sekaligus. Dan aplikasi bertahan, bahkan setelah saya menutup jendela Terminal.

Tetapi solusi ini tidak terlalu berguna.

Nicolas Barbulesco
sumber
1
Anda benar-benar harus membuka Aplikasi yang dibundel dengan terbuka . Itu bukti masa depan karena konten bundel berubah dan juga kanonik.
Ian C.
@Ian - Di sini saya sangat tertarik untuk membuka aplikasi yang berada di jalur tertentu, bukan di /Applications, dan tidak dibundel dengan Mac saya.
Nicolas Barbulesco
1
.appfolder disebut "bundel", dan openperintah dapat meluncurkannya apakah ada di /Applicationsfolder atau folder lain. Istilah "bundel" dalam konteks ini tidak berarti "dikirimkan bersama OS X".
tidak ada yang
buka sama dengan mengklik ikon. Ini tidak sama dengan meluncurkan aplikasi dari baris perintah seperti yang diminta OP.
Ted Bigham