Bir komut dosyasını yalnızca ilk önyüklemede çalıştırma


12

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:


14

Hayır. Ancak komut dosyanızı yerleştirip /etc/init.d/scriptkendi kendini silmek isteyebilirsiniz :

#!/bin/bash

echo "Bump! I'm your first-boot script."

# Delete me
rm $0

Lütfen dikkat, $0bash'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
Andrejs Cainikovs

4
0 $ bash'a özgü DEĞİLDİR ve bash 3.x'in etrafından çok daha uzun süredir desteklenmektedir (ve Bourne, Korn, zsh ve diğerlerinde desteklenmektedir). Yapıştırma noktası, $ 0'ın tam veya göreli yol belirtimi içerip içermediğidir. İhtiyacınız olursa tam yolu elde etmenin güvenilir bir yolunu burada bulabilirsiniz: stackoverflow.com/questions/4774054/…
Jim Dennis

7

Komut dosyası çalıştığında bir izleme dosyası oluşturun. Dosya zaten varsa komut dosyasından çıkın.


4
İlk bakışta öyle görünmese de, komut dosyasını silmekten daha iyi bir çözüm olabilir, çünkü isterseniz yeniden tetikleme olasılığını korur.
msanford

7

İlk iki yanıtı birleştirme Komut dosyanızı /usr/local/bin/firstboot.shsonuna 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

Bu mutlaka sysmtemd ile çalışmaz. Son komut dosyası çalıştırmak emin olmak için bir uyku 20 eklemeniz gerekir.
mrossi

/Etc/rc.local/99-firstboot.sh adını verirseniz, en son çalıştırılması gerekir.
JohnDavid

3

İ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 $0vasiyetname 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. rmDosyayı 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.shve (sabit) gibi bir şeye bağlarsanız, tsto zaman çalışan ./tstbir çı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 $PATHbetiğ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) $0yolu 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/firstbootve update-rc.dbunu ç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


0

Geçerli rc.local dosyasını rc.local.bak dosyasına yedekleyebilirsiniz

Sonra rc.local'da yapmak istediğiniz şeylere sahip olabilirsiniz ve sonunda mv /etc/rc.loca.bak /etc/rc.local.


0

Soru, EC2'nin ilk açılışında bir komut dosyası çalıştırmaktı. cloud-initBu amaçla kullanabilirsiniz .

Yeni bir EC2 örneği başlatırken User dataaltında tanımlamak için bir seçeneğiniz vardır Advanced datails. Eğer yerleştirirseniz cloud-initorada 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-initbundan ç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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.