Virtuelle Maschine über Cron herunterfahren

feron

Benutzer
Mitglied seit
15. Okt 2022
Beiträge
150
Punkte für Reaktionen
8
Punkte
18
Die Variante von luddi klappt so. Die Variante direkt in der VM kenne ich nicht. Wo würde ich den /etc/crontab direkt in der VM finden? Da könnte ich auch sagen, dass dies nur einmal monatlich passieren soll?
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.237
Punkte für Reaktionen
581
Punkte
174
Öhm, monatlich müsste auch gehen ;)
Ja das geht definitiv bei einer Aufgabe, die man direkt über den Aufgabenplaner anlegt.
ABER: Wenn man eine PowerOff/On Task über den Energie-Zeitplan erstellt dann ist eine monatliche Ausführung nicht möglich.

1671208328507.png

Diese Aufgabendefinition landet zwar auch im Aufgabenplaner, kann dann aber dort auch nicht auf monatlich umgestellt werden.

1671208368711.png

Selbstverständlich kann man einen PowerOff Task auch über den Aufgabenplaner erstellen, indem man ein benutzerdefiniertes Skript mit dem Befehl shutdown -h now oder einfach shutdown now je nachdem was man bevorzugt.

Dann stellt sich nur die Frage wie und wann definiert man das automatische Einschalten mit dem PowerOn Task aus dem Energie-Zeitplan, wenn man diesen nicht monatlich steuern kann.

Also, wenn ich @feron richtig verstehe, dann geht es eigentlich primär um einen Restart des Systems. Und dann sind wir natürlich bei der einfachsten aller Lösungen wie von @Benares erwähnt ein Task über den Aufgabenplaner erstellen um diesen monatlich ausführen zu können.

Aber dann müsste der Befehl eben einen Restart und kein Herunterfahren auslösen.
Somit würde man shutdown -r now angeben.
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.237
Punkte für Reaktionen
581
Punkte
174
Wo würde ich den /etc/crontab direkt in der VM finden?
Wenn es sich bei dem System um ein Linux handelt dann am einfachsten über dessen Konsole mit dem Befehl crontab -e.
 

feron

Benutzer
Mitglied seit
15. Okt 2022
Beiträge
150
Punkte für Reaktionen
8
Punkte
18
Direkt im Aufgabenplaner kann ich jetzt ohne weiteres sagen, dass dies nur 1x Monatlich passieren soll. Aber im normalen Energie-Zeitplan mit dem ich danach die Synology starten möchte, geht es trotzdem nicht.
 

Anhänge

  • Screenshot 2022-12-16 174349.jpg
    Screenshot 2022-12-16 174349.jpg
    64,5 KB · Aufrufe: 6

feron

Benutzer
Mitglied seit
15. Okt 2022
Beiträge
150
Punkte für Reaktionen
8
Punkte
18
@luddi: Wenn ich dich richtig verstehe, müsste ich jetzt ein weiteres Benutzerdefiniertes Skript erstellen mit dem Skript shutdown -r now, 30 Minuten nachdem ich meine VM heruntergefahren habe? Dies würde meine Synology Neu starten über den Aufgabenplaner und da könnte ich monatlich einstellen? Das einschalten danach ist kein Problem mit Autostart in der VM.
 

Stationary

Benutzer
Sehr erfahren
Mitglied seit
13. Feb 2017
Beiträge
3.589
Punkte für Reaktionen
1.027
Punkte
194
Wo würde ich den /etc/crontab direkt in der VM finden?

Eben genau dort... :) Im Unterverzeichnis /etc liegt eine Datei namens crontab.

Wenn Du mittels Terminal Zugang zum System hast, dann log Dich mal ein und tippe:
Sass:
sudo nano /ect/crontab

Wenn "nano" (ist ein Linux-Editor für den Einsatz im Terminal) nicht funktionieren sollte, versuche statt "nano" mal "pico".

shutdown -h now fährt die VM komplett herunter und läßt sie ausgeschaltet,
shutdown -r now fährt die VM herunter und startet sie direkt neu.
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.237
Punkte für Reaktionen
581
Punkte
174
@luddi: Wenn ich dich richtig verstehe, müsste ich jetzt ein weiteres Benutzerdefiniertes Skript erstellen mit dem Skript shutdown -r now, 30 Minuten nachdem ich meine VM heruntergefahren habe?

Für das herunterfahren bzw. das Neustarten der DiskStation selbst benötigst du genau einen einzigen Task, welcher über den Aufgabenplaner angelegt wird den du 1x pro Monat ausführen lässt.

Du kannst dir überlegen entweder 2 unabhängige Tasks über den Aufgabenplaner anzulegen.
Der eine dient dazu die VM wie bereits besprochen über den bekannten Befehl mit der synowebapi herunterzufahren, und der andere zweite Task welcher ca. eine halbe Stunde später ausgeführt wird, um die DiskStation neu zu starten.

Task #1 wäre dann:
Code:
synowebapi -s --exec api=SYNO.Virtualization.API.Guest.Action version=1 method=shutdown runner=root guest_name="NAME_DER_VM"

Task #2 würde dann wie folgt lauten:
Code:
shutdown -r now

Um den Task #2 noch etwas zu erweitern und den Status der VM abzufragen, ob sie tatsächlich schon ausgeschaltet ist, würde ich folgenden Vorschlag unterbreiten:
Code:
VM_NAME='NAME_DER_VM'
vmstatus=`synowebapi -s --exec api=SYNO.Virtualization.API.Guest method=list runner=root | jq '.data.guests[] | {guest_id, guest_name, status} | select((.guest_name=='$VM_NAME') and (.status=="shutdown"))' 2>&1 | grep -o "shutdown"`
if [ "$vmstatus" == "shutdown" ]; then
  # VM is powered off
  shutdown -r now
fi


Oder du kombinierst beide Tasks zu einem, indem man die VM herunterfährt, eine Wartezeit einbaut und anschließend die DiskStation herunterfährt.

Code:
# VM herunterfahren
synowebapi -s --exec api=SYNO.Virtualization.API.Guest.Action version=1 method=shutdown runner=root guest_name="NAME_DER_VM"

# Warte 30 min (1800 sec)
sleep 1800

# Restart DiskStation nach erfolgreicher Prüfung auf ausgeschaltete VM
VM_NAME='NAME_DER_VM'
vmstatus=`synowebapi -s --exec api=SYNO.Virtualization.API.Guest method=list runner=root | jq '.data.guests[] | {guest_id, guest_name, status} | select((.guest_name=='$VM_NAME') and (.status=="shutdown"))' 2>&1 | grep -o "shutdown"`
if [ "$vmstatus" == "shutdown" ]; then
  # VM is powered off
  shutdown -r now
fi
 
Zuletzt bearbeitet:

feron

Benutzer
Mitglied seit
15. Okt 2022
Beiträge
150
Punkte für Reaktionen
8
Punkte
18
@luddi: Vielen herzlichen Dank für die Skripts. Ich denke, dann macht es am meisten Sinn, gleich den kombinierten Task zu verwenden. So würde die Diskstation nur Neu gestartet werden, wenn die VM tatsächlich ausgeschaltet ist?
 

Stationary

Benutzer
Sehr erfahren
Mitglied seit
13. Feb 2017
Beiträge
3.589
Punkte für Reaktionen
1.027
Punkte
194
die Diskstation nur Neu gestartet werden, wenn die VM tatsächlich ausgeschaltet ist?
Du kannst die DS normalerweise nicht über ein Skript herunterfahren oder neu starten, wenn eine VM läuft. Daher muß zwangsläufig zuerst die VM heruntergefahren sein. Sonst kommt lediglich eine Fehlermeldung, die Dich darauf hinweist, daß die VM noch läuft und die DS deswegen nicht heruntergefahren werden kann.
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.237
Punkte für Reaktionen
581
Punkte
174
Ob du beide Tasks zu einer kombinierst, bleibt dir überlassen. Die Prüfung, ob die VM heruntergefahren ist, kannst du ja auch in dem separaten Task #2 unterbringen.

Du kannst das ganze doch einmal gerne ausprobieren und mitteilen, ob es noch Probleme gibt.

Denk daran die Stellen mit NAME_DER_VM mit dem Namen deiner VM zu ersetzen.
Und bei dem Befehl synowebapi -s habe ich noch den Befehl -s für silent angehängt damit die webapi nicht auch noch auf den stdout schreibt.

Wenn man es noch ganz genau machen möchte, müsste man vielleicht noch eine Schleife einbauen und den Status der VM so lange abzufragen bis er tatsächlich auf "shutdown" steht, falls die definierte Wartezeit nicht ausreichen sollte.
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.237
Punkte für Reaktionen
581
Punkte
174
Du kannst die DS normalerweise nicht über ein Skript herunterfahren oder neu starten, wenn eine VM läuft.
Das halte ich für ein Gerücht. Denn, wenn der Befehl shutdown über die Konsole oder aus einem crontab ausgeführt wird ist es dem System völlig egal, was da noch am Laufen ist. Es mag sein, dass wenn man das System über das WebUI ausschalten möchte dies verhindert wird.
Das kenne ich selbst auch während ein Backup Tasks läuft.

Was zu beweisen war....
Wie man sieht, lief die VM auf meinem System als ich den shutdown request ausgeführt habe. Und siehe da, die SSH Session wurde beendet und das System führte auch den gewünschten Restart aus.
Code:
Fri Dec 16 root@DiskStation: ~  $ synowebapi -s --exec api=SYNO.Virtualization.API.Guest method=list runner=root | jq '.data.guests[] | {guest_id, guest_name, status}'
{
  "guest_id": "4645a70b-0547-4f9e-8817-42633ef19c7e",
  "guest_name": "DSM7",
  "status": "running"
}
Fri Dec 16 root@DiskStation: ~  $ shutdown -r now
Fri Dec 16 root@DiskStation: ~  $ Connection to 192.168.135.251 closed by remote host.
Connection to 192.168.135.251 closed.
Fri Dec 16 userT1@host1: ~ $
 
Zuletzt bearbeitet:

feron

Benutzer
Mitglied seit
15. Okt 2022
Beiträge
150
Punkte für Reaktionen
8
Punkte
18
@luddi: Ich habe jetzt einmal 2 Tasks draus gemacht. Task 1 hat einwandfrei funktioniert. Task 2 habe ich mit der Prüfung probiert. Das System hat leider nicht neu gestartet, obwohl die VM sauber ausgeschaltet wurde nach Task 1.

So sieht Task 2 aus:

Code:
VM_NAME='Home Assistant'
vmstatus=`synowebapi -s --exec api=SYNO.Virtualization.API.Guest method=list runner=root | jq '.data.guests[] | {guest_id, guest_name, status} | select((.guest_name=='$VM_NAME') and (.status=="shutdown"))' 2>&1 | grep -o "shutdown"`
if [ "$vmstatus" == "shutdown" ]; then
  # VM is powered off
  shutdown -r now
fi
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.237
Punkte für Reaktionen
581
Punkte
174
Kannst du einmal die single quotes bei dem Zugriff auf die Variable $VM_NAME entfernen?

Anstatt wie angegeben:
select((.guest_name=='$VM_NAME')

ändern in:
select((.guest_name==$VM_NAME)
 

feron

Benutzer
Mitglied seit
15. Okt 2022
Beiträge
150
Punkte für Reaktionen
8
Punkte
18
Ohne die Single quotes hat es funktioniert. Die Diskstation hat als Task 2 neu gestartet.
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.237
Punkte für Reaktionen
581
Punkte
174
Ohne die Single quotes hat es funktioniert.
Prima!

Du könntest auch die Zuweisung der Variable (Zeile 1) weglassen.
Lösche: VM_NAME='Home Assistant'

Und dann den Namen deiner VM direkt hier eintragen:
select((.guest_name=="Home Assistant")
 

feron

Benutzer
Mitglied seit
15. Okt 2022
Beiträge
150
Punkte für Reaktionen
8
Punkte
18
Ok, danke. Aber ich kann das auch so belassen mit VM_Name zuerst. Das hat ja keinen Inpact? Irgendwie, ist das etwas übersichtlicher, wenn direkt in der ersten Zeile der VM Name steht.
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.237
Punkte für Reaktionen
581
Punkte
174
Du kannst es so lassen wie es ist, wenn es funktioniert.
Entweder man arbeitet mit einer Variablen, die man zuweist oder man verwendet den Namen direkt wo man ihn benötigt.

Wenn eine Variable wie in diesem Fall nur einmal verwendet wird, dann kann man sich überlegen den Namen direkt zu verwenden, wo man ihn benötigt.
Falls man viele Stellen im Code verwendet, an denen man den gleichen Inhalt benötigt, so ist es wesentlich einfacher eine Variable zu definieren. Dies hat den Vorteil, dass man den Namen an nur einer einzigen Stelle im Code ändern muss, falls sich der Name ändert.

EDIT:
Mache es doch lieber vorerst einmal so select((.guest_name=="Home Assistant") denn ich habe bei meinen Tests gerade selbst ein merkwürdiges Verhalten bemerkt, wenn ich eine Variable verwende.
 

feron

Benutzer
Mitglied seit
15. Okt 2022
Beiträge
150
Punkte für Reaktionen
8
Punkte
18
Vielen Dank. Ich denke, so habe ich eine saubere Sache. Die VM wird ausgeschaltet mit Task 1. Eine halbe Stunde später läuft Task 2 und startet mein Synology Neu (Nur wenn die VM auch tatsächlich ausgeschaltet ist).
 

feron

Benutzer
Mitglied seit
15. Okt 2022
Beiträge
150
Punkte für Reaktionen
8
Punkte
18
Ich habe es nun einmal geändert auf:

Code:
vmstatus=`synowebapi -s --exec api=SYNO.Virtualization.API.Guest method=list runner=root | jq '.data.guests[] | {guest_id, guest_name, status} | select((.guest_name=="Home Assistant") and (.status=="shutdown"))' 2>&1 | grep -o "shutdown"`
if [ "$vmstatus" == "shutdown" ]; then
  # VM is powered off
  shutdown -r now
fi
 


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat