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