Подтвердить что ты не робот

Ограничение времени запуска программы в Linux

В Linux я хотел бы запустить программу, но только в течение ограниченного времени, например, 1 секунду. Если программа превышает это время выполнения, я хотел бы убить процесс и показать сообщение об ошибке.

4b9b3361

Ответ 1

StackOverflow не позволит мне удалить мой ответ, так как он принят. Он собирает пустые голоса, так как он находится в верхней части списка с лучшим решением ниже. Если вы используете систему GNU, используйте timeout вместо этого, как было предложено @wRAR. Поэтому в надежде, что вы прекратите голосование, вот как это работает:

timeout 1s ./myProgram 

Вы можете использовать s, m, h или d в течение нескольких секунд (по умолчанию, если они опущены), минут, часов или дней. Отличная особенность здесь заключается в том, что вы можете указать другую опцию -k 30s (до 1s выше), чтобы убить ее с помощью SIGKILL через 30 секунд, если она не отвечает на исходный SIGTERM.

Очень полезный инструмент. Теперь прокрутите вниз и выберите голосование @wRAR.


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

Простой bash - script должен сделать это для вас

./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn't finish"

Это должно сделать это.

$! расширяется до последнего фонового процесса (с помощью &), а kill возвращает false, если он не убивает какой-либо процесс, поэтому эхо выполняется только в том случае, если оно фактически что-то убило.

2>/dev/null перенаправляет kill stderr, иначе он будет печатать что-то, говорящее вам, что он не смог убить процесс.

Вам может понадобиться добавить -KILL или любой сигнал, который вы хотите использовать, чтобы избавиться от вашего процесса.

ИЗМЕНИТЬ
Как показала эфемер, здесь есть гонка, если ваша программа заканчивается, а другой процесс захватывает pid, вместо этого он будет убит. Чтобы уменьшить вероятность этого, вы можете реагировать на SIGCHLD и не пытаться убить его, если это произойдет. Там все еще есть шанс убить неправильный процесс, но он очень удален.

trapped=""
trap 'trapped=yes' SIGCHLD
./myProgram &
sleep 1
[ -z "$trapped" ] && kill $! 2>/dev/null && echo '...'

Ответ 2

Хорошо. timeout(1).

ОПИСАНИЕ
      Запустите COMMAND и убейте его, если он еще работает после DURATION.

Ответ 3

Возможно ли ограничение времени процессора (ulimit -t/setrlimit(RLIMIT_CPU))?

Ответ 4

вы можете запустить его в оболочке script с помощью &

your_program &
pid=$!
sleep 1
if [ `pgrep $pid` ]
  then
    kill $pid
    echo "killed $pid because it took too long."
fi

надеюсь, что вы получите эту идею, я не уверен, что это правильно, мои навыки оболочки требуют некоторого обновления:)

Ответ 5

Итак, просто напишите короткую программу на C, которая fork s, вызывает execlp или что-то подобное в дочернем, измеряет время в родительском и kill дочернем. Должно быть легко...

Ответ 6

tail -f file & pid=$!
sleep 10
kill $pid 2>/dev/null && echo '...'

Ответ 7

Если у вас есть источники, вы можете fork() в начале main(), а затем родительский процесс измеряет время и, возможно, убивает дочерний процесс. Просто используйте стандартные системные вызовы fork(), waitpid(), kill(),... возможно, некоторые стандартные обработки сигналов Unix. Не слишком сложно, но требует определенных усилий.

Вы также можете script что-то на оболочке, хотя я сомневаюсь, что он будет таким же точным относительно времени в 1 секунду.

Если вы хотите просто измерить время, введите time <cmd ...> в оболочке.