3

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

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

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

4 ответа4

4

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

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

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

1

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

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

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

0
#/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, поэтому цикл прерывается.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .