Apakah ada cara idiomatis di Ubuntu untuk menjalankan skrip hanya saat mesin pertama kali di-boot? (EC2).
boot
scripts
amazon-ec2
Roberto Aloi
sumber
sumber
$0
khusus untuk bash (versi> = 3). Untuk tujuan kompatibilitas, Anda dapat memberikan nama file skrip, menjadikannya kurang umum:rm /etc/init.d/script
Buat file pelacakan saat skrip berjalan. Jika file sudah ada, keluar dari skrip.
sumber
Menggabungkan dua jawaban pertama Asumsikan Anda menamai skrip Anda,
/usr/local/bin/firstboot.sh
taruh di akhir/etc/rc.local
(skrip ini berjalan pada setiap boot) skrip berjalan seperti inisumber
Saya terkejut dengan hasil yang saya lihat untuk mencari kait "boot pertama" Ubuntu yang terdefinisi dengan baik dan didukung. Sepertinya kerumunan Red Hat / Fedora / CentOS telah dipaku selama lebih dari satu dekade. Setara dengan Ubuntu terdekat tampaknya adalah oem-config-firstboot .
Gagasan hanya melakukan
rm $0
kehendak bekerja. Tapi, secara teknis ada beberapa semantik menarik yang terlibat. Tidak seperti kebanyakan penerjemah skrip lainnya di bawah Unix, skrip shell dibaca dan diproses satu baris / pernyataan setiap kali. Jika Anda memutuskan tautan (rm
) file keluar dari bawahnya maka instance dari shell yang memproses skrip itu sekarang bekerja dengan file anonim (file apa pun yang terbuka tetapi tidak terhubung).Pertimbangkan file seperti ini:
Jika Anda menyimpannya ke sesuatu seperti
rmself.sh
dan (menghubungkan) ke sesuatu seperti itutst
maka menjalankannya./tst
akan menampilkan sesuatu seperti ini sebagai keluaran:Sekarang ada beberapa kemungkinan kasus sudut aneh berkaitan dengan symlinks dan kasus-kasus di mana skrip dipanggil sebagai nama kosong (memaksa shell untuk mencari
$PATH
skrip.Tetapi tampaknya
bash
(setidaknya dalam versi 3.2) menambahkan$0
dengan path jika ia mencari path dan jika tidak meninggalkan $ 0 set ke apa pun relatif atau absolut path digunakan untuk menjalankan skrip. Tampaknya tidak melakukan normalisasi atau resolusi jalur relatif atau symlink.Mungkin "firstboot" terbersih untuk Ubuntu adalah membuat paket kecil (.deb) yang berisi skrip untuk ditempatkan
/etc/init.d/firstboot
dan skrip post-install yang digunakanupdate-rc.d
untuk menautkan itu ke runlevel 1 (/etc/rc1.d
) (menggunakan perintah seperti:)update-rc.d firstboot defaults
. .. dan kemudian mintalah baris terakhir melakukan penonaktifan atau menghapus menggunakan sesuatu seperti:update-rc.d firstboot disable
Berikut tautan ke pembaruan Debian-rc.d HOWTO
sumber
Anda dapat mencadangkan rc.local saat ini ke rc.local.bak
Maka Anda dapat memiliki hal-hal yang ingin Anda lakukan di rc.local dan pada akhirnya hanya mv /etc/rc.loca.bak /etc/rc.local.
sumber
Pertanyaannya adalah tentang menjalankan skrip saat boot pertama EC2. Anda dapat menggunakan
cloud-init
untuk tujuan ini.Saat meluncurkan instance EC2 baru Anda memiliki opsi untuk mendefinisikan di
User data
bawahAdvanced datails
. Jika Anda menempatkancloud-init
skrip di sana, skrip akan dijalankan hanya saat boot pertama.Misalnya, Anda dapat menempatkan yang berikut ini di
User data
:Output akan ditulis ke
/var/log/cloud-init-output.log
Cloud-init
dapat melakukan lebih dari ini. Ini dirancang khusus untuk melakukan inisialisasi awal dari instance cloud. Lihat dokumen di sini: http://cloudinit.readthedocs.io/en/latest/index.htmlsumber