Ubuntu'da bir komut dosyasını çalıştırmanın yalnızca bir makine ilk kez başlatıldığında deyimsel bir yolu var mı? (EC2).
Ubuntu'da bir komut dosyasını çalıştırmanın yalnızca bir makine ilk kez başlatıldığında deyimsel bir yolu var mı? (EC2).
Yanıtlar:
Hayır. Ancak komut dosyanızı yerleştirip /etc/init.d/script
kendi kendini silmek isteyebilirsiniz :
#!/bin/bash
echo "Bump! I'm your first-boot script."
# Delete me
rm $0
İlk iki yanıtı birleştirme Komut dosyanızı /usr/local/bin/firstboot.sh
sonuna koyduğunuzu varsayarsak /etc/rc.local
(bu komut dosyaları her önyüklemede çalışır) komut dosyaları şöyle devam eder
#! / Bin / bash FLAG = "/ var / log / firstboot.log" Eğer [ ! -f $ BAYRAK]; sonra # Başlama cümlelerinizi buraya koyun echo "Bu ilk açılış" #the next satırı boş bir dosya oluşturur, böylece bir sonraki önyüklemeyi çalıştırmaz $ FLAG değerine dokunun Başka echo "Hiçbir şey yapma" fi
İyi tanımlanmış ve desteklenen bir Ubuntu "ilk önyükleme" kancasını aramak için gördüğüm sonuçlara şaşırdım. Red Hat / Fedora / CentOS kalabalığı on yıldan fazla bir süredir çivilenmiş gibi görünüyor. En yakın Ubuntu eşdeğeri oem-config-firstboot gibi görünüyor .
Bir rm $0
vasiyetname yapma fikri işe yarıyor. Ancak, teknik olarak ilginç bazı anlambilim söz konusudur. Unix altındaki diğer çoğu komut yorumlayıcısının aksine, bir kabuk komut dosyası her seferinde bir satır / ifade okunur ve işlenir. rm
Dosyayı altından kaldırırsanız ( ) o komut dosyasını işleyen kabuğun örneği artık anonim bir dosyayla (açık ancak bağlantısı kesilmiş herhangi bir dosya) çalışıyor demektir.
Bunun gibi bir dosya düşünün:
#!/bin/bash
rm $0
echo "I've removed myself: $0"
ls -l $0
cat <<COMMENTARY
This is a test.
I'm still here, because the "here" doc is being fed to 'cat'
via the anonymous file through the open file descriptor.
But I cannot be re-exec'd
COMMENTARY
exec $0
Bunu gibi bir şeye kaydederseniz rmself.sh
ve (sabit) gibi bir şeye bağlarsanız, tst
o zaman çalışan ./tst
bir çıktı olarak göstermelidir:
$ ./tst
I've removed myself: ./tst
ls: ./tst: No such file or directory
This is a test.
I'm still here, because the "here" doc is being fed to 'cat'
via the anonymous file through the open file descriptor.
But I cannot be re-exec'd
./tst: line 11: /home/jimd/bin/tst: No such file or directory
./tst: line 11: exec: /home/jimd/bin/tst: cannot execute: No such file or directory
Simgelere ve betiğin çıplak bir isim olarak çağrıldığı durumlarda kabuğun $PATH
betiği aramaya zorlamasıyla ilgili bazı olası köşe vakaları vardır .
Ama öyle görünüyor ki bash
(en azından sürüm 3.2'de) $0
yolu arar ve aksi takdirde komut dosyasını çağırmak için kullanılan göreceli ya da mutlak yola ayarlanmış olarak 0 $ bırakırsa yolla devam eder. Normalleştirme veya çözünürlükle ilgili yollar veya semboller yapmıyor gibi görünüyor.
Muhtemelen Ubuntu için en temiz "ilk önyükleme", yerleştirilecek bir komut dosyası /etc/init.d/firstboot
ve update-rc.d
bunu çalışma düzeyi 1 ( /etc/rc1.d
) 'ye (: gibi bir komut kullanarak) bağlamak için kullanılan bir yükleme sonrası komut dosyası içeren küçük bir paket (.deb) oluşturmak olacaktır update-rc.d firstboot defaults
. .. ve son satırın bir devre dışı bırakma işlemini gerçekleştirmesini veya şunun gibi bir şeyi silmesini sağlayın:update-rc.d firstboot disable
İşte Debian güncellemesine bir link -rc.d NASIL
Soru, EC2'nin ilk açılışında bir komut dosyası çalıştırmaktı. cloud-init
Bu amaçla kullanabilirsiniz .
Yeni bir EC2 örneği başlatırken User data
altında tanımlamak için bir seçeneğiniz vardır Advanced datails
. Eğer yerleştirirseniz cloud-init
orada senaryoyu, ilk açılışta sadece idam edilecektir.
Örneğin, aşağıdakileri yerleştirebilirsiniz User data
:
#cloud-config
runcmd:
- /usr/bin/command1.sh
- /usr/bin/command2.sh
Çıktı, /var/log/cloud-init-output.log
Cloud-init
bundan çok daha fazlasını yapabilir. Özellikle bulut bulut sunucularının erken başlatılması için tasarlanmıştır. Buradaki dokümanlara bakın: http://cloudinit.readthedocs.io/en/latest/index.html
$0
bash'a özgüdür (sürüm> = 3). Uyumluluk amacıyla, bunun yerine komut dosyası dosya adı sağlayarak bunu daha az genel yapabilirsiniz:rm /etc/init.d/script