как ограничить время работы процесса с помощью ulimit?

Я пытаюсь использовать ulimit, функцию оболочки bash, чтобы ограничить время, в течение которого программа может работать. Например, я пробовал это:

 $   ( ulimit -t 1; ./a.out ) 

Но это не работает. он позволяет программе ./a.out работать до тех пор, пока она не остановится (5 секунд). Кто-нибудь знает, как это сделать? Кстати, я экспериментировал с включением -H в командную строку ulimit, но это просто выдает эту ошибку:

bash: ulimit: cpu time: cannot modify limit: Operation not permitted

Спасибо.


person user2839463    schedule 02.10.2013    source источник
comment
Существует разница между процессорным временем (которое вы указываете с помощью ulimit -t) и фактическим временем выполнения. Вы можете увидеть, сколько процессорного времени использовала ваша программа, запустив time ./a.out. time сообщает реальное прошедшее время, время ЦП пользователя и время ЦП системы.   -  person ThisSuitIsBlackNot    schedule 02.10.2013
comment
Меня интересует процессорное время. Можете ли вы пролить свет на то, как сделать то, что я хочу?   -  person user2839463    schedule 02.10.2013
comment
Вы пытались ( ulimit -t 1; time ./a.out ) убедиться, что ваша программа действительно превышает одну секунду процессорного времени?   -  person ThisSuitIsBlackNot    schedule 02.10.2013
comment
да, результат time ./a.out составляет более 5 секунд пользовательского времени и реального времени.   -  person user2839463    schedule 02.10.2013


Ответы (1)


ulimit не может ограничивать время выполнения программы, только время процессора. Если у вас есть GNU Coreutils, вы можете использовать timeout вместо этого:

timeout 1s ./a.out

Это kill остановит вашу программу через одну секунду. Вы можете указать сигнал для отправки, используя -s или --signal, например.

timeout --signal=HUP 1s ./a.out
person ThisSuitIsBlackNot    schedule 02.10.2013
comment
У меня нет функции тайм-аута. Кстати, то, что я сделал выше, работает на моей машине с Ubuntu с более новой операционной системой. Так что я на правильном пути, и я думаю, что то, что я делаю, должно работать. У меня система 2.6.28.4-002-STD64 - person user2839463; 02.10.2013
comment
Хорошо, в этом ядре есть ошибка. Я нашел эту ссылку. Он указывает, что то, что я хочу сделать, не работает в версии 2.6.28. - person user2839463; 02.10.2013
comment
@user2839463 user2839463 Пожалуйста, опубликуйте это как отдельный ответ, чтобы людям, которые попадут на эту страницу в будущем, было легче ее найти. - person ThisSuitIsBlackNot; 02.10.2013