Цикл: запустить программу и убить после истечения времени ожидания

2397
math

по причинам отладки я хочу обнаружить одну из тех ошибок, появляющихся только изредка. Поэтому я хочу, чтобы код цикла в оболочке

  • запуск программы (если это будет segfault => это то, что я хочу)
  • убить программу после определенного времени ожидания (например, несколько секунд)

Проблема здесь в том, что PID изменится. Можете ли вы дать мне подсказку, как это сделать? Я использую zsh, но другие оболочки тоже приветствуются!

3

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

4
Ole Tange

Тайм-аут звучит как то, что вы ищете.

man timeout timeout - run a command with a time limit 
1
hotei

Некоторое время этого не делали, но основная идея - заставить работающую оболочку отправить свой PID в именованный файл, прежде чем он начнет зацикливаться, а затем прочитать этот файл обратно с помощью отдельной программы-убийцы, на которой установлен таймер. Это не "сложно", но дьявол в деталях ...

1
Rich Homolka

Попробуйте скрипт bash здесь:

http://www.cyberciti.biz/faq/shell-scripting-run-command-under-alarmclock/

Он порождает сторожевой процесс, который знает PID подкоманды для запуска. Предостережение: в этом сценарии команда kill должна быть непосредственным потомком сценария.

0
math
#/usr/bin/env zsh for i in `seq 1 10`; do echo "start sleep"; sleep 30& LAST_CHILD=$! echo "PID\$!: "$LAST_CHILD; echo "wait for kill:" sleep 1 && kill -9 $LAST_CHILD; done 

должен работать и с bash, но мне все еще нужно некоторое определение segfault, поэтому цикл прерывается.

Нет необходимости использовать `seq`. Dennis Williamson 13 лет назад 0
@Dennis: я знаю, что это всего лишь пример, на практике я бы использовал цикл while ((true)). math 13 лет назад 0
Нет, я имел в виду `для меня в `. Dennis Williamson 13 лет назад 1

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