В очень простой форме, вы можете убить вызывающий скрипт так:
#!/bin/bash
(sleep $timeout_period && kill $$) &
tar -xO -f "$1" | ...
Конечно, это всего лишь пример; вы захотите предоставить некоторую страховку, что $$ по-прежнему остается тем же самым скриптом, когда запускается kill
.
Это, конечно, убьет весь скрипт, включая time
(который будет $ timeout_period, если скрипт был убит).
ОБНОВЛЕНИЕ # 1:
Пример использование временного файла.
tmpfile=$(/usr/bin/mktemp /tmp/temp.XXXXX)
tar -xO -f "$1" > $tmpfile
trap "rm -f $tmpfile" 0 1 2 3 15
/usr/bin/time -f "%e" --output=$time_output -- $run_command < $tmpfile
Обратите внимание, что это по-прежнему подлежит ошибке из-за скорости и производительности вашей файловой системы.
UPDATE # 2:
Это добавляет функцию тайм-аута в дополнение к освобождающие tar
время:
(
tmpfile=$(/usr/bin/mktemp /tmp/temp.XXXXX)
tar -xO -f "$1" > $tmpfile
trap "rm -f $tmpfile" 0 1 2 3 15
/usr/bin/time -f "%e" --output=$time_output -- $run_command < $tmpfile
) &
pid=$!
(sleep $timeout_period && kill $pid) &
wait %1
Тот же потенциальная проблема в первом сценарии сегмент существует; вы захотите предоставить страховку, что $$ все еще так, как вы думаете, до того, как вы ее убьете. Кроме того, сигнал будет отправлен в оболочку оболочки, а не непосредственно в вашу команду. Вам нужно будет проверить, передаются ли сигналы вашей команде, как и ожидалось.
Обратите внимание, что этот фон тайм-аут/убить. «Ожидание» сообщает сценарию подождать, пока первый фоновый процесс не будет завершен, поэтому либо ваша команда заканчивается сама по себе , либо убивает таймаут ... а затем сценарий переходит к чему-либо после wait
. Если команда завершается сама по себе, тогда вы столкнетесь с потенциальными проблемами, когда $ pid перерабатывается для другого процесса. Решение, которое остается для упражнения читателем.:-)
«Есть сценарий» неясно. Это сценарий вызова или $ run_command, который должен быть убит после таймаута? – ghoti
Нет, это $ run_command, который нужно убить. Спасибо, я отредактирую вопрос – Ribtoks