cara mendapatkan skrip shell untuk dijalankan saat startup di Yosemite

21

Ada direktori di System / Library untuk item startup yang saya kira: StartupItems

Saya perlu memiliki skrip shell yang akan mengkonfigurasi antarmuka ethernet saat start up, dengan alamat jaringan lokal dan subnet mask. Saya perlu melakukan ini karena preferensi jaringan untuk mengkonfigurasi antarmuka ethernet TIDAK akan mengaturnya menggunakan pengaturan manual. INI tampaknya bug serius, atau instalasi saya buruk.

Saya diberi saran untuk menggunakan networksetup dari baris perintah tapi itu tidak akan mengkonfigurasi antarmuka ethernet sedemikian rupa sehingga konfigurasi akan ada di sana saat reboot.

Script perlu melakukan tugasnya dengan hak akses root, atau dengan sudo, tetapi saya mengasumsikan bahwa jika menggunakan sudo, akan ada dialog kata sandi yang disajikan pada saat boot ketika proses boot sampai ke script itu.

(Saya sudah memiliki pengalaman yang cukup dengan FreeBsd dan Linux untuk menemukan jalan saya di terminal, tetapi belum tentu seperti yang berlaku untuk Mac OSX)

JeffK
sumber

Jawaban:

18

Salah satu cara untuk melakukannya adalah dengan memberikan script layanan launchd:

Buat skrip shell seperti biasa. Kemudian Anda dapat membuat layanan launchd untuk menjalankannya saat startup. Itu terletak di /Library/LaunchDaemons. Ini dalam format daftar properti XML. Buat yang lain dan isi dengan sesuatu seperti ini:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.example.app</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/sh</string>
            <string>/path/to/script</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <false/>
    </dict>
</plist>

Ubah com.example.app, /bin/shdan /path/to/scriptsesuai kebutuhan.

Script kemudian akan berjalan saat sistem boot. Jika berjalan terlalu dini, Anda dapat menulis skrip untuk mencoba dan melakukan apa yang perlu dilakukan sampai berhasil, atau membiarkannya keluar dengan kode kesalahan tidak nol dan menambahkan ini ke daftar properti sebelum </dict>baris:

<key>KeepAlive</key>
<dict>
     <key>SuccessfulExit</key>
     <false/>
</dict>

Untuk informasi lebih lanjut tentang daemon peluncuran OS X dan layanan, saya sarankan mencari di sini untuk referensi cepat yang bagus untuk membuatnya, atau di sini untuk referensi yang lebih komprehensif tentang apa yang bisa dilakukan launchd.

andonuts
sumber
Apa yang Anda sebut dokumen plist ini? Dan apakah script / path / to / script == / System / Library / StartupItems /?
JeffK
1
Untuk pertanyaan pertama: Nama dokumen plist umumnya menggunakan kunci Label apa yang ada di daftar properti diatur (dalam hal ini, "com.example.app") dengan ekstensi .plist.
andonuts
1
Untuk pertanyaan kedua: Itu benar, tetapi skrip harus dipindahkan ke tempat lain.
andonuts
Plist Anda salah. Anda memerlukan Kunci: <key>Program</key>dengan nilainya <string>/bin/sh</string>dan kemudian <key>ProgramArguments</key>hanya memiliki nilainya<string>/path/to/script</string>
Jon Brooks
Sebenarnya, milik saya juga salah: <key>ProgramArguments</key>harus berupa array ..
Jon Brooks
16

Beberapa waktu lalu saya menggunakan cron untuk melakukan hal itu. Anda dapat membuat entri seperti ini

@reboot /path/to/my/script

Info lebih lanjut di sini

Alih-alih lima bidang pertama, satu dari delapan string khusus dapat muncul:

       string          meaning
       ------          -------@reboot ------@reboot
       @reboot         Run once, at startup.
       @yearly         Run once a year, "0 0 1 1 *".
       @annually       (same as @yearly)
       @monthly        Run once a month, "0 0 1 * *".
       @weekly         Run once a week, "0 0 * * 0".
       @daily          Run once a day, "0 0 * * *".
       @midnight       (same as @daily)
       @hourly         Run once an hour, "0 * * * *".
sjosen
sumber
1
Sangat berguna untuk diketahui!
geotheory
7
cronbukan cara yang tepat untuk melakukan ini pada OS X hari ini. Gunakan LaunchAgent atau LaunchDeamon sebagai gantinya (launchd). Untuk info lebih lanjut: developer.apple.com/library/mac/documentation/MacOSX/Conceptual/… Although it is still supported, cron is not a recommended solution. It has been deprecated in favor of launchd.
CousinCocaine
4
cronjauh lebih mudah untuk dikonfigurasi daripada launchd. Bandingkan saja kedua jawaban di utas ini untuk melihat apa yang saya maksud. cronmengambil satu baris dalam satu file, di mana launchdmembutuhkan skrip untuk menggambarkan skrip yang ingin Anda jalankan saat boot.
Dannid
@Dannid Kron tidak sensitif untuk menjalankan duplikasi, buffering antrian, dan lainnya. Meskipun layak dalam kasus ini, itu tidak selalu merupakan kunci kerangka, juga bukan solusi idiomatik.
New Alexandria
Crontab jauh lebih baik. Ini cepat dan kotor dan lama didirikan di dunia Unix. Saya benar-benar menggali kata kunci @reboot ini.
macetw