В Linux я хотел бы запустить программу, но только в течение ограниченного времени, например, 1 секунду. Если программа превышает это время выполнения, я хотел бы убить процесс и показать сообщение об ошибке.
Ограничение времени запуска программы в Linux
Ответ 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 ...>
в оболочке.