2012-06-10 1 views
0

Существует команда (скажем $ run_command), которая должна быть убита после таймаута. Решение довольно простое - я могу просто использовать таймаут от coreutils или timeout3 из других тем stackoverflow. Но моя команда получает это от стандартного ввода распакуйте л трубы, как этоТайм-аут Bash с входным каналом

tar -xO -f "$1" | /usr/bin/time -f "%e" --output=$time_output -- $run_command 

Где $ вводного команда моя команда, время выполнения также быть измерена (с использованием времени утилиты).

Итак, вопрос в том, что является лучшим способом избежать включения времени разворачивания в тайм-аут ?

+0

«Есть сценарий» неясно. Это сценарий вызова или $ run_command, который должен быть убит после таймаута? – ghoti

+0

Нет, это $ run_command, который нужно убить. Спасибо, я отредактирую вопрос – Ribtoks

ответ

3

В очень простой форме, вы можете убить вызывающий скрипт так:

#!/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 перерабатывается для другого процесса. Решение, которое остается для упражнения читателем.:-)

+0

В этом примере время выполнения _tar_ также будет присутствовать в $ timeout_period. Это ситуация, которую я хочу избежать. – Ribtoks

+0

Конечно, я написал это, прежде чем вы выяснили, что вы хотели убить. Если вы хотите полностью исключить эффект tar на свое время, вам необходимо сохранить данные во временном файле. Я обновлю ... – ghoti

+0

Я уточнил, что я хотел убить в теме перед вашим ответом. Но все же, спасибо. И, также, зачем вам _trap_? Временный файл должен исчезнуть после завершения родительского процесса, не так ли? – Ribtoks

1

Я думаю, что вы ищете в этом примере, это временный файл, а не конвейер. В большинстве случаев вы хотите выполнить конвейер параллельно. В вашем случае (профилирование), а также когда предшествующие команды должны преуспеть перед выполнением последующих команд, требуется последовательная операция. Я рекомендую использовать для этого эффекта mktemp. Я не знаю, как использовать FIFO либо путем замены процесса, либо с помощью mkfifo для этого примера, так как $run_command всегда зависит от вывода tar.

+0

Я обычно использовал 'tempfile' для этой цели, хотя я действительно не знаю почему. Является ли 'mktemp' лучше? – thb

+1

tempfile устарел в соответствии со своей страницей. –

+0

Вы предлагаете разложить содержимое $ 1 в tempfile, а затем использовать smth, как этот '/ usr/bin/time -f"% e "--output = $ time_output - $ run_command <$ tempfile_name'? – Ribtoks

 Смежные вопросы

  • Нет связанных вопросов^_^