staging.inyokaproject.org

"VM does not exist"

Status: Gelöst | Ubuntu-Version: Ubuntu 24.04 (Noble Numbat)
Antworten |

Emma2

Anmeldungsdatum:
28. Dezember 2018

Beiträge: Zähle...

Ich habe ein Script zum Sichern meiner KVM/QEMU-VMs, allerdings funktioniert es nicht so, wie es soll:

  • Wenn ich mich anmelde und es aufrufe, dann funktioniert es ganz prima

  • Wenn es allerdings als Cronjob gestartet wird, erhalte ich die Fehlermeldung "VM does not exist"

In meinem Script stehen die Zeilen

1
2
3
4
5
6
#check if VM exists at all
if ! `virsh list --all | grep -iq $1`
then
  echo "$1": "$dateToday VM does not exist"
  exit 1
fi

und wenn ich angemeldet in der Bash

1
backup-kvm.sh    meineVM

aufrufe, dann klappt auch alles, nicht aber als Cronjob.

Stimmt irgendetwas mit dem "-iq" im grep-Aufruf nicht? Ich dachte, dass 'q' ist gerade dafür, dass keine Ausgabe erfolgt, sondern nur das Ergebnis/Status zurückgeliefert wird.

Der Aufruf

1
virsh list --all

zeigt mir die VMs an, sowohl nach der normalen Anmeldung als auch nach einem sudo -i, am angemeldeten User scheint es also nicht zu liegen.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@Emma2 Leite mal die Ausgabe von virsh list --all (stdout und stderr) in eine Datei um vor dem if und schau was da drin landet wenn man das als cronjob ausführt. Gar nichts? Eine Fehlermeldung?

Emma2

(Themenstarter)

Anmeldungsdatum:
28. Dezember 2018

Beiträge: Zähle...

Danke. Ich füge in meine Crontab also die Zeile

1
virsh list --all &>> virshlistall.txt

ein und melde mich dann wieder.

Emma2

(Themenstarter)

Anmeldungsdatum:
28. Dezember 2018

Beiträge: Zähle...

Mit der Zeile

1
20 * * * * virsh list --all &>> /home/localadmin/virshlistall.txt

wird die Datei virshlistall.txt angelegt, bleibt aber leer. Läuft der Cronjob viellicht "in einem anderen Kontext/Environment"?

Ich habe die gleichen Skripten verwendet, also ich noch VirtualBox verwendet habe (natürlich mit entsprechenden vboxmanage-Befehlen), und da hat es funktioniert. Könnte es also sein, dass der User, unter dem die Cronjobs ausgeführt werden, nicht in der Gruppe ist, die Zugriff auf virsh hat? (Sorry, ich bin noch ganz neu bei KVM/QEMU.)

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 154

Hallo,

Emma2 schrieb:

Mit der Zeile

1
20 * * * * virsh list --all &>> /home/localadmin/virshlistall.txt

wird die Datei virshlistall.txt angelegt, bleibt aber leer.

Gebe doch mal den vollständigen Pfad von virsh mit an. Also:

1
20 * * * * /path/to/virsh list --all >>/home/localadmin/virshlistall.txt

Oder du trägst die Umgebungsvariable PATH in deine (Benutzer)-Crontab mit ein. Siehe:

Cron (Abschnitt „Cron-Jobs-in-Benutzertabellen“)

Gruß

Carsten

von.wert

Anmeldungsdatum:
23. Dezember 2020

Beiträge: 12281

Wie wär's denn statt cron mit systemd/Timer Units? 😉

Emma2

(Themenstarter)

Anmeldungsdatum:
28. Dezember 2018

Beiträge: 622

von.wert schrieb:

Wie wär's denn statt cron mit systemd/Timer Units? 😉

Die habe ich noch auf meiner Lese-und-Lern-Liste ... aber bleibt das aktuelle Problem dort nicht auch?

Emma2

(Themenstarter)

Anmeldungsdatum:
28. Dezember 2018

Beiträge: 622

CarstenHa schrieb:

Gebe doch mal den vollständigen Pfad von virsh mit an. Also:

Damit ich's verstehe: Da auch kein Fehler ausgegeben wurde, nimmst Du an, dass virsh gar nicht gestartet werden konnte?

CarstenHa schrieb:

Gebe doch mal den vollständigen Pfad von virsh mit an. Also:

...

Oder du trägst die Umgebungsvariable PATH in deine (Benutzer)-Crontab mit ein. Siehe:

Ich bin noch lange keine Experte:

  • Wie finde ich den Pfad zu einem Programm?

  • Welcher User führt denn die Crontab aus? Und wie ändere ich seine PATH?

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 154

Den Pfad eines Programms findest du mit type. Also in deinem Fall:

1
type virsh

Wenn du die Möglichkeit mit PATH bevorzugst:

Wie der Wert deiner PATH-Variable aussieht, kannst du Dir einfach mit echo anzeigen lassen. Also:

1
echo $PATH

Die Ausgabe nimmst du dann und trägst das (am Anfang) von deiner Crontab ein. Also:

1
PATH=deine_ausgabe_vom_echo_befehl

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 154

Emma2 schrieb:

Damit ich's verstehe: Da auch kein Fehler ausgegeben wurde, nimmst Du an, dass virsh gar nicht gestartet werden konnte?

Genau.

Ich bin noch lange keine Experte:

Das macht doch nichts. Ich auch nicht.

  • Welcher User führt denn die Crontab aus? Und wie ändere ich seine PATH?

Deine (User)-Crontab änderst Du mit:

1
crontab -e

BTW: Die Crontab von Benutzer root mit sudo-Rechten:

1
sudo crontab -e

Welcher Cronjob ausgeführt wurde kannst Du Dir auch anzeigen lassen mit:

1
journalctl -r | grep 'CRON'

Das sieht dann ungefähr so aus (User):

1
Jul 20 15:00:00 benutzer CRON[11111]: (benutzer) CMD ...

oder bei root:

1
Jul 20 15:00:00 benutzer CRON[11111]: (root) CMD ...

Emma2

(Themenstarter)

Anmeldungsdatum:
28. Dezember 2018

Beiträge: 622

Hmm, habe ich jetzt gemacht, hat aber nichts geändert:

1
2
3
4
5
ul 21 15:30:01 svh-dev.lan.pisoftware.de CRON[2272640]: (localadmin) CMD (/bin/virsh list --all &>> /home/localadmin/virshlistall2.txt)
Jul 21 15:20:01 svh-dev.lan.pisoftware.de CRON[2271261]: (localadmin) CMD (virsh list --all &>> /home/localadmin/virshlistall.txt)
Jul 21 14:20:01 svh-dev.lan.pisoftware.de CRON[2268129]: (localadmin) CMD (virsh list --all &>> /home/localadmin/virshlistall.txt)
Jul 21 13:20:01 svh-dev.lan.pisoftware.de CRON[2266361]: (localadmin) CMD (virsh list --all &>> /home/localadmin/virshlistall.txt)
Jul 21 12:20:01 svh-dev.lan.pisoftware.de CRON[2265173]: (localadmin) CMD (virsh list --all &>> /home/localadmin/virshlistall.txt)

und die Datei ist immer noch leer:

1
2
3
$ ls -l v*.txt
-rw-rw-r-- 1 localadmin localadmin 0 Jul 21 12:20 virshlistall.txt
-rw-rw-r-- 1 localadmin localadmin 0 Jul 21 15:30 virshlistall2.txt

Aber auch die Zeile

1
50 * * * * /bin/virsh connect &> /home/localadmin/virshconnect.txt

generiert lediglich eine leere Datei.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Dann vielleicht mal das Debugging level so setzen, dass mehr Informationen ausgegeben werden. virsh hat da eine Option für.

Womit verbindet sich virsh denn wenn Du einfach nur connect ohne eine URI machst? Kann es sein, dass Dein Benutzer mit dem das beim normalen Login funktioniert eine Umgebungsvariable dafür gesetzt hat? Die gibt's bei Cronjobs nicht, weil das ja nicht die Login-Skripte von dem Benutzer ausführt.

Emma2

(Themenstarter)

Anmeldungsdatum:
28. Dezember 2018

Beiträge: 622

Seltsam (zumindest für mich als Nicht-Experte) ...

Jetzt steht dort

1
2
0 * * * * /bin/virsh -d 0 list --all &>> /home/localadmin/virshlistall2.txt
50 * * * * /bin/virsh -d 0 connect &> /home/localadmin/virshconnect.txt

, die Dateien werden erzeugt, aber sie bleiben beide leer:

1
2
3
$ ls vi*.txt -l
-rw-rw-r-- 1 localadmin localadmin 0 Jul 22 07:50 virshconnect.txt
-rw-rw-r-- 1 localadmin localadmin 0 Jul 22 06:30 virshlistall2.txt

Emma2

(Themenstarter)

Anmeldungsdatum:
28. Dezember 2018

Beiträge: 622

Marc_BlackJack_Rintsch schrieb:

Kann es sein, dass Dein Benutzer mit dem das beim normalen Login funktioniert eine Umgebungsvariable dafür gesetzt hat?

Ich habe nichts explizit gesetzt, und ich kann da auch nichts entdecken:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ printenv
SHELL=/bin/bash
LC_ADDRESS=C.UTF-8
LC_NAME=C.UTF-8
LC_MONETARY=C.UTF-8
PWD=/home/localadmin
LOGNAME=localadmin
XDG_SESSION_TYPE=tty
HOME=/home/localadmin
LANG=C.UTF-8
LC_PAPER=C.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.crdownload=00;90:*.dpkg-dist=00;90:*.dpkg-new=00;90:*.dpkg-old=00;90:*.dpkg-tmp=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:*.swp=00;90:*.tmp=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:
SSH_CONNECTION=192.168.0.11 55172 192.168.0.93 22
LESSCLOSE=/usr/bin/lesspipe %s %s
XDG_SESSION_CLASS=user
TERM=xterm-256color
LC_IDENTIFICATION=C.UTF-8
LESSOPEN=| /usr/bin/lesspipe %s
LIBVIRT_DEFAULT_URI=qemu:///system
USER=localadmin
SHLVL=1
LC_TELEPHONE=C.UTF-8
LC_MEASUREMENT=C.UTF-8
XDG_SESSION_ID=13280
XDG_RUNTIME_DIR=/run/user/1000
SSH_CLIENT=192.168.0.11 55172 22
LC_TIME=C.UTF-8
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
SSH_TTY=/dev/pts/0
LC_NUMERIC=C.UTF-8
_=/usr/bin/printenv
OLDPWD=/bin

Sollte ich vielleicht ein virsh connect vor den Aufruf setzen? Aber es scheint doch der lokale Hypervisor das Default zu sein:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ virsh connect --help
  NAME
    connect - (re)connect to hypervisor

  SYNOPSIS
    connect [--name <string>] [--readonly]

  DESCRIPTION
    Connect to local hypervisor. This is built-in command after shell start up.

  OPTIONS
    --name <string>  hypervisor connection URI
    --readonly       read-only connection

Ich versuch's also mal mit:

1
0 * * * * /bin/virsh connect && /bin/virsh -d 0 list --all &>> /home/localadmin/virshlistall.txt

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@Emma2 Also ich entdecke da was: LIBVIRT_DEFAULT_URI=qemu:///system

Antworten |