Этот ответ на команду командной строки для автоматического уничтожения команды через определенное время
предлагает 1-строчный метод для тайм-аута длительной команды из командной строки bash:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Но возможно, что данная «длительная» команда может завершиться раньше, чем время ожидания. (Давайте назовем это «обычно продолжительной, но иногда быстрой» командой или tlrbsf для удовольствия.)
Так что у этого изящного подхода с 1 линией есть пара проблем. Во-первых, sleep
это не условно, так что устанавливает нежелательную нижнюю границу времени, необходимого для завершения последовательности. Рассмотрим 30 с, 2 м или даже 5 м для сна, когда команда tlrbsf заканчивается через 2 секунды, что крайне нежелательно. Во-вторых, kill
это безусловное условие, поэтому эта последовательность попытается убить не запущенный процесс и скулить по этому поводу.
Так...
Есть ли способ для тайм-аута обычно длительной, но иногда быстрой ( "tlrbsf" ) команды, которая
- имеет реализацию bash (на другой вопрос уже есть ответы на Perl и C)
- будет завершен в более раннем из двух: завершение программы tlrbsf или истекло время ожидания
- не будет уничтожать несуществующие / не запущенные процессы (или, опционально: не будет жаловаться на неудачное уничтожение)
- не должен быть 1-лайнер
- может работать под Cygwin или Linux
... и, для получения бонусных очков, запускает команду tlrbsf на переднем плане и любой «спящий» или дополнительный процесс в фоновом режиме, так что stdin / stdout / stderr команды tlrbsf может быть перенаправлен так же, как если бы он был бежать напрямую?
Если это так, пожалуйста, поделитесь своим кодом. Если нет, объясните, пожалуйста, почему.
Я потратил некоторое время, пытаясь взломать вышеупомянутый пример, но я достигаю предела своих навыков в bash.
timeout
утилиту gnu ?
timeout
отлично! Вы даже можете использовать несколько команд (многострочный скрипт): stackoverflow.com/a/61888916/658497