Kapatma / yeniden başlatma işleminden önce komutu yürütme [duplicate]


19

Birkaç cesur VM çalıştıran bir makinem var. Sahip olduğum sorun bazen makinemi kapatmadan veya yeniden başlatmadan önce bu VM'yi kapatmayı unutmam. Bu yüzden makinem şu mesaja takılı kalıyor:waiting for vboxnet0 to become free

Çözümleri araştırdım ve bu sayfayı buldum:

http://en.kioskea.net/faq/3348-ubuntu-executing-a-script-at-startup-and-shutdown

Kapatmak için ne denedim, ama çalışmıyor.

Bu komut için bir sh dosyası yazdım:

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

herhangi bir öneri?


4
Bağlantıdaki yöntem geçerlidir ve tüm linux sürümünde çalışır, betiğiniz yanlıştır;) Kullanıcı, kullanıcı kökü tarafından yapıldığından kapatmada bilinmiyor. Bu yüzden "~" işaretini bırakın ve tam yol yapın.
Rinzwind

Çalışıyor mu? Gist.github.com/ymc-geha/8416723 gibi benzer bir kılavuzu takip ettim ama ubuntu
14.04

@ user2135804 Yaptığını düşündüm .. ama aslında Vagrant için işe yaramadı .. Diğer şeylerle denedim ve iyi çalıştı.
SERPRO

1
Bu arada, açıkladığınız hata burada .
Garrett

1
Hata raporunda görüldüğü gibi, bu düzeltildi ve VirtualBox 4.3.29'a dahil edilecek.
Garrett

Yanıtlar:


12

Vagrant VM'leriniz VirtualBox kullanıyorsa, / etc / default / virtualbox'ı değiştirebilir ve şu satırı okuyabilirsiniz:

SHUTDOWN_USERS=""

için

SHUTDOWN_USERS="all"

Bu benim için Ubuntu 14.04'te düzeltildi


1
Aslında buna bağlı sanal kutuda açık bir bilet var. virtualbox.org/ticket/12264 . I would kullanarak sugges SHUTDOWN_USERS=`cut -d: -f1 /etc/passwd`yerineSHUTDOWN_USERS="all"
running.t

Ayrıca VirtualBox kullanarak Vagrant ile Ubuntu 14.04'deyim, ama herhangi bir dosyam yok /etc/default/virtualbox...
Garrett

21

Kapatma veya yeniden başlatma sırasında bir komut dosyasını yürütmek için:

  1. betiğinizi /etc/rc6.d dizinine kaydedin
  2. Yürütülebilir yap: sudo chmod +x K99_script

Notlar:

  • Rc6.d içindeki komut dosyası .sh uzantılı olmamalıdır
  • Komut dosyanızın adı doğru zamanda çalışması için K99 ile başlamalıdır.
  • Bu dizindeki komut dosyaları alfabetik sırada yürütülür.

kaynak


1
Aslında. Doğru zamanda çalışacak şekilde doğru adlandırmak çok önemlidir.
shivamlar

2
/Etc/rc6.d dosyasına bir komut dosyası koydum ve kapatma sırasında çalışmadı. /Etc/rc0.d dizinine koydum ve kapatıldığında da çalıştı. Muhtemelen, rc.6 sadece yeniden başlatma içindir.
Erel Segal-Halevi

2
@Erel Segal-Halevi /etc/rc6.d dosyasına bir K99 betiği eklemeye çalıştım ve çalıştırılmadı. Diğer senaryolara baktığımızda, bir satır ** kalın K10reboot -> ../init.d/reboot ** kodu var, bu yüzden bir K99 betiği ASLA yürütülmeyecek gibi görünüyor!
David Walker

Aşağıdaki Ravi'nin cevabı daha iyi bir seçimdir çünkü komut dosyasının hem kapatma hem de yeniden başlatma işleminde çalışmasını sağlamak için sembolik bağlantıları kullanır. Ayrıca çoğu sistem dosyasının bu yaklaşımı benimsediğini düşünüyorum.
Eddie

rc.6, diğerlerinin de belirttiği gibi sadece yeniden başlatma için görünüyor. Bkz.
Aelian

12

Systemd ile Nasıl Yapılır (daha kolaydır)

Şimdi Ubuntu varyantları ve Mint sisteme taşındıklarına göre, eski çözümlerimi yukarıdakilere dayanarak daha az tatmin edici buldum. Sistemd ile nasıl yapılacağını öğrenmek için web'de arama yaptım ve başkalarının bilgeliğini birleştirip blogspot.com.au'da aşağıdaki öğreticiyi içeren bir blog yazısı olarak belgeledim .

Systemd ile, aşağıdaki şablonları kullanarak komut dosyalarınızı çağırmak için bir veya iki dosya oluşturursunuz ve birkaç komut çalıştırırsınız. Basit.


GUI Sürümü

İlk olarak başlangıç ​​ve / veya kapanışta çalıştırmak istediğiniz komut dosyalarını oluşturun. Her ikisine de ihtiyacınız yoksa bir tane yapın. .Scopening_atstart ve .scfullcopy_atend oluşturdum.

Ardından , dosyayı sağ tıklayıp özellikleri seçerek ve izinler altında Dosyayı program olarak yürütülmesine izin ver seçeneğini işaretlediğinizden emin olarak her ikisinin de yürütülebilir olduğundan emin olun.

resim açıklamasını buraya girin

Oluşturduğum iki dosya bir ramdisk içeriğini doldurur ve kaydeder. Ayrıca hizmetin çalıştığını kanıtlamak için ana dizinimde bir dosya oluştururlar. Onlar şu şekildeydi:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

Sonra dosya yöneticimi root olarak açtım, /etc/systemd/systembir dosya startup.service ve save-ramdisk.service dosyası oluşturdum. Açıkçası kendi adlarınızı seçebilirsiniz ve genel adlar johns_start.service adlı bir başlangıç ​​dosyası ve johns_shutdown.service adlı bir kapatma dosyası içerebilir. Mevcut servis adlarını seçmeyin.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

ve

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

Yürütülebilir komut dosyanızın tam yolunu benimkiyle değiştirerek aynı hizmet dosyalarını kullanabilirsiniz.

Son olarak , her biri için systemctl komutunu çalıştırınız. Dosya_adı (ancak sonek hizmeti olmadan). Yani benim ilkimsystemctl enable startup

Hizmetleri başlatmak için bilgisayarı bir kez yeniden başlatın. Sistem çok kullanıcılı hedefe her girdiğinde başlatma hizmeti ve çok kullanıcılı hedeften çıktığında durdurma hizmeti yürütülür. Farklı etkinleştirme koşullarına sahip alternatif servis dosyaları aşağıda açıklanacaktır.

Ek faydalı komutlar şunları içerir:

systemctl etkin başlangıç
sistemctl etkin başlangıç
systemctl yeniden başlatma

Yukarıdaki referansta daha fazla bilgi bulunabilir.



CLI (Komut Satırı) Sürümü

Bu açıklama, / home / john yerine ana dizininizden çalıştığınızı, gerektiğinde sudo kullandığınızı ve vim veya svim yazdığım editör seçiminizi yaptığınızı varsayar.

İlk satırla başlatma ve kapatma kabuğu komut dosyaları oluşturun ve #!/bin/shbunları kullanarak çalıştırılabilir yapın chmod +x my_new_filename.

Create yukarıdaki gibi iki dosya veya bu örnekte, bir dosya tanıtıcısı başlatma ve kapatma görevlere. Ana dizindeki komut dosyalarını yürüteceğim ama @don_crissti Stack Exchange'de bazı alternatifler gösteriyor .

svim /etc/systemd/system/start_and_stop.service

ve dosya içeriğini kopyalayın:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

Ardından Hizmeti şu komutla etkinleştirin :

systemctl enable start_and_stop

sisteminizi yeniden başlatın ve ardından hizmetler etkinleşir. Komutlar systemctl is-enabled start_and_stopve systemctl is-active start_and_stopyeni hizmetlerinizi izlemede kullanılabilir.



Kapatma Tetikleme Koşullarını Değiştirme

Her şeyden önce dosyalar, komut dosyalarını çalıştırmayı başlatmak için çok kullanıcılı ortamın açılmasını veya kapatılmasını kullanır. Aşağıdaki dosya, komut dosyalarını başlatmak için dört olası kapatma işleminin başlangıcını kullanır. Önceki satırında + WantedBy satırında hedefler eklemek veya kaldırmak, daha ince ayrımlar yapmanıza olanak tanır:

Bu dosya, bu yayının ikinci cevabında önerildi, ancak bir Yükleme bölümü ekleyene kadar çalıştıramadım.

Yine, betiği düzenleyin /etc/systemd/service/ve kullanarak etkinleştirin systemctl enable your_file_name. Hedefleri değiştirdiğimde systemclt disable file_namekomutu kullandım ve yeniden etkinleştirerek hedef dizinlere bağlandı. Yeniden başlatın ve servis çalışacaktır.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target

7
Daha kolay? ne daha kolay? Everest'e tırmanmaktan daha mı kolay? burada yayınlanan diğer tüm çözümler bundan daha kolay ...
Fran Marzoa

1
Vay canına, bu tam ve iyi yazılmış bir cevap ve herkesin ne yapması gerektiği - /etc/rc6.d ile ilgili adlandırma sorunları ve karışıklık, bunların iyi cevaplar olmadığını gösteriyor. Bir prosedür basitse, sonuna kadar güvenli bir şekilde ulaşmak için gücü olması gerekmez. [Yükle] bölümüne bakın - komut dosyanızın doğru zamanda yürütüleceğinden emin olabilirsiniz. Dahası, bir cevap uzun olduğu için, bu onun karmaşık olduğu anlamına gelmez! Teşekkürler btw, John9631, bu cevap mükemmel ve zaman kritik bir görev noktasında güvenli ve verimli komut dosyaları oluşturmak için çok değerli olacak ...
Miller goril

11
  1. Komut dosyanızla /etc/init.d/ dizininde bir kabuk yürütülebilir dosyası oluşturun.

  2. Bu, kapatma veya yeniden başlatma sırasında gerçekleştirilmesi gerektiğinden, /etc/rc0.d/ ve /etc/rc6.d içinde softlinkler oluşturmanız gerekir

Misal:

sudo ln -s /etc/init.d/<your_file> /etc/rc0.d/k99stop_vm
sudo ln -s /etc/init.d/<your_file> /etc/rc6.d/k99stop_vm
sudo chmod a+x /etc/init.d/<your_file>

chmodher iki argüman için de aynı olan bağlantı hedefinin izin bayraklarını değiştirir. Her ikisini de belirtmek gereksizdir.
David Foerster

2

Burada bir çözüm bulabilirsiniz: Sistem kapatma / başlatma sırasında tüm Vagrant kutularını askıya alın / devam ettirin .

Kapatmadan önce tüm çalışan kutuları askıya alan basit bir init betiği vardır.

Kurulum

Düzenleme /etc/init.d/vagrant-boxesYukarıdaki makaleden senaryoyu yapıştırın ve kaydedin. Veya buradan indirin ve kaydedin /etc/init.d/vagrant-boxes. Debian / ubuntu vb.

# update-rc.d vagrant-boxes defaults 99 01

Sayı 99, sıra numarasıdır ve daha büyük olmalıdır (benim durumumda, bu arada Debian dağıtımlarında varsayılan olan 20 numaralı Virtualbox numarası). İkinci sayı, bilgisayarı kapatırken oluşan sıradır. Bu nedenle, her şeyden önce yapmak iyi olabilir.


2

Ubuntu 14.10 için beğenmediğiniz bir RC04şeyRC99

Sıfırdan ne yapmalı

  1. Adresinde bir komut dosyası oluşturun /etc/init.d/scriptName
  2. Üzerinden bağlantı ln -s /etc/rc6.d/K04scriptName /etc/init.d/scriptName

Geçtiğim adımlar

  1. Başlangıç ​​ve kapanışta bir komut dosyası yürütmek - Ubuntu kullanmak için başarısız çalıştı
  2. Bulduğum rc0.d ile Ubuntu 14.10 kapanış komut (rc6.d, rc.d)
  3. /Etc/rc6.d/RC99linkName yerine /etc/rc6.d/RC04linkName olarak değiştirdim ve çalışıyor
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.