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


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.