Menjalankan skrip saat login mac [ditutup]

280

Saya bertanya-tanya apakah ada yang bisa membantu saya mendapatkan file .sh untuk dijalankan ketika saya masuk ke akun saya di komputer saya. Saya menjalankan Mac OS X 10.6.7.

Saya memiliki file "Example.sh" yang ingin saya jalankan ketika saya masuk ke komputer saya. Saya tidak punya masalah menjalankannya ketika saya sudah masuk, tetapi saya ingin ini berjalan secara otomatis.

Orang-orang mengatakan untuk menambahkannya ke file shell login, tetapi saya tidak tahu di mana itu. Tolong bantu.

MZimmerman6
sumber
3
Ini bukan di luar topik ... Saya membutuhkannya untuk memulai daemon Emacs saya;) BTW jawaban terbaik adalah IMHO aplikasi Lingon X.
HappyFace
1
Saya tidak peduli apakah ini di luar topik. Ini adalah jawaban terbaik yang saya temukan di internet dan layak untuk dihormati. Saya mengabaikannya untuk orang lain yang pertama kali mencari solusi dan itu adalah kesalahan besar!
Sethmr

Jawaban:

379

Ikuti ini:

  • Mulailah Automator.app
  • Pilih Application
  • klik Show librarydi bilah alat (jika disembunyikan)
  • tambah Run shell script(dari Actions/Utilities)
  • salin & tempel skrip Anda ke jendela
  • menguji
  • simpan di suatu tempat (misalnya Anda dapat membuat Applicationsfolder di HOME Anda, Anda akan mendapatkan your_name.app)

  • pergi ke System Preferences-> Accounts->Login items

  • tambahkan aplikasi ini
  • tes & selesai;)

EDIT:

Baru-baru ini saya mendapatkan lencana "Jawaban yang bagus" untuk jawaban ini. Sementara solusi saya sederhana dan berfungsi, cara terbersih untuk menjalankan program atau skrip shell apa pun saat login dijelaskan dalam jawaban @ trisweb , kecuali, Anda menginginkan interaktivitas .

Dengan solusi automator Anda dapat melakukan hal-hal seperti berikut: aplikasi login tangkapan layar automator

jadi, meminta untuk menjalankan skrip atau keluar dari aplikasi, meminta kata sandi, menjalankan alur kerja automator lain pada saat masuk, menjalankan aplikasi pada saat masuk dan seterusnya ...

jm666
sumber
2
@GregMiernicki LOL, selamat pagi ...;) Hampir setahun yang lalu menambahkan EDIT ke jawaban saya, di mana mengatakan ini juga. Tapi, ini sedikit lebih sederhana untuk pengguna rata-rata, karena membuat file XML (plist), tidak ramah pengguna bagi banyak pengguna. Pokoknya - thanx untuk komentar. ;)
jm666
4
@GregMiernicki dan jangan lupa, dengan solusi Automator Anda dapat membuat skrip login INTERAKTIF - misalnya skrip yang akan meminta Anda untuk beberapa entri (mis. Kata sandi tambahan atau semacamnya). Dunia tidak hanya hitam atau putih - setidaknya, itu seperti zebra ... :) :)
jm666
2
@Cupidvogel Menjalankan daemon pada saat masuk adalah pekerjaan yang tepat untuk solusi launchd - lihat jawaban trisweb. Jika Anda dapat mengelola daemon python, Anda tentu dapat mengelola file konfigurasi plist di mana Anda dapat mengatur semua aspek restart dan sebagainya ...
jm666
3
Kudos karena menunjukkan jawaban yang lain sebagai yang terbersih. Itu harus mendapatkan lencana kewarganegaraan yang baik :).
studgeek
2
Jawaban yang luar biasa. Lakukan ekspor PATH = / usr / local / bin: $ PATH, di awal skrip, jika Anda ingin menjalankan perintah seperti "komposer global update" pada startup sistem.
Leonardo
377

tl; dr: gunakan peluncur dan pengelola proses asli OSX launchd,.

Untuk melakukannya, buat launchctldaemon. Anda akan memiliki kontrol penuh atas semua aspek skrip. Anda dapat berlari sekali atau tetap hidup sebagai daemon. Dalam kebanyakan kasus, ini adalah jalan yang harus ditempuh.

  1. Buat .plistfile sesuai dengan petunjuk dalam dokumen Apple Dev di sini atau detail lainnya di bawah ini.
  2. Tempatkan di ~/Library/LaunchAgents
  3. Masuk (atau jalankan secara manual melalui launchctl load [filename.plist])

Untuk lebih lanjut tentang launchd, artikel wikipedia cukup bagus dan menggambarkan sistem dan kelebihannya dibandingkan sistem yang lebih tua lainnya.


Inilah file plist khusus untuk menjalankan skrip saat masuk .

Diperbarui 2017/09/25 untuk OSX El Capitan dan yang lebih baru (kredit ke José Messias Jr ):

<?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>com.user.loginscript</string>
   <key>ProgramArguments</key>
   <array><string>/path/to/executable/script.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

Ganti <string>setelah kunci Program dengan perintah yang Anda inginkan (perhatikan bahwa skrip yang dirujuk oleh perintah itu harus dapat dieksekusi: chmod a+x /path/to/executable/script.shuntuk memastikan itu untuk semua pengguna).

Simpan sebagai ~/Library/LaunchAgents/com.user.loginscript.plist

Jalankan launchctl load ~/Library/LaunchAgents/com.user.loginscript.plistdan keluar / masuk untuk menguji (atau untuk menguji langsung, jalankan launchctl start com.user.loginscript)

Ekor /var/log/system.loguntuk pesan kesalahan.

Kuncinya adalah bahwa ini adalah entri launchd khusus pengguna, sehingga akan dijalankan saat login untuk pengguna yang diberikan. Daemon peluncuran khusus sistem (ditempatkan di /Library/LaunchDaemons) dijalankan saat boot.

Jika Anda ingin skrip dijalankan saat masuk untuk semua pengguna, saya percaya LoginHook adalah satu-satunya pilihan Anda, dan mungkin itulah alasannya.

trisweb
sumber
4
Iya. FWIW Saya menemukan blog ini pada teknik yang sama membantu: developernotes.com/archive/2011/04/06/169.aspx
Daniel James
8
Anda lalai menyebutkan apa yang meragukan tentang tindakan Automator, dan mengapa itu 'tidak direkomendasikan'.
Mike Campbell
4
Berikut ini adalah ikhtisar yang baik tentang tindakan folder vs launchctl: apple.stackexchange.com/a/63731/38290 - Dan yang lain tentang salah satu batasan LoginHook (hanya satu skrip diizinkan) - superuser.com/a/377401 . Ini sebenarnya bukan metode yang meragukan atau buruk, tetapi launchctllebih baik dalam kebanyakan kasus, dan memberi Anda kontrol lebih besar atas semua aspek yang mungkin dari menjalankan skrip Anda. Ini lebih dalam arti "mengapa menggunakan metode yang kurang mampu ketika launchd ada?" (Catatan saya telah mengubah kalimat pertama untuk menunjukkan bahwa saya pribadi tidak merekomendasikan ini untuk situasi ini).
trisweb
3
Ingin tahu bagaimana Anda akan membuat LaunchDaemon plist, apa yang akan berjalan setiap kali ketika pengguna masuk? . Jadi, bukan saat sistem melakukan boot, tetapi setiap saat pengguna masuk (coba dengan siklus logout-login). Bisakah Anda menunjukkan dengan tepat (tidak hanya bla-bla) bagaimana menerapkan solusi automator di atas (dengan Anda salah) dengan launchctl?
cajwine
9
Plist file di / Library / LaunchAgents / dijalankan saat login dengan id dari pengguna yang login. Plist file di / Library / LaunchDaemons / dijalankan pada saat boot sebagai root (id dapat diubah dengan kunci Pengguna ).
bain
42
  1. Buat skrip shell Anda seperti login.shdi folder $ HOME Anda.

  2. Rekatkan skrip satu baris berikut ke dalam Script Editor:

    lakukan skrip shell "$ HOME / login.sh"

  3. Kemudian simpan sebagai aplikasi.

  4. Akhirnya tambahkan aplikasi ke item login Anda.

Jika Anda ingin membuat output skrip visual, Anda dapat menukar langkah 2 untuk ini:

tell application "Terminal"
  activate
  do script "$HOME/login.sh"
end tell

Jika beberapa perintah diperlukan, sesuatu seperti ini dapat digunakan:

tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell
anubhava
sumber
1
Saya menautkan yang ini, satu-satunya yang hilang installer baris perintah;)
sorin
1
Solusi bagus Bagaimana saya bisa menyembunyikan jendela "login"? Saya mencoba mencentang item masuk.
xgdgsc
1
@xgdgsc: Masuk Go to System Preferences -> Accounts -> Login itemsdan centang kotak sembunyikan untuk aplikasi ini.
anubhava
1
@ anubhava Seperti yang saya katakan, saya sudah mencentang kotak hide untuk aplikasi login ini. Tetapi masih muncul dan harus dipaksa untuk berhenti ketika mematikan komputer.
xgdgsc
2
@xgdgsc: Oh ok, apakah Anda memeriksa ~/Library/LaunchAgentsfolder?
anubhava