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