Intereting Posts
Как изменить цвет шрифта заголовка окна в теме adwaita? Яркие клавиши не работают с ядром 3.14+ Отфильтровать 2-й вхождение текста между цитатами с помощью sed? Легко получить конкретный столбец из вывода без sed или awk Vim gg = G (полный файл цели) без потери текущей позиции Могу ли я применить `tmux` к сценарию bash? Как перезагрузить машину, когда она висит? Архивирование домашней папки пользователя на удаленный сервер без каких-либо символических ссылок? Как сделать экран печати или захватить область экрана применить темы zsh вручную Как запускать программы с такими аргументами, как «arg = val» (например, dd) в rc shell (версия Linux портирована из Plan9 OS)? перемещение столбцов по строкам less под tmux обрабатывает завернутые строки как одиночные строки, разбивая пейджинг Ubuntu 13.04 с LinuxLive USB Creator и настойчивость забывают фон рабочего стола и раскладки клавиатуры Прошивка ath10k не обновляется для 168c: 0041

Остановить netcat, когда VirtualBox закрывается

Использование netcat для перенаправления вывода на печать из программы DOS в VirtualBox под OSX.

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

Это работает, за исключением того, что при закрытии VirtualBox netcat продолжает работать. Должен быть лучший способ!

Вы можете это сделать:

  1. Обоснование вашего nc | трубопровод lpr
  2. Опрос статуса виртуальной машины
  3. Убейте фоновый конвейер, когда VM умрет.

К счастью, VBoxManage предоставляет способ сделать (3). VBoxManage имеет команду showvminfo которая может дать вам текущее состояние 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 

Обратите внимание, что в настоящее время это только обрабатывает «бег» и все остальное. Могут быть и другие состояния, которые вы, возможно, захотите учесть в заявлении case. Вы можете упростить первый цикл while, используя аргумент -k netcat (так что вам вообще не нужно петли).

Я сдаюсь! Решил проблемы со связью, используя ncat вместо nc и отказавшись от фоновой вещи, поскольку я просто не мог заставить ее работать. Следующие действия завершают процессы при выходе.

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