0

我正在尝试重新启动、启动、关闭特定的虚拟机。在这里,首先我想在运行脚本之前检查虚拟机是否已经处于所需状态。

这些是虚拟机列表。

[root@demohost05 ~]# virsh list --all
Id    Name                           State
----------------------------------------------------
5     OwnCloud01                     running
6     OwnCloud02                     running
7     SiteMon                        running
-     vmtest                         shut off

我想在实施之前检查 vmtest 是否正在运行

virsh start vmtest

如何在 shell 脚本中使用 if 条件检查状态?

当我必须使用 sudo 命令时,如何避免输入密码。

sudo virsh start vmtest

我还尝试使用授予root权限

sudo -i
virsh start vmtest

但是脚本没有实现第二行就结束了。如何在同一个脚本文件中使用这两个命令?

if [conditions]
then
{

}
fi

我不知道如何检查此类脚本的条件。

谢谢你。

4

5 回答 5

3

试试这个:


tmp=$(virsh list --all | grep " vmtest " | awk '{ print $3}')
if ([ "x$tmp" == "x" ] || [ "x$tmp" != "xrunning" ])
then
    echo "VM does not exist or is shut down!"
    # Try additional commands here...
else
    echo "VM is running!"
fi

# For passwordless sudo:
sudo cat /etc/sudoers

# You'll see this:

# User privilege specification
root    ALL=(ALL:ALL) ALL

# To add user sharad as a sudo user:

# User privilege specification
root    ALL=(ALL:ALL) ALL
sharad  ALL=(ALL:ALL) ALL

# To add user sharad as a sudo user such that it doesn't ask for password (note the NOPASSWD):

# User privilege specification
root    ALL=(ALL:ALL) ALL
sharad  ALL=(ALL:ALL) NOPASSWD: ALL

# Read this for reference: http://www.ducea.com/2006/06/18/linux-tips-password-usage-in-sudo-passwd-nopasswd/
于 2016-05-26T07:20:59.083 回答
1

我喜欢沙拉德的回答,但我在等待虚拟机关闭时将其反转为一个繁忙的循环

    virsh shutdown $VM
    state=$(virsh list --all | grep " $VM " | awk '{ print $3}')
    while ([ "$state" != "" ] && [ "$state" == "running" ]); do
      sleep 10
      state=$(virsh list --all | grep " $VM " | awk '{ print $3}')
    done;
    # now do something else to the shutdown VM and finally restart it
    virsh start $VM

就我而言,我在关闭 VM 时创建一个快照,然后重新启动它。我将 10 秒的睡眠时间硬编码到循环中,因为这似乎是一个合理的重试周期,因为 Windows 虚拟机在安装更新时可能需要很长时间——可能是几分钟甚至更长。

于 2019-05-30T22:42:23.483 回答
1

我的情况有点不同,所以我得到了一个稍微不同的解决方案。

我想启动一个虚拟机(Windows)并通过xfreerdp一个脚本连接到它。为此,必须在 VM 内打开端口 3389,这不是在启动 VM 后直接打开的情况,尽管virsh list --all返回“正在运行”。nc所以这是我使用(aka netcat) 检查端口的小脚本:

# "windows_vm" is the VM-name, while "windows_guest" is the VM's hostname
virsh dominfo windows_vm | grep 'State: *shut off'
if [ $? -eq 0 ]; then
  echo "Start windows_vm..."
  virsh start windows_vm
  while true; do
    echo "Waiting for start..."
    # nc-parameters:
    #   -w1: wait 1s
    #   -z: ony scan the port without sending data
    nc -w1 -z windows_guest 3389 
    if [ $? -eq 0 ]; then
      break
    fi
    sleep 1
  done
fi

xfreerdp /v:windows_guest ...some-more-parameters...

如果 Windows 中未启用远程桌面功能,则可能还有其他端口可以检查。

如果来宾是 Linux-VM 端口 22 总是值得一试的。

于 2020-05-06T08:05:47.927 回答
0

基于 Sharad 和 Gary 的答案,但仅查询有问题的 VM 的状态。

virsh shutdown $VM
state=$(virsh dominfo $VM | grep -w "State:" | awk '{ print $2}')
while ([ "$state" != "" ] && [ "$state" == "running" ]); do
  sleep 10
  state=$(virsh dominfo $VM | grep -w "State:" | awk '{ print $2}')
done;
# now do something else to the shutdown VM and finally restart it
virsh start $VM
于 2021-01-22T22:57:35.623 回答
0

如果您不需要使用virsh命令,在 Ubuntu 上,一个正在运行的域名有一个 PID 文件和运行 XML 配置文件在"/var/run/libvirt/qemu/${DomainName}.{pid,xml}".

我编写了一个脚本来在文件存在的情况下启动域。这样我就不必切换域自动启动选项。

================================================================================
2022/01/15 16:18:42:    Okay to start.
2022/01/15 16:18:42:    'ParrotKde' appears to be running already. PID = 24470.
2022/01/15 16:18:45:    'UbuntuServer20' has been started. PID = 25209.

================================================================================
2022/01/15 16:20:45:    '/scripts/startvms' doesn't exist. Aborting.
于 2022-01-15T21:24:44.877 回答