VirtualBox 关闭时停止 netcat

VirtualBox 关闭时停止 netcat

在 OSX 下的 VirtualBox 中使用 netcat 重定向 DOS 程序的打印输出。

#!/bin/bash
VBoxManage startvm FreeDOS
while :
do
    nc -l 1235 | lpr
done

除了 VirtualBox 关闭时 netcat 继续运行之外,此方法有效。一定会有更好的办法!

答案1

您可以通过以下方式执行此操作:

  1. 数控背景 |液化石油气管道
  2. 轮询VM的状态
  3. 当虚拟机终止时终止后台管道。

幸运的是,VBoxManage 提供了一种方法来实现 (3)。 VBoxManage 有一个showvminfo命令可以为您提供虚拟机的当前状态。

VBoxManage startvm FreeDOS

(
    while :
    do
        nc -l 1235 | lpr
    done
)&


while sleep 10; do
    vmstate=$(VBoxManage showvminfo --machinereadable FreeDOS | awk -F= '{ if ($1=="VMState") print $2}' | tr -d '"')
    case $vmstate in
        running)
            echo "Still running."
            ;;
        *)
            echo "VM not running. Attempting to kill netcat"
            kill %%
            exit 0;
    esac
done

请注意,目前这仅处理“运行”而不是其他一切。您可能希望在案例陈述中考虑其他州。您还可以使用 netcat 的 -k 参数来简化第一个 while 循环(这样您就根本不必循环)。

答案2

我放弃!通过使用 ncat 而不是 nc 解决了连接问题,并放弃了后台工作,因为我无法让它工作。以下内容有效并在退出时关闭进程。

if VBoxManage startvm FreeDOS; then    
    if ! pgrep ncat -p 1235 -l ; then
        while :
        do
            ncat -p 1235 -l | lpr
        done
    fi
fi

相关内容