Jalankan perintah saat startup / login (Mac OS X)


53

Saya bertanya-tanya di file mana saya harus menempatkan perintah bash ini sehingga akan dijalankan saat startup.

# Start the MongoDB server
/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log

Saya telah menjelajahi internet dan berpikir itu adalah antara ~/.bashrc, ~/profile, /etc/bashrc, /etc/profileatau ~/.bash_profile. Meskipun saya telah mencoba ini dan mereka tampaknya berjalan pada terminal startup bukan Mac startup . Apakah saya kehilangan file?

Jawaban:


33

Secara resmi tidak ada dari ini. Cara yang disarankan Apple adalah menggunakan launchd . Guis untuk mengatur ini termasuk lingon dan Luncurkan Kontrol

Adapun file yang Anda sebutkan yang ada di direktori home ~ / .bashrc, ~ / profile, ~ / .bash_profile hanya dimulai ketika Anda login melalui terminal. Yang di / etc dijalankan oleh shell yang dimulai untuk semua pengguna sebelum yang ada di direktori home tetapi hanya ketika seorang pengguna login .. bash manual

Skrip startup Unix melibatkan / etc / rc * tetapi untuk OSX gunakan saja item launchd


1
Jadi, jika perintah saya dimasukkan dalam salah satu file di /etcdalamnya, harus dijalankan saat bootup? Apakah penting apa yang ada di dalamnya?
Wolfy87

1
/etc/bashrcdan sebagainya dijalankan ketika Anda mulai shell, seperti ~/.bashrc- itu hanya bahwa mantan akan dijalankan setiap kali setiap pengguna mulai shell, bukan hanya pengguna Anda.
Scott

@Scott benar Saya telah memperbaiki jawaban saya
user151019

4
Oke, tapi saya tidak tahu cara menggunakan launchd, saya mencoba membuat file plist untuk program saya, tetapi saya tidak tahu cara menjalankannya atau bagaimana menjalankannya saat boot.
Wolfy87

1
@Mark link ke "launchd" rusak :(
Artem

58

Untuk menjalankan perintah saat memulai OS X, Anda harus menggunakan launchd.

Jika Anda tidak ingin menggunakan Lingon , Anda perlu membuat launchdDaftar Properti. Ini adalah file XML, jadi Anda dapat melakukannya dengan editor teks favorit Anda atau Anda dapat menggunakan Editor Daftar Properti yang diinstal dengan Mac OS X Dev Tools. Buat yang berikut ini:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>some.meaningful.name</string> <!-- org.mongodb.mongodb perhaps? -->

    <key>OnDemand</key>
    <false/>

    <key>UserName</key>
    <string>anAppropriateUser</string>

    <key>GroupName</key>
    <string>anAppropriateGroup</string>

    <key>ProgramArguments</key>
    <array>
            <string>/Applications/MongoDB/bin/mongod</string>
            <string>--dbpath</string>
            <string>/usr/local/mongo/data</string>
            <string>--fork</string>
            <string>--logpath</string>
            <string>/usr/local/mongo/log</string>
    </array>
</dict>
</plist>

Simpan ini di /Library/LaunchAgents/some.meaningful.name.plist(Anda akan memerlukan akun administrator dan / atau sudo), lalu buka terminal dan lakukan:

sudo launchctl load /Library/LaunchAgents/some.meaningful.name.plist

Ini akan menyebabkan launchd memuat item yang akan menyebabkannya memulai MongoDB saat boot. Sebagai bonus, launchdakan memantau dan, jika keluar karena alasan apa pun, itu akan dimulai kembali. Untuk menghilangkan item cukup ganti beban di perintah di atas dengan membongkar.


1
Halaman ini ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ) mencantumkan banyak hal yang tidak boleh dilakukan oleh sesuatu yang diluncurkan oleh launchd. Jika saya ingin menjalankan perintah sewenang-wenang pada saat startup saya mungkin tidak memiliki kendali dan perintah itu mungkin berakhir dengan melakukan hal-hal itu. Selain itu, saya mungkin tidak ingin launchd me-restart dan item yang berhenti karena itu one-off atau menangani peluncuran ulang sendiri. Apa yang harus saya lakukan dalam kasus ini?
Michael

@Scott, terima kasih. Ini adalah jawaban paling membantu yang saya temukan di internet.
Dmitriy

5
Ini akan mencoba menjalankan aplikasi setiap 10 detik, yang berfungsi dengan baik untuk layanan yang tidak mati. Jika ini untuk skrip yang berjalan sekali tepat waktu (dalam kasus saya, perpesanan sekali Slack saat reboot) tambahkan <key>LaunchOnlyOnce</key><true/>ke dikt.
msanford

Poin bagus Pak Sanford. launchd yang tidak menyerah membuat file log besar yang kemudian memperlambat Mac Anda (karena membaca dan menulis file log besar seperti itu secara terus-menerus). Saya dapat menggunakan perbaikan itu pada beberapa perangkat lunak komersial yang ditulis dengan buruk yang berjalan di komputer saya sekarang.
Foliovision

1
Catatan untuk diri sendiri: Jika Anda memerlukan variabel lingkungan: serverfault.com/questions/111391/…
Quandary

48

Solusi sederhana lain dari Stack Overflow : Anda dapat:

  • Mulai Automator.app;
  • Pilih "Aplikasi";
  • Klik "Tampilkan pustaka" di bilah alat (jika tersembunyi);
  • Tambahkan "Jalankan skrip shell" (dari Actions / Utilities);
  • Salin dan tempel skrip Anda ke jendela;
  • Menguji;
  • Simpan di suatu tempat: file yang dipanggil your_name.appakan dibuat);
  • Tergantung versi MacOSX Anda:
    • Versi lama : Buka Preferensi Sistem → Akun → Item masuk, atau
    • Versi baru : Buka Preferensi Sistem → Pengguna dan Grup → Item masuk (kanan atas);
  • Tambahkan aplikasi yang baru dibuat ini;

Logoff, log in kembali, dan Anda harus selesai. ;)


2
Diuji dan berfungsi dan tidak memerlukan launchd plist editing yang rumit atau aplikasi Lingon berbayar.
Lukasz

4
Namun, itu menambahkan sekitar 1804k boilerplate ke shellscript tiga baris Anda!
android.weasel

1
Terima kasih atas petunjuk terperinci tentang membuat sesuatu yang bermanfaat dengan Automator. Ini akan membantu saya bukan hanya dengan satu tugas. Terima kasih, Jaime. Saya menggunakannya untuk mematikan Turbo Boost melalui Turbo Boost Switcher. Saya memiliki versi berbayar tetapi mekanisme lisensi cukup buruk. Saya lebih suka menggunakan versi gratis yang memerlukan peluncuran melalui terminal untuk menghindari permintaan kata sandi admin setiap kali bangun dari tidur.
Foliovision

1
@ android.weasel Lihat jawaban Geekarist superuser.com/a/995564/255375
JD

Superuse-ful :-D, +1
Mukul Goel

28

Untuk meluncurkan perintah saat masuk, Anda dapat melakukan ini:

  • Buat file teks yang berisi perintah Anda (skrip bash):

    #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
  • Simpan file ini di ~/Library/Startup.cmd

  • Anda dapat mengujinya dengan mengklik dua kali file di Finder
  • Jadikan itu dapat dieksekusi: chmod +x ~/Library/Startup.cmd
  • Tambahkan file ini di System Preferences> Accounts> Item login

3
jawaban imho terbaik dan termudah. jauh lebih mudah daripada solusi yang diterima. perhatikan bahwa ada di System Preferences> Users & Groups> Item login ... (bukan Akun) ... dan juga perhatikan bahwa file itu bisa di mana saja, tidak harus diakhiri dengan .cmd juga. hanya chmod + x itu.
foreyez

5
Namun, item masuk dijalankan saat masuk, bukan saat startup sistem. Jika Anda menjalankan server, itu perbedaan besar.
not2savvy

Anda benar @ not2savvy. Untuk server saya akan merekomendasikan jawaban @ Sridhar-Sarnobat dengan @reboot. Namun jawaban saya akan memungkinkan untuk memulai program grafis, itu sebabnya saya pikir ini berguna.
Geekarist

Mengapa diakhiri dengan cmdalih - alih sh?
Simin Jie

3

Anda harus melihat bagaimana launchddan launchctlbekerja pada MacOS. Anda bisa mulai dengan membaca halaman manual untuk kedua perintah. Anda kemudian dapat melihat ke dalam /Library/LaunchAgents/dan /Library/LaunchDaemons/untuk contoh cara mengatur aplikasi untuk memuat pada waktu yang berbeda melalui launchctlantarmuka.

Inilah contoh yang saya temukan di Stack Overflow yang mungkin bisa membantu Anda lebih jauh.



0

Saya tertarik pada jawaban unix yang sangat sederhana untuk masalah ini dan menemukannya di situs lain . Berikut ini ringkasan solusinya.

Standar untuk shell login adalah untuk selalu mencari file konfigurasi bash dengan "profil" di namanya, dalam urutan ini: / etc / profile, ~ / .bash_profile, lalu ~ / .bash_login dan terakhir ~ / .profile. Ketika shell login keluar, mereka membaca ~ / .bash_logout.

Dalam kasus saya, saya baru saja membuat ~ / .bash_profile dan kemudian saya membuka preferensi untuk aplikasi Terminal Mac dan mengubah opsi "Shell opens with" dari default menjadi / bin / bash. Itu dia. Bersih dan sederhana.


-3

terminal terbuka, ketik

nano ~/.bash_profile

kemudian tambahkan teks ini ke file:

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log

3
Ini akan mengasumsikan Anda membuka jendela Terminal setelah masuk.
Arjan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.