Действительно, в вашем коде diff
получает вывод kill
вместо program
. Вы можете решить эту проблему, объединив команды перед каналом в подоболочке с ()
.
Другая потенциальная проблема с вашим скриптом заключается в том, что kill
не предназначен для ожидания завершения program
; вместо этого он просто посылает ему сигнал. Поэтому вы можете столкнуться с состоянием гонки, когда diff
работает, не перехватывая весь вывод program
. Я советую программно дождаться завершения фонового процесса с помощью встроенной команды wait
bash.
Вот пример вашего кода, содержащего вышеуказанные исправления:
#!/bin/bash
(
./program <input1.txt &
PID=$!
sleep 1
kill -INT $PID
wait
) | diff -y reference_output.txt -
Я совсем недавно начал с контейнеров и докеров. Это лучше, потому что вы можете запускать контейнеры где угодно, у них легкая архитектура и они могут запускаться быстрее, чем виртуальные машины. У вас может быть много образов из Docker Hub для сборки инфраструктуры. Например, если вам нужен веб-сервер с wordpres или LAMP, вы можете просто установить общедоступный образ в Docker Hub и все
И на следующем этапе вы сможете понять прекрасный мир kubernetes.
Надеюсь, что ответ был полезен.
Экосистема Docker имеет довольно хороший набор инструментов для (повторного )создания контейнеров Docker с нуля в соответствии со спецификацией в Dockerfile.
Если накладные расходы не критичны для вашего приложения или дизайн приложения можно масштабировать за счет распараллеливания, использование контейнеров внутри виртуальных машин все же может иметь смысл из-за удобства разработки и обслуживания, обеспечиваемого контейнерами. Если вам нужно больше производительности, просто добавьте больше параллельных узлов...
Но вы правы в том, что это может быть правильным решением не для всех :, если у вас уже есть инфраструктура для автоматического -создания новых виртуальных машин правильного типа по желанию и вы довольны этим, возможно, у вас уже есть такое же удобство по-другому. Или, если вам не нужно запускать несколько экземпляров параллельно, преимущество в удобстве в любом случае может быть не таким уж большим.
По сути, цель состоит в том, чтобы сделать производственные обновления легкой -задачей :«просто остановить виртуальную машину/контейнер, выбросить старый, развернуть этот новый образ/контейнер виртуальной машины на его месте и перезапустить. Повторите для любого количества виртуальных машин/контейнеров, на которых параллельно запущено одно и то же приложение».
Использование стандарта де-факто -, такого как контейнеры Docker, позволяет при необходимости легко переходить от одного поставщика услуг к другому. С инфраструктурой разработки, разработанной и оптимизированной для простого создания дроплетов DigitalOcean, вам, возможно, придется перестроить части вашей автоматизации разработки, если вы когда-нибудь перейдете с DigitalOcean.
С другой стороны, если производительность одного -узла является критическим фактором для вашего приложения, то правильным ответом может быть вовсе не облако, а, возможно, некоторая форма традиционного размещенного или даже -локального сервера.. Это также может указывать на то, что приложение представляет собой поспешную адаптацию традиционной конструкции с одним сервером -к облачному миру.и требуется дополнительная работа по проектированию, чтобы действительно хорошо вписаться в облачную экосистему, чтобы использовать преимущества масштабируемости и параллелизма с несколькими -узлами, когда это возможно.