Как установить pipe процесса после подмены процесса в bash, чтобы процесс продолжался после завершения скрипта?

[113268]Наличие парсеров практически на каждом языке программирования является одним из преимуществ JSON как формата обмена данными. [12153] Вместо того, чтобы пытаться реализовать парсер JSON, вам, вероятно, лучше использовать либо инструмент, собранный для парсинга JSON, такой как [113741]jq[113742], либо скриптовый язык общего назначения, имеющий библиотеку JSON. [12154]Например, используя jq, вы можете вытащить ImageID из первого элемента массива Instances следующим образом:[12155]Альтернативно, чтобы получить ту же информацию, используя JSON-библиотеку Ruby:[12156]Я не буду отвечать на все ваши измененные вопросы и комментарии, но надеюсь, что этого будет достаточно, чтобы вы начали. [12157]Предположим, что у вас был скрипт Ruby, который мог читать с STDIN и выводить вторую строку в вашем примере output[0]. Этот сценарий может выглядеть как:[12158]Как вы могли использовать такой сценарий для достижения всей вашей цели? Ну, предположим, что у вас уже была следующая:[12159]a команда перечислить все ваши экземпляры[12160]a команда получить json выше для любого экземпляра в вашем списке и вывести его в STDOU[12161]Одним из способов будет использование вашего shell'а для объединения этих инструментов:[12162]Теперь, возможно, у вас есть одна команда, которая дает вам один json blob для всех экземпляров с большим количеством элементов в массиве "Instances". Ну, если это так, то вам просто нужно немного изменить скрипт, чтобы выполнить итерацию через массив, а не просто использовать первый элемент.[12163]В конце концов, способ решения этой проблемы, это способ решения многих проблем в Unix. Разбейте его на более простые проблемы. Найти или написать утилиты для решения более простой задачи. Объедините эти инструменты с оболочкой или другими функциями операционной системы.[12164]Обратите внимание, что я понятия не имею, откуда у вас берется cost-center, так что я его только что придумал.[113291].
2
10.06.2015, 19:09
1 ответ

Из скрипта bash запускается подпроцесс (запуск программы на Python) и создаётся конвейер от него к скрипту bash.

После выхода бэш-скрипта больше нет никакого процесса, в котором труба открыта для чтения. Поэтому в следующий раз, когда Python-скрипт что-нибудь напишет на трубу, он получит сигнал SIGPIPE и умрёт. Вы бы увидели результирующую ошибку, если бы перенаправили только стандартный вывод на трубу, а не стандартную ошибку.

Даже если сценарий на Python проигнорирует сигнал SIGPIPE, он все равно умрет при записи в трубу, потому что запись в трубу будет неудачной, что вызовет исключение.

Если вы хотите видеть только строку, которая говорит вам, что сервер готов, или до строки о первом запросе, то простой способ - это держать читатель запущенным:

exec 3< <(python3 -u -m http.server 2>&1 )
{ while true; do
  …
  done;
  exec cat;
} <&3

Вы можете захотеть перенаправить стандартную ошибку куда-нибудь в лог-файл, вместо того, чтобы блаженно игнорировать сообщения об ошибках.

Альтернативным подходом было бы написать несколько строк на Python, переопределив метод BaseHTTPRequestHandler.log_request только для того, чтобы выдать запись в лог только в первый раз.

2
27.01.2020, 22:12

Теги

Похожие вопросы