İşlem 10 saniyeden uzun sürdüğünde upstart'ı kapatma sırasında bir komut dosyası çalıştıracak şekilde nasıl yapılandırabilirim?


11

Linux'ta geliştirme hakkında daha fazla bilgi edinmek için sanal bir makinede (VirtualBox) ubuntu 11.10 kullanıyorum. Çalışmamı kaydetmek için git deposunu kullanıyorum ve çalışmamı paketlemek ve sanal makine çalışmazken kullanmak üzere paylaşılan klasöre kaydetmek için bir komut dosyası yazdım.

Vm kapalıysa (şu anda el ile komut dosyasını çalıştırmak zorundayım) işimi her zaman kullanılabilir olması için kapatmadan önce bu komut dosyasını otomatik olarak çalıştırmak istiyorum.

Uptart'ın bunu başarmanın en iyi yolu olup olmadığını bilmiyorum, ama bu bir test olarak yazdığım yapılandırma:

description     "test script to run at shutdown"

start on runlevel [056]

task

script
touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
end script

pre-start script
touch /media/sf_LinuxEducation/pre-start
sleep 15
touch /media/sf_LinuxEducation/pre-start-long
end script

post-start script
touch /media/sf_LinuxEducation/post-start
sleep 15
touch /media/sf_LinuxEducation/post-start-long
end script

pre-stop script
touch /media/sf_LinuxEducation/pre-stop
sleep 15
touch /media/sf_LinuxEducation/pre-stop-long
end script

post-stop script
touch /media/sf_LinuxEducation/post-stop
sleep 15
touch /media/sf_LinuxEducation/post-stop-long
end script

Sonuç olarak, sadece bir dokunuş elde edilir (başlangıçta ilk dokunuş). Uykudan sonra dokunuşlardan birini görmek için neyi değiştirmem gerekir? Yoksa bunu başarmanın daha kolay bir yolu var mı?

Şimdiden teşekkürler.

Yanıtlar:


7

Sonradan görme giriş, Cookbook ve En İyi Uygulamalar sonradan görme görevleri ve iş yaratma kullanılmak üzere kod parçacıkları büyük bir numarası vardır.

Kapatma işlemi yemek kitabının bölüm söylüyor /etc/init/rc.confçalıştırın ve çağrı olacaktır /etc/init.d/rc. Buna karşılık bu sonunda arayacaktır /etc/init.d/sendsigs. Eğer start on starting rcöyleyse, göreviniz rc'den önce (ve normalde işlemi kapatacak olan sigterms) önce yürütülecektir.

dosya: /etc/init/test.conf

description "test script to run at shutdown"

start on starting rc
task
exec /etc/init/test.sh

dosya: /etc/init/test.sh

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long

1
Bu soruya somut bir örnek eklendi, ancak Etkinlik Takma Adı Oluşturma belgesinin olması gerektiğini söylüyor olsa bile çalışmıyor (yalnızca ilk dokunuş kapatma sırasında çalıştırılıyor) . Lütfen bir hata yapıp yapmadığımı görün.
Tiris

Tiris, bu işe yaramalı. Yeniden başlatmadan sonra / var / log / syslog'unuzu görmekle ilgileniyorum, özellikle de testin sürecinin uptart tarafından zorla öldürülüp öldürülmediğini görmek için.
SpamapS

1
Bu cevabın son düzenlemesi işe yarıyor. Sorunlu çocuğu görmek için düzeltme geçmişini kontrol edin. Sanırım bir düzenleme yaptığımı yorumlamış olmalıydım (ya da yorumu kaldırmak ve yeni bir tane eklemek daha uygun mu? Stackexchange görgü kuralları var mı?). Sorunlu çocuğun neden çalışmadığını bilmek isterim (dokümantasyonda olması gerektiği için).
Tiris

Test.conf dosyası tam olarak ne demektir? Test.conf adlı bir dosya yapabilir miyim veya bunu rc.conf'a ekleyebilir miyim?
heneryville

@heneryville test.confsadece rastgele bir dosya adıdır . Kolayca kullanabilirsiniz whatEverYouWant.conf. Yorumunuz ayrıca yanıtta belirtilen "Yemek Kitabı" nı okumadığınızı da gösteriyor. Bölüm 4.2'ye bakarsanız, İş Yapılandırma Dosyası daha ayrıntılı olarak açıklanmıştır.
Tiris

7

Bunun üzerinden yapılamaz düşünüyorum sonradan görme olarak, /etc/init.d/sendsigs tarafından çağrılır komut, sonradan görme durdurulması / yeniden başlatma, tüm işlemleri (öldürdüğünde killall5 -9Bunda da sonuç olmasa bile 10 saniye içinde) ve bu gider her şeyi sökmek ve kapatmak için.

En iyi yol paslı /etc/init.d tarzı komut dosyalarını kullanmaktır.

Örnek: /etc/init.d/shutdown_job

#! /bin/sh
### BEGIN INIT INFO
# Provides:          shutdown_job
# Required-Start:    
# Required-Stop:     sendsigs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: bla
# Description: 
### END INIT INFO

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

. /lib/lsb/init-functions

do_stop () {
    date > /root/s.log
    sleep 20
    date >> /root/s.log
}

case "$1" in
  start)
    # No-op
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  stop)
    do_stop
    ;;
  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
    ;;
esac

:

Sonra komut dosyasını etkinleştirin

sudo update-rc.d shutdown_job start 19 0 6 .

Bu, komut dosyasını 0 a 6 çalışma seviyelerindeki sendsigs komut dosyasının önüne koyar (kapatma, yeniden başlatma). Bu örnek komut dosyası tarihi kaydeder, sonra 20 saniye uyur, ardından tarihi /root/s.log dosyasına tekrar kaydeder .)

Daha fazla bilgi:


Bu tür şeyleri yapmaya hiç aşina değilim. Bunun işe yaraması için iyi bir rehber var mı? Lütfen daha fazla bilgi ile düzenleyin.
Tiris

Bunu denedim ve işe yaramıyor (tam olarak değil). Tarih komutlarının yanına bir touch /media/sf_LinuxEducation/startve ekledim touch /media/sf_LinuxEducation/start-long. Tarihler günlüğe kaydedilir, ancak dokunuşlara dokunulmaz. Bu, betiğin çalıştırıldığı sırada bu sürücünün çıkarılıp çıkarılmadığını merak etmemi sağlıyor. NN argümanı ile ilgili bir şey olabileceğini düşünüyorum, ancak bu argümanın nasıl çalıştığından gerçekten emin değilim (man sayfası bunu çok akılcı bir şekilde açıklıyor). Bu argümanda hangi sayı (veya sayı çifti) ayarlanması gerektiğini nereden biliyorsunuz?
Tiris

Komut dosyaları, /etc/rc6.ddizini listelediğinizde sayılarına göre yürütülür . Bu nedenle, 19 kapatma betiği herhangi bir bağlantı kesilmeden önce yürütülmelidir (> 31). Ama neden hipotezinizi denemiyor ve /rootbunun yerine bir dosyaya dokunmuyorsunuz?
düzenleyin

Dize /etc/rc6.dbakıldığında, paylaşılan klasörlerin K70vboxaddkomut dosyasıyla bağlandığını / kaldırıldığını gösterir . NN bağımsız değişkenini (komut dosyam için) 71 olarak değiştirmek, komut dosyamı VB paylaşılan klasörlerinin bağlantısını kesmeden önce çalıştırır mı? Bugün daha sonra deneyeceğim.
Tiris

Bu işe yaramadı. Güncelleme: Komuttan touch /root/startönce bir ekledim sleep 20ve hiçbir dosya oluşturulmadı. Nedenini bulmaya nereden başlayacağımı bile bilmiyorum. Tarihler mutlu bir şekilde /root/s.logdosyaya eklendi Neden bir dosyaya dokunamıyorum?
Tiris
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.