如何从shell脚本返回然后重新启动(与VirtualBox一起使用)?

时间:2016-08-07 23:58:58

标签: bash shell virtualbox restart

我正在使用带有Windows主机和Linux(RHEL7)来宾的虚拟盒的guestcontrol。我想通过在guest虚拟机上运行shell脚本(来自主机上的.bat)来从主机到guest虚拟机进行一些配置。这很好,脚本运行,但是,当我调用重启时它会挂起(我相信这是因为没有返回)。因此,当调用以下.sh时:

#!/bin/bash
echo "here"
exit

.bat文件显示" here"然后退出(或者如果我使用暂停给出正确的消息)。但是,当我添加重新启动时,.bat永远不会处理它调用脚本的任何内容。我想这是因为客人从不告诉主人脚本是完整的。

我尝试过这样的事情:

#!/bin/bash
{ sleep 1; reboot; } >/dev/null &
exit

甚至:

#!/bin/bash
do_reboot(){
  sleep 1
  reboot
}
do_reboot() &
exit

但.bat永远不会越过运行.sh

的行

如何告诉主机.sh脚本(在guest虚拟机上)已完成,以便继续使用.bat脚本?

1 个答案:

答案 0 :(得分:0)

我们需要确保没有子进程在运行,因此我们希望使用nohup命令进行无需处理。所以脚本就变成了这个:

#!/bin/bash

nohup reboot &> /tmp/nohup.out </dev/null &
exit

stdin和stdout导致问题,所以这只是将它们发送到void中,这样脚本就不会等待来自任何其他进程的任何输入。

如果您对此脚本有任何疑问,可以执行以下操作:

#!/bin/bash

nohup /path/to/reboot_delay.sh &> /tmp/nohup.out </dev/null &
exit

然后在/path/to/reboot_delay.sh中你会得到:

#!/bin/bash
sleep 10 # or however many seconds you need to wait for something to happen
reboot

这样你甚至可以留出一些时间来完成某些事情,但是主机(或者ssh或你从哪里调用它)仍然会知道脚本已经完成并且做了它需要做的事情。

我希望这可以在将来帮助人们。