Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2015-03-29 16:31:42

  life - Użytkownik

life
Użytkownik
Zarejestrowany: 2009-10-30

Jak w skrypcie startowym zaczekać do momentu skończenia operacji?

Może temat niezbyt trafny ale już piszę o co mi chodzi :)
Postawiłem Virtualboxa na nim kilka maszyn wirtualnych.
Zrobiłem skrypt który je startuje (przy starcie systemu gospodarza) i chciałbym zrobić że przy zamykaniu gospodarza goście są odłączania ale nie poweroff tylko jak należy czyli albo savestate albo acpibutton

Skrypt startuje na samym końcu natomiast przy zamykaniu systemu odpala się na początku przy czym dałem w nim warunek sprawdzania czy VM już się zamknęły czy jeszcze nie

fragment skryptu:

Kod:

  stop)
    echo "Stopping VirtualMachine"
    /root/bin/vmcontrol.sh VM1 save
    /root/bin/vmcontrol.sh VM2 stop

    while [ "`su -c 'VBoxManage list runningvms' -s /bin/bash my_user_id`" != "" ]
    do
        begin_msg "Waiting for VM shutdown ..."
        sleep 3
    done
    succ_msg
    ;;
  *)

czyli teoretycznie skrypt w pętli powinien zaczekać aż VM-y się poprawnie zamkną i przejść dalej.
W rzeczywistości nie czaka, system odpala kolejne skrypty i cały vbox jest odłączany i z mojego "eleganckie" savestate wszystko idzie w diabły.

Jak mogę wymusić na systemie (Debian 7) by zaczekał aż ten skrypt się wykona i dopiero dalej przechodził do kolejnych skryptów.

Lista dla rc0

Kod:

lrwxrwxrwx  1 root root   13 mar 27 19:13 K01atd -> ../init.d/atd
lrwxrwxrwx  1 root root   15 mar 27 19:13 K01exim4 -> ../init.d/exim4
lrwxrwxrwx  1 root root   17 mar 29 00:46 K01urandom -> ../init.d/urandom
lrwxrwxrwx  1 root root   19 mar 29 13:18 K01vbcontrol -> ../init.d/vbcontrol
lrwxrwxrwx  1 root root   31 mar 27 20:13 K01vboxautostart-service -> ../init.d/vboxautostart-service
lrwxrwxrwx  1 root root   33 mar 27 20:13 K01vboxballoonctrl-service -> ../init.d/vboxballoonctrl-service
lrwxrwxrwx  1 root root   25 mar 27 20:13 K01vboxweb-service -> ../init.d/vboxweb-service
lrwxrwxrwx  1 root root   18 mar 27 19:13 K02sendsigs -> ../init.d/sendsigs
lrwxrwxrwx  1 root root   17 mar 27 20:13 K02vboxdrv -> ../init.d/vboxdrv
lrwxrwxrwx  1 root root   17 mar 27 19:13 K03rsyslog -> ../init.d/rsyslog
lrwxrwxrwx  1 root root   22 mar 27 19:13 K04umountnfs.sh -> ../init.d/umountnfs.sh
lrwxrwxrwx  1 root root   20 mar 27 19:13 K05nfs-common -> ../init.d/nfs-common
lrwxrwxrwx  1 root root   17 mar 27 19:13 K05rpcbind -> ../init.d/rpcbind
lrwxrwxrwx  1 root root   20 mar 27 19:13 K06hwclock.sh -> ../init.d/hwclock.sh
lrwxrwxrwx  1 root root   20 mar 27 19:13 K06networking -> ../init.d/networking
lrwxrwxrwx  1 root root   18 mar 27 19:13 K07umountfs -> ../init.d/umountfs
lrwxrwxrwx  1 root root   20 mar 27 19:13 K08umountroot -> ../init.d/umountroot
lrwxrwxrwx  1 root root   14 mar 27 19:13 K09halt -> ../init.d/halt

mój skrypt vbcontrol jest wykonywany przed innymi od Vbox-a (bo tak chciałem że zanim zamknie się zały Vbox to ja najpierw wyłączę albo zachowam stan maszyn ... a tu d...!

Dopiszę jeszcze że skrypt odpalony z palca

Kod:

/etc/init.d/vbcontrol stop

działa jak najbardziej poprawnie tylko jak jest automatycznie wykonywany to jest lipa.

Ostatnio edytowany przez life (2015-03-29 16:33:52)

Offline

 

#2  2015-03-29 16:38:35

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: Jak w skrypcie startowym zaczekać do momentu skończenia operacji?

To jest Systemd czy SysVinit?

Do SysVinit nie ma chyba co klepać osobnego skryptu (ten już idzie na emeryturę - stabilny Jessie za kilkanaście tygodni), za to w Systemd musisz obczaić zależności skryptu, na 99% tam to załatwisz, ale tu już bym pytał Morfika albo Yossariana.

Ostatnio edytowany przez Jacekalex (2015-03-29 16:41:33)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#3  2015-03-29 23:04:16

  peadyr - Użytkownik

peadyr
Użytkownik
Skąd: Chełmno
Zarejestrowany: 2008-05-26

Re: Jak w skrypcie startowym zaczekać do momentu skończenia operacji?

Cześć.

automatyczne wyłączanie maszyn przy wyłączaniu hosta-debiana:

/etc/default/virtualbox [plik tworzony przy instalacji virtualboxa tak jak skrypt /etc/init.d/virtualbox]

Kod:

#Set this to 1 if you would like the virtualbox modules to be loaded by the init script.
LOAD_VBOXDRV_MODULE=1
# SHUTDOWN_USERS="foo bar"  
#   check for running VMs of user 'foo' and user 'bar'
#   'all' checks for all active users
# SHUTDOWN=poweroff
# SHUTDOWN=acpibutton
# SHUTDOWN=savestate
#   select one of these shutdown methods for running VMs
#   acpibutton and savestate causes the init script to wait
#   30 seconds for the VMs to shutdown
SHUTDOWN_USERS="vboxuser"
SHUTDOWN=savestate

automatyczne startowanie maszyn:

/etc/rc.local:

Kod:

su -  vboxuser -c "VBoxManage startvm NazwaMaszynki --type headless"&&
sleep 2&&
su -  vboxuser -c "VBoxManage startvm NazwaMaszynki2 --type headless"&&
exit 0

Taki zestaw działa na sysvinit na systemd pewnie też.

A jak nie rc.local to w instalkach virtualboxa z repo Oracla jest skrypt vboxautostart-service, którego w repo debiana niema:
[url]https://www.virtualbox.org/manual/ch09.html#autostart-linux[/url]
[url]https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=748691[/url]
[url]http://lifeofageekadmin.com/how-to-set-your-virtualbox-vm-to-automatically-startup/[/url]

Offline

 

#4  2015-03-30 00:44:14

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Jak w skrypcie startowym zaczekać do momentu skończenia operacji?

Na systemd to nie byłoby raczej problemów -- jeden plik service z przełącznikiem "@nazwa_maszyny" na każdą z dostępnych maszyn i uzależnić to od konkretnego urządzenia (dysku, partycji), na którym te obrazy maszyn wirtualnych się znajdują, albo punktu montowania, np. na wypadek skanowania systemu plików, by usługa czekała z odpalaniem maszyn, aż system plików się zamontuje. Pewnie też i zależności z dostępem sieci by się przydały, jeśli te maszyny wymagają jej do działania.

A przy zamykaniu systemu, to trzeba by odpowiednie polecenia dopisać, bo ja nie mam w sumie pojęcia jakie polecenia wyłączają te maszyny tak jak chcesz ale jeśli idzie to zrobić via cmd, to w plikach service nie będzie z tym żadnego problemu, a że kolejność wyłączania usług jest odwrotna w stosunku do ich startu, to wszystko się ładnie powinno wyłączyć, tyle teorii. xD

Offline

 

#5  2015-03-30 18:00:40

  life - Użytkownik

life
Użytkownik
Zarejestrowany: 2009-10-30

Re: Jak w skrypcie startowym zaczekać do momentu skończenia operacji?

Dzięki za odzew.
Jeżeli chodzi o rozwiązanie skryptami virtualboxa to co zaproponował peadyr to też na to trafiłem ale kilka stron miało kilka opisów i jakoś to nie za bardzo mi działało wszystko, generalnie porzuciłem ten sposób i skupiłem się na swoich prymitywnych skryptach.

Trochę posiedziałem i zrobiłem tak jak chciałem.
Oto moje wypociny:

Sam skrypt do sterowania maszynami: /usr/local/sbin/vmcontroll.sh

Kod:

#! /bin/sh
VMUSER=nazwa_usera
VMNAME="$1"
CMD=cmd

case "$2" in
  start)
    echo "Starting VM: $1"
    su -c "nohup VBoxHeadless --vrde=off --startvm $1 >/dev/null 2>&1 &" -s /bin/bash -l "$VMUSER"
    ;;
  save)
    echo "Saving state of VM: $VMNAME"
    su -c "/usr/bin/VBoxManage controlvm $VMNAME savestate" -s /bin/bash -l "$VMUSER"
    while [ "$CMD" != "" ]
    do
        CMD=`su -s /bin/bash $VMUSER -c "/usr/bin/VBoxManage list runningvms | grep $VMNAME"`
        echo "Waiting for VM shutdown ..."
        sleep 3
    done
    ;;
  pause)
    echo "Pause VM: $VMNAME"
    su -c "/usr/bin/VBoxManage controlvm $VMNAME pause" -s /bin/bash -l "$VMUSER"
    ;;
  resume)
    echo "Resume VM: $VMNAME"
    su -c "/usr/bin/VBoxManage controlvm $VMNAME resume" -s /bin/bash -l "$VMUSER"
    ;;
  restart)
    echo "Reset VM: $1"
    su -c "/usr/bin/VBoxManage controlvm $VMNAME reset" -s /bin/bash -l "$VMUSER"
    ;;
  stop)
    echo "Powering off (acpi) VM: $VMNAME"
    su -c "/usr/bin/VBoxManage controlvm $VMNAME acpipowerbutton" -s /bin/bash -l "$VMUSER"
    while [ "$CMD" != "" ]
    do
        CMD=`su -s /bin/bash $VMUSER -c "/usr/bin/VBoxManage list runningvms | grep $VMNAME"`
        echo "Waiting for VM shutdown ..."
        sleep 3
    done
    ;;
  poweroff)
    echo "Powering off VM: $VMNAME"
    su -c "/usr/bin/VBoxManage controlvm $VMNAME poweroff" -s /bin/bash -l "$VMUSER"
    while [ "$CMD" != "" ]
    do
        CMD=`su -s /bin/bash $VMUSER -c "/usr/bin/VBoxManage list runningvms | grep $VMNAME"`
        echo "Waiting for VM shutdown ..."
        sleep 3
    done
    ;;
  *)
    echo "Usage: /usr/local/sbin/vmcontroll.sh {start|stop|save|pause|resume|restart|poweroff}"
    exit 1
    ;;
esac

exit 0

Działanie skryptu bardzo proste jako pierwszy parametr podajemy nazwę VM a drug to akcja jaką chcemy zrobić (start, stop, save, pause, resume, restart, poweroff)
Ja potrzebuję tego dla jednego usera więc wystarczy mi wpisanie go na "sztywno" w zmienną, ktoś chce dla kilku to nie problem przerobić.

no i teraz plik startowy: /etc/init.d/vmcontroll

Kod:

#! /bin/sh
# /etc/init.d/vmcontroll

### BEGIN INIT INFO
# Provides:          vmcontroll
# Required-Start:    vboxdrv
# Required-Stop:     exim4
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Kontrola uruchamiania VM przez system.
# Description:       Enable service provided by daemon.
### END INIT INFO

case "$1" in
  start)
    echo "Starting VirtualMachines "
    /usr/local/sbin/vmcontroll.sh testXP start
    /usr/local/sbin/vmcontroll.sh deb1 start
    ;;
  stop)
    echo "Stopping VirtualMachine"
    /usr/local/sbin/vmcontroll.sh testXP save
   /usr/local/sbin/vmcontroll.sh deb1 stop
    ;;
  *)
    echo "Usage: /etc/init.d/vmcontroll {start|stop}"
    exit 1
    ;;
esac

exit 0

Jak widać przy włączeniu kompa startują dwie maszyny (Debian i WinXP) przy wyłączeniu debian jest zamykany (acpioff) czyli symulacja wciśnięcia przycisku zasilania a dla WinXP jest akcja save czyli coś jak "hibernacja" zapisuje jego stan i startuje w takiej samej formie jak był zamknięty. Kombinować można już do woli :)

może się komuś przyda więc niech korzysta :)

Ostatnio edytowany przez life (2015-03-30 18:05:38)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)

[ Generated in 0.008 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00008 SET CHARSET latin2
0.00003 SET NAMES latin2
0.00081 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.191.178.16' WHERE u.id=1
0.00056 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.191.178.16', 1732756293)
0.00042 SELECT * FROM punbb_online WHERE logged<1732755993
0.00067 SELECT topic_id FROM punbb_posts WHERE id=285240
0.00108 SELECT id FROM punbb_posts WHERE topic_id=27229 ORDER BY posted
0.00059 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=27229 AND t.moved_to IS NULL
0.00006 SELECT search_for, replace_with FROM punbb_censoring
0.00078 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=27229 ORDER BY p.id LIMIT 0,25
0.00071 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=27229
Total query time: 0.00579 s