простой тайм-аут на ввод / вывод для команды для Linux - PullRequest
0 голосов
/ 10 февраля 2011

Сначала предыстория этого интригующего вызова.В сборке с непрерывной интеграцией часто возникают сбои при разработке и тестировании взаимоблокировок, циклов или других проблем, которые приводят к бесконечному тестированию.Таким образом, все механизмы уведомления о сбое сборки стали бесполезными.

Решение будет заключаться в том, чтобы иметь тайм-аут сценария сборки, если нулевой вывод в файл журнала сборки более 5 минут, так как сборка регулярно записываетимена юнит-тестов по мере прохождения.Так что это лучший способ определить, что он «заморожен».

Хорошо.Теперь самое мелкое ...

Сервер сборки использует Hudson для запуска простого сценария bash, который вызывает более сложный сценарий сборки на основе Nant и MSBuild (все в Windows).

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

То, о чем мы думали до сих пор:

Во-первых, вот команда высокого уровня:полный набор тестов в Hudson.

build.sh clean free test

Эта команда просто отправляет все журналы компоновки Nant и MSBuild на стандартный вывод.

Очевидно, что нам нужно передать этот вывод в файл:

build.sh clean free test 2>&1 | tee build.out

Затем параллельно команде нужно поспать, проверьте время изменения файла и, если более 5 минут, уничтожит основной процесс.kill -9 будет в порядке в этот момент - ничего изящного не понадобится, как только оно замерзнет.

Это часть, с которой вы можете помочь.

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

С уважением, Уэйн

Ответы [ 3 ]

1 голос
/ 10 февраля 2011
build.sh clean free test 2>&1 | tee build.out &
sleep 300
kill -KILL %1
0 голосов
/ 12 февраля 2011

Решил это сам, написав скрипт bash.

Он называется iotimeout с одним параметром, который представляет собой количество секунд.

Вы используете его так:

build.sh clean dev test |iotimeout 120

iotimeout имеет 2 цикла.

Один из них - простой цикл чтения строки, который выводит эхо-строку, но он также использует команду touch, чтобы каждый раз обновлять измененное время файла tmp.пишет строку.К сожалению, было невозможно отслеживать файл build.out, потому что Windoze не обновляет время изменения файла, пока вы не закроете файл.Ну хорошо.

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

Единственная сложность - возвращать код завершения исходной программы.Bash предоставляет вам массив PIPESTATUS для решения этой проблемы.

Кроме того, выяснить, как убить всю группу программ, было неким исследованием, но оказалось, что просто - убить 0

0 голосов
/ 10 февраля 2011

Вы можете использовать timeout:

timeout 300 command
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...