Завершить процесс после того, как он был запущен в течение некоторого времени

13

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

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

grep -qsRw -m1 "parameter" /var

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

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

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

Яэль
источник
3
ты не спросил это уже? stackoverflow.com/questions/3061377/…
Нет этого другого вопроса, потому что я не получаю ответ на вопрос об исто. Яэль
4
@yael: ранее вы использовали очень хорошее решение, timeoutи даже получили инструкции по его установке. Это грубо игнорировать этот ответ, а затем дублировать ваш вопрос.
Paul R
извините, но НЕТ, я не хочу ничего устанавливать на свою систему THX yael
5
@yael: тогда вам нужно обновить исходный вопрос, чтобы включить это ограничение , а НЕ просто дублировать вопрос и начать все заново
Paul R

Ответы:

12

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

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

feniix
источник
2
Это не в моем Ubuntus (10.10 рабочий стол, сервер 11.04), поэтому, вероятно, не по умолчанию. Но быстро схватил sudo aptitude install timelimit. Прекрасно работает после установки.
День
7

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

grep -qsRw -m1 "parameter" /var &

GREPPID=$!

( sleep 30; kill $GREPPID ) &

fg $GREPPID

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

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

Создайте новый файл с именем "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, в противном случае вы можете добавить ее).

Jarvin
источник