Pare o netcat quando o VirtualBox fecha

1

Usando o netcat para redirecionar a saída de impressão do programa DOS no VirtualBox em OSX.

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

Isso funciona, exceto que quando o VirtualBox fecha, o netcat continua em execução. Deve haver uma maneira melhor!

    
por BernieV 24.05.2014 / 15:05

2 respostas

1

Você pode fazer isso por:

  1. Como usar o seu nc | lpr pipeline
  2. Pesquisando o status da VM
  3. Mate o pipeline em segundo plano quando a VM morre.

Felizmente, o VBoxManage oferece uma maneira de fazer (3). VBoxManage tem um comando showvminfo que pode fornecer o estado atual de uma vm.

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

Observe que atualmente isso só lida com "execução" versus todo o resto. Pode haver outros estados que você pode querer considerar na instrução case. Você pode potencialmente simplificar o primeiro loop while usando o argumento -k do netcat (para que você não tenha que fazer um loop).

    
por 24.05.2014 / 19:11
0

Eu desisto! Resolvi os problemas de conexão usando o ncat em vez do nc e abandonei o backgrounding porque não consegui fazê-lo funcionar. O seguinte funciona e desliga os processos ao sair.

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