оболочка для перезапуска скрипта на основе его вывода - PullRequest
0 голосов
/ 20 ноября 2018

Я немного потренировался в написании сценариев оболочки, читая вводные данные из других программ, но не уверен, как решить эту проблему.

ОБЗОР

Программа robinbotter , чьи внутренние компоненты, которые я не могу исправить / изменить, получает свои данные из файлов equities.sym и blacklist.sym , каждый простой текстовый файл содержит один символ тикера на строку.

Когда все работает нормально, его вывод выдает:

...
Downloading instruments: [ AFL KELYB LFUS ] 
...

Когда он ломается из-за внутренних ошибок,

...
Downloading instruments: [ AFL KELYB LFUS LNVGY 

и останавливается там, без дальнейшего вывода, давая код выхода 0 как в нормальном случае (к сожалению).

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

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

ВОПРОС

Я пытаюсь написатьминималистичный скрипт в BASH (например, retryRB.sh ./robinbotter), который:

  1. Каким-то образом отслеживает оперативный небуферизованный вывод robinbotter, используя регулярное выражение или другой метод для обнаружения при выводе строки, содержащей " Загрузка инструментов: [ "не заканчивается на" ]"до завершения программы.В этом случае:
  2. Возьмите последний напечатанный символ (например, LNVGY ), который вызывает сбой программы, и добавьте его в конец файла blacklist.sym .Как и в случае

    echo $ lastSymbol >> blacklist.sym

  3. Перезапустите программу robinbotter, сохранив исходные параметры командной строки: $ @

Я знаком с такими инструментами, как awk и sed, и был бы готов создать короткое решение в Ruby, если бы Bash его не вырезал.

1 Ответ

0 голосов
/ 20 ноября 2018

Здесь у вас есть Bash-версия кода, которая имитирует то, что делает ваш бинарный файл.затем у вас есть обертка, которая регистрирует, когда приложения успешно завершаются, а также, когда оно выходит из строя.При неудаче он также добавляет последний напечатанный элемент, как вы можете видеть на изображениях ниже (в этом случае я жестко кодирую ошибку на Bomb! и Boom! , но вы получаетеидея):

main.sh

#!/bin/bash

some=('Pera' 'Manzana' 'Frutilla' 'Durazno' 'Banana' 'Lechuga' 'Sandia' 'Papa' 'Melon' 'Milanesa' 'Bomb!' 'Boom!')

printf 'Downloading instruments: [ '
for (( i=1 ; i < 5 ; i++ )) {
        item=${some[$( shuf  -i 0-$((  ${#some[@]} - 1 )) -n 1 )]}
        printf "$item"
        [[ $item == 'Bomb!' || $item == "Boom!" ]] && exit || printf "$item"
        [[ $i -lt 4 ]] && printf ' '
}
printf ' ]'

wrapper.sh

#!/bin/bash

while :
do
        res=$( ./main.sh )
        [[ ! "$res" =~ \[[^]]*\] ]] && printf "Failure : ${res##*[\[ ]}" ||  printf "Success"
        printf '\n'
        sleep 1
done

enter image description here

Выможете протестировать эти сценарии и затем поместить ваш двоичный файл вместо main.sh .Привет!

...