Как к ограничительному времени прогоны программы в Linux?

Я использовал бы initramfs. (http://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt)

Много дистрибутивов Linux используют initramfs (чтобы не быть перепутанным с initrd, они отличаются) во время процесса начальной загрузки, главным образом чтобы смочь запустить программы пространства пользователя очень рано в процессе начальной загрузки. Однако можно использовать его для того, что Вы хотите.

Преимущество initramfs по initrd - то, что initramfs использует tmpfs файловую систему, в то время как initrd использует блочное устройство поршня. Основное отличие здесь - то, что для initrd, необходимо предварительно выделить все пространство для файловой системы, даже если Вы не собираетесь использовать все то пространство. Таким образом, если Вы не используете пространство файловой системы, Вы тратите впустую поршень, который на встроенном устройстве, часто дефицитный ресурс. Tmpfs является файловой системой, которая разряжает поршень, но только использует столько поршня, сколько используется в настоящее время в файловой системе. Таким образом, если Вы удаляете файл из tmpfs, тот поршень сразу освобожден.

Теперь обычно initramfs является временным, только используемый для запущения некоторых программ чрезвычайно рано в процессе начальной загрузки. После тех запущенных программ управление передается в реальную файловую систему, работающую на физическом диске. Однако Вы не должны делать этого. Нет ничего мешающего Вам исчерпать initramfs неограниченно долго.

10
07.05.2013, 02:04
4 ответа

Потенциальное решение № 1

Используйте timeout команда:

$ date
Mon May  6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May  6 07:35:14 EDT 2013

Можно поместить защиту в timeout управляйте также к kill процесс, если это не остановилось после некоторого промежутка времени также.

$ date
Mon May  6 07:40:40 EDT 2013
$ timeout -k 20 5 sleep 100
$ date
Mon May  6 07:40:48 EDT 2013

Это дождется к 20 секундам после процесса sleep 100 должен был остановиться, если это все еще работает, затем timeout отправит ему a kill сигнал.

Потенциальное решение № 2

Альтернативный путь, хотя более рискованный метод был бы следующие:

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

Найденный этой техникой на Переполнении стека в названном вопросе: Ограничение времени прогоны программы в Linux. Конкретно этот ответ.

Примечание: На комментарий, оставленный @mattdm, вышеупомянутый метод может быть опасным, учитывая его, делает предположение, что не было никаких новых процессов, запущенных начиная с Вашего процесса. Таким образом, никакие новые PIDs не были присвоены. Учитывая это, этот подход не должен, вероятно, использоваться, но здесь только как ссылка для общего подхода к проблеме. timeout метод является более оптимальным вариантом 2.

14
27.01.2020, 20:00
  • 1
    Но затем это будет гарантироваться, что сценарий будет всегда занимать все то время. В моем случае это не 1 секунда, а скорее 15 минут. –  Adam Ryczkowski 06.05.2013, 14:27
  • 2
    Но другое решение, найденное в том вопросе, должно быть точно, в чем я нуждаюсь.Спасибо! –  Adam Ryczkowski 06.05.2013, 14:27
  • 3
    Предположим myProgram концы за меньшее время, чем sleep (не неблагоразумное предположение, так как цель состоит в том, чтобы установить максимальное позволенное время выполнения). Вы затем отправляете сигналу любого в несуществующий PID (никакой реальный причиненный вред) или к любому вероятностному процессу в (потенциально фатальной) системе. –  a CVn 06.05.2013, 14:36
  • 4
    @MichaelKjörling, спасибо за feeback. Я обновил свой ответ на тот же комментарий что OP, оставленный также. Похож timeout команда делает точно, что он ищет, ожидая OP для ответа на мои комментарии. –  slm♦ 06.05.2013, 14:38
  • 5
    @slm timeout должно быть решение, в котором я нуждаюсь. Я тестирую его в данный момент, –  Adam Ryczkowski 06.05.2013, 14:38

Я нашел что-то немного лучше, чем timeout: timelimit.

Это имеет несколько преимуществ; каждый - тот пользователь, может вручную прервать выполнение путем нажатия "Ctrl+C".

timelimit программа доступна в репозитории Debian.

4
27.01.2020, 20:00
  • 1
    Попытка понять различия черно-белый timelimit и тайм-аут. тайм-аут может быть остановлен с Ctrl+C. Каковы другие преимущества? –  slm♦ 06.05.2013, 22:02
  • 2
    Ну, мой тайм-аут не может. Я использую Монетный двор 14 (на основе Ubuntu Quantal). –  Adam Ryczkowski 06.05.2013, 22:28

Можно настроить процессорное время и другие вещи с ulimit, в течение процессорного времени особенно:

$ ulimit -t 60      # limit to 60 seconds
$ program
3
27.01.2020, 20:00

Bash использует переменную под названием $ BashPid , его можно использовать в такой ситуации, например:

#!/bin/bash
do_face() {
    local parent=$1
    echo $BASHPID > pid
    sleep 10
    echo "Killing parent $parent"
    kill $parent
}

ME=$BASHPID
eval $(echo "do_face $ME &")
sleep 20 && kill $(cat pid) && echo "killed child $(cat pid)"
exit 1

Вы можете изменить аргумент в вызове Сон в do_face () на 100 вместо 10 и посмотрите, что происходит, когда ребенок занимает слишком много времени, чтобы сделать свои дела. Просто измените звонок, чтобы спать в do_face () к вызову вашего исполняемого исполняемого и если это займет слишком долго, то скрипт убьет его, 20 секунды - это предельное значение в этом примере Отказ Параметры могут быть реализованы таким образом, чтобы это становится простой сценарием для вызова и может быть вызван другим скриптом в партии или что-то еще. Обработка файлов PID для каждого параллельного процесса - это проблема, которая должна быть обработана, возможно, использовать разные подразделения ...

NB: на GNU Linux Сон может принимать аргументы с плавающей точкой, такие как Сон 0,1 спать на десятую секунду.

0
27.01.2020, 20:00

Теги

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