VirtualBoxが終了するとnetcatを停止する

VirtualBoxが終了するとnetcatを停止する

OSXのVirtualBoxでnetcatを使用してDOSプログラムの印刷出力をリダイレクトします。

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

VirtualBoxが閉じてもnetcatが実行され続ける点を除いて動作します。もっと良い方法があるでしょう!

答え1

次の方法でこれを実行できます。

  1. CNCの背景|写真CNCの背景LPGパイプライン
  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

私はあきらめる! ncの代わりにncatを使用して接続の問題を解決し、動作しなかったのでバックグラウンドタスクを放棄しました。以下は、終了時にプロセスを操作して閉じます。

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

関連情報