Убить процесс после того, как ему позволили какое-то время

8763
yael

Я хочу ограничить время, в течение которого grepкоманда процесса может выполняться или быть активной.

Например. Я хочу выполнить следующее:

grep -qsRw -m1 "parameter" /var 

Но перед запуском grepкоманды я хочу ограничить продолжительность grepпроцесса, скажем, не более 30 секунд.

Как мне это сделать?

И если это возможно, как я могу вернуться или сбросить, чтобы не иметь ограничения по времени впоследствии.

11
ты не спрашивал это уже? http://stackoverflow.com/questions/3061377/grep-add-time-out-after-some-time-if-not-find-the-relevant-match 14 лет назад 3
Нет, это другой вопрос, потому что я не получаю ответ на вопрос. 14 лет назад 0
@yael: ранее вы получили очень хорошее решение, используя `timeout`, и даже получили инструкции о том, как его установить. Это грубо игнорировать этот ответ, а затем дублировать ваш вопрос. Paul R 14 лет назад 4
извини но НЕТ я не хочу ничего устанавливать на свою систему THX yael 14 лет назад 0
у моего linux нет таймаута и я не могу его установить Yael 14 лет назад 0
@yael: тогда вам нужно * обновить исходный вопрос, чтобы включить это ограничение *, а НЕ просто дублировать вопрос и начать все заново Paul R 14 лет назад 5
Взгляните также на [этот раздел часто задаваемых вопросов BASH.] (Http://mywiki.wooledge.org/BashFAQ/068) Walter Mundt 14 лет назад 0

3 ответа на вопрос

10
feniix

Вы можете использовать timelimit, он доступен в Ubuntu по умолчанию или вы можете скомпилировать его самостоятельно.

timelimit выполняет команду и завершает порожденный процесс через заданное время с заданным сигналом. Сначала отправляется сигнал «предупреждение», затем, после тайм-аута, сигнал «убить», аналогично тому, как init (8) работает при выключении.

Это не в моем Ubuntus (10.10 рабочий стол, сервер 11.04), поэтому, вероятно, не по умолчанию. Но его легко схватить с помощью 'sudo aptitude install timelimit'. Прекрасно работает после установки. Day 13 лет назад 2
6
Walter Mundt

Вот немного хакерский удар для этого:

grep -qsRw -m1 "parameter" /var &  GREPPID=$!  ( sleep 30; kill $GREPPID ) &  fg $GREPPID 

По сути, он запускает поиск в фоновом режиме, затем запускает подоболочку, которая ждет 30 секунд, а затем убивает процесс поиска. Если поиск занимает <30 с, процесс уже будет мертв. Это не очень хорошая идея, чтобы убить процесс, который уже мёртв, потому что очень маловероятно, что кто-то еще будет повторно использовать pid, но для чего-то подобного это обычно нормально. Наконец, поиск возвращается на передний план и будет выполняться до тех пор, пока он не закончится или не будет уничтожен.

как получить $? от grep в этом случае, потому что в моем скрипте я беру $? из grep и проверьте, соответствует ли grep строке? Яэль 14 лет назад 0
Я не уверен, что есть простой способ сделать это. Кроме того, этот подход не работает в сценарии, где bash не имеет активного управления заданиями. Возможно, вам придется прибегнуть к небольшому количеству Perl-хакеров, чтобы выполнить работу в сценарии. Хм ... Walter Mundt 14 лет назад 0
Возможно ли поступить этот вопрос в Perl? Яэль 14 лет назад 0
3
Jarvin

Создайте новый файл с именем «tgrep» и вставьте в него следующее (или назовите его как хотите):

#!/bin/bash grep $@ & PID=$! sleep 30 && kill $PID 2>/dev/null & wait $PID exit 0 

Далее беги chmod a+x tgrep. Теперь, если вы хотите использовать его, вы можете напечатать

./tgrep -i "results" /home/dan/*txt 

Или вы можете просто использовать его как tgrep (без ./ и иметь возможность использовать его из любого каталога), если вы поместите его в каталог, содержащийся в переменной $ PATH (например, / home / dan / bin /, если он находится в ваша переменная $ PATH, в противном случае вы можете добавить ее).

Похожие вопросы