Bir komut dosyasını makineyi yeniden başlattıktan sonra nasıl devam ettirilir?


18

Bash'da bir kabuk betiği yazıyorum. Komut dosyasının bir noktasında, devam etmeden önce makinenin yeniden başlatılması gerektiğini algılar. Konuları:

sudo reboot

Makine geri geldiğinde, bu komut dosyasının yapması gereken daha fazla iş var. Bu komut dosyasında çalışmaya devam etmek için bir şeyi nasıl yapılandırabilirim?

Bir sonraki yeniden başlatıldığında çalıştırılacak şekilde bir kabuk komut dosyası yazabileceğim bir yer olduğunu varsayıyorum. Böyle bir yer nerede? Görüyorum ki cron'un @reboot yönergesi var. Ayrıca Apache gibi hizmetlerin önyükleme sırasında başlatıldığını biliyorum. Bunlardan herhangi biri uygun mekanizmalar olabilir mi? Eğer öyleyse, nasıl tetiklenir?

Bu komut dosyasının yalnızca bir kez çalıştırılması gerekir, her yeniden başlatmanın değil. Bu nedenle, bir sonraki yeniden başlatmada çalışan bir yere gitmeli veya çalıştıktan sonra kendisini kaldırabilmelidir.

Bu soru , yeniden başlatma sonrasında uygulama durumunuzu nasıl kaydedeceğinizi sorar. Senaryomun durumu çok fazla değil, bu yüzden bunu başarabilirim. Sadece bu komut dosyası bir sonraki yeniden başlatmadan sonra çalıştırmak için bir şey tetiklemek için bilmek gerekir.

Benim özel sürümüm Ubuntu Linux 14.04. Orijinal komut dosyası, komut satırında bir sistem yöneticisi tarafından başlatılır (cron'dan çalıştırmanın aksine).


Bir komut dosyasındaki yeniden başlatma, yalnızca komut dosyasından kaçınamazsanız kullanılmalıdır. Örneğin yeni bir çekirdek kurulumu. Eminim işinizi yeniden başlatmadan yapabilirsiniz. Neden yeniden başlatmaya ihtiyacınız olduğunu belirtebilir misiniz?
chaos

1
Bu komut dosyası yeni bir çekirdek yükler (ya da daha doğrusu bunu yapabilen apt yükseltmesi çağırır). Ayrıca, yeniden başlatmadan önce yeniden başlatmanın gerçekten gerekli olup olmadığını da kontrol eder.
Stephen Ostermiller

Msgstr "Bir komut dosyasındaki yeniden başlatma yalnızca ondan kaçınamayacaksanız kullanılmalıdır." - @chaos Neden?
John Red

Yanıtlar:


16

Bir sistemde, gerçekten kalıcı olan tek şey bir dosyadır. Kullanmanız gereken hemen hemen bu. İşte init.d komut dosyası kullanan bir çözüm.

Aşağıdaki (basit) komut dosyasını ele alalım /etc/init.d/myupdate:

#! /bin/sh

### BEGIN INIT INFO
# Provides:          myupdate
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin

case "$1" in
    start)
        /path/to/update/script
        ;;
    stop|restart|reload)
        ;;
esac

İle etkinleştirirseniz update-rc.d myupdate defaults, starteylem önyükleme sırasında yürütülür. Şimdi, güncelleme komut dosyanız yeniden başlatmayı gerektirdiğinde:

touch /var/run/rebooting-for-updates
sudo reboot

Bu çözümle, güncelleme komut dosyanızı iki bölüme ayırabilirsiniz:

before_reboot(){
    # Do stuff
}

after_reboot(){
    # Do stuff
}

if [ -f /var/run/rebooting-for-updates ]; then
    after_reboot
    rm /var/run/rebooting-for-updates
    update-rc.d myupdate remove
else
    before_reboot
    touch /var/run/rebooting-for-updates
    update-rc.d myupdate defaults
    sudo reboot
fi

before_rebootKod bölümünü yürütür, içinde bir dosya oluşturur /var/runve yeniden başlatır. Önyükleme tamamlandığında, komut dosyası yeniden çağrılacaktır, ancak dosya bulunduğundan after_rebootyerine bunun yerine çağrılacaktır before_reboot.

update-rc.dKök ayrıcalıkları gerektiren not .

Bir dosya kullanmadan ( Stephen Ostermiller'in yorumundan):

getoptsYardımcı programa aşina iseniz, dosyalar yerine seçenekleri kullanmak isteyebilirsiniz. İnit betiğinde betiği şununla çağırın:

/path/to/update/script -r

Senaryonuzda dosya yerine seçenekleri kontrol edin. Komut dosyanızı seçenek olmadan bir kez çağırın ve init.d bu sefer önyüklemede yeniden çağırır -r.

# Set AFTER_REBOOT according to options (-r).

if [ "x$AFTER_REBOOT" = "xyes" ]; then
    # After reboot
else
    # Before reboot
fi

Burada seçenek işleme hakkında daha fazla bilgi bulabilirsiniz (yalnızca kısa seçenekler için) . Ayrıca update-rc.dbu bir kerelik bir iş (başka bir yorumdan) tutmak için çağrıları ile benim komut düzenledi .


2
Aramaya basit olabilir /path/to/update/script --after-rebootdan /etc/init.d/myupdatevarlığına güvenerek yerine /var/run/rebooting-for-updates. Sonra doğrudan vs boot önyükleme çalıştırıldığında farklı argümanlar olurdu.
Stephen Ostermiller

Güzel bir, seçenekleri hakkında düşünmüyordu. Düzenlememe izin ver;)
John WH Smith

1
Bir tek zamanlı bir iştir çünkü Ayrıca, muhtemelen kazandırmakla kalmaz update-rc.d myupdate defaultsve update-rc.d myupdate removesenaryo kendisi, hem de yazılı ve kaldırma içine /etc/init.d/myupdateyüzden dosyaların oturup bırakmaz söyledi.
Stephen Ostermiller

Bunu uyguladım ve iyi çalışıyor. Ekleyeceğim diğer tek şey, Debian tabanlı sistemimin şu INIT INFObölümde ek öğeler gerektirmesidir : wiki.debian.org/LSBInitScripts
Stephen Ostermiller

Gerçekten basit tutmak istedim;) Doğru init.d yazmak biraz zaman alır, ancak daha fazla bilgi için gittiğinize sevindim: bu komut dosyaları oldukça kullanışlı olabilir.
John WH Smith
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.