Saya sedang menulis skrip shell di bash. Pada titik tertentu dalam skrip, ia mendeteksi bahwa mesin perlu di-boot ulang sebelum melanjutkan. Ini masalah:
sudo reboot
Ketika mesin muncul kembali, ada lebih banyak pekerjaan yang perlu dilakukan skrip ini. Bagaimana cara mengkonfigurasi sesuatu untuk terus melakukan pekerjaan dalam skrip ini?
Saya berasumsi bahwa ada beberapa tempat yang bisa saya tuliskan skrip shell sehingga akan dieksekusi pada reboot berikutnya. Di mana tempat seperti itu? Saya melihat bahwa cron memiliki arahan @reboot. Saya juga tahu bahwa layanan seperti Apache dimulai saat boot oleh pemula. Apakah salah satu dari itu mekanisme yang tepat? Jika demikian, bagaimana hal itu dipicu?
Script ini hanya perlu dijalankan sekali, tidak setiap reboot. Jadi itu harus pergi ke suatu tempat yang hanya berjalan pada reboot berikutnya, atau dapat menghapus sendiri setelah dijalankan.
Pertanyaan ini menanyakan tentang bagaimana cara menyimpan status aplikasi Anda setelah reboot. Skrip saya tidak memiliki banyak status, jadi saya dapat mengaturnya. Saya hanya perlu tahu bagaimana agar skrip ini memicu sesuatu untuk dijalankan setelah reboot berikutnya.
Versi spesifik saya adalah Ubuntu Linux 14.04. Skrip asli dimulai pada baris perintah oleh administrator sistem (bukan menjalankan dari cron).
sumber
Jawaban:
Pada suatu sistem, satu-satunya hal yang benar-benar persisten adalah file. Cukup banyak yang harus Anda gunakan. Inilah solusi menggunakan skrip init.d.
Mari kita mempertimbangkan (sederhana) script berikut,
/etc/init.d/myupdate
:Jika Anda mengaktifkannya dengan
update-rc.d myupdate defaults
,start
tindakan akan dieksekusi saat boot. Sekarang, ketika skrip pembaruan Anda memanggil untuk reboot:Dengan solusi ini, Anda dapat membagi skrip pembaruan Anda menjadi dua bagian:
Ini akan menjalankan bagian
before_reboot
kode, membuat file/var/run
, dan reboot. Saat boot, skrip akan dipanggil lagi, tetapi karena file ada,after_reboot
akan dipanggil bukanbefore_reboot
.Catat itu
update-rc.d
membutuhkan hak akses root.Tanpa menggunakan file (dari Stephen Ostermiller ):
Jika Anda terbiasa dengan
getopts
utilitas, Anda mungkin ingin menggunakan opsi, bukan file. Di skrip init, panggil skrip dengan:Dan dalam skrip Anda, periksa opsi bukan file. Panggil skrip Anda satu kali tanpa opsi, dan init.d akan memanggilnya lagi saat boot, kali ini dengan
-r
.Anda akan menemukan informasi lebih lanjut tentang penanganan opsi di sini (hanya untuk opsi singkat) . Saya juga mengedit skrip saya dengan panggilan
update-rc.d
untuk menjadikan ini pekerjaan satu kali (dari komentar lain).sumber
/path/to/update/script --after-reboot
dari/etc/init.d/myupdate
daripada mengandalkan kehadiran/var/run/rebooting-for-updates
. Maka itu akan memiliki argumen yang berbeda ketika dijalankan secara langsung vs dipanggil saat boot.update-rc.d myupdate defaults
danupdate-rc.d myupdate remove
ke dalam skrip itu sendiri, serta penulisan dan penghapusan/etc/init.d/myupdate
sehingga tidak meninggalkan file duduk-duduk.INIT INFO
bagian: wiki.debian.org/LSBInitScripts