Процес вбивства буде дозволено запустити деякий час


13

Я хочу обмежити час, коли команді grepпроцесу дозволено запускати або бути живим.

Наприклад. Я хочу виконати наступне:

grep -qsRw -m1 "parameter" /var

Але перед тим, як запустити grepкоманду, я хочу обмежити, як довго триватиме grepпроцес, скажімо, не довше 30 секунд.

Як це зробити?

І якщо це можливо, як я повертаюсь або скидаю, щоб після цього не було обмежень.


3
ви цього вже не питали? stackoverflow.com/questions/3061377 / ...

Ніякого іншого питання, тому що я не отримую відповіді на

4
@yael: раніше ви отримали ідеально хороше рішення, використовуючи timeout, і навіть отримали інструкції, як його встановити. Неправильно ігнорувати цю відповідь, а потім дублювати своє запитання.
Пол R

вибачте, але НІ Я не хочу нічого встановлювати на своїй системі THX yael

5
@yael: тоді вам потрібно оновити своє первісне запитання, щоб включити це обмеження , НЕ просто дублювати питання і починати все спочатку
Пол R

Відповіді:


12

Ви можете використовувати timelimit , він доступний у ubuntu за замовчуванням, або ви можете скласти його самостійно.

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


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 відповідає рядку? yael

Я не впевнений, що існує простий спосіб зробити це. Крім того, цей підхід не працює в сценарії, де bash не має активного контролю за роботою. Можливо, вам доведеться вдатися до трохи хакерства 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, інакше ви можете її додати).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.