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

How can I return from a shell script and then reboot (to use with VirtualBox)?

我正在使用带有 Windows 主机和 Linux (RHEL7) 客户机的 Virtual Box 来宾控制。我想通过 运行 来宾上的 shell 脚本(来自主机上的 .bat)从主机到来宾进行一些配置。这很好并且脚本运行,但是,当我调用重新启动时它挂起(我相信这是因为没有返回任何内容)。所以当下面的.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 脚本(在来宾上)已完成,以便它可以继续 .bat 脚本?

我们需要确保没有子进程 运行,所以我们想使用 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 或任何你调用它的地方)仍然会知道脚本已经完成并做它需要做的事情。

希望这对以后的人有所帮助。