Как ограничить разрешенное время для запуска сценария как подпроцесса в сценарии ksh

Я пытаюсь ограничить разрешенный подпроцесс в сценарии ksh. Я пытаюсь использовать ulimit (жесткие или мягкие значения), но подпроцесс всегда нарушает лимит (если занимает больше времени, чем разрешено).

# value for a test
Sc_Timeout=2
Sc_FileOutRun=MyScript.log.Running
Sc_Cmd=./AScriptToRunInSubShell.sh

(
 ulimit -Ht ${Sc_Timeout}
 ulimit -St ${Sc_Timeout}

 time (
  ${Sc_Cmd} >> ${Sc_FileOutRun} 2>&1
  )  >> ${Sc_FileOutRun} 2>&1

  # some other command not relevant for this
 )

результат:

1> ./MyScript.log.Running
ulimit -Ht 2
ulimit -St 2
1>> ./MyScript.log.Running 2>& 1

real    0m11.45s
user    0m3.33s
sys     0m4.12s

Я ожидаю ошибку тайм-аута с системным или пользовательским временем, например, 0m2.00s

Когда я делаю тест непосредственно из командной строки, ulimit Hard, похоже, эффективно ограничивает время, но не в сценарии.

Система тестирования/разработки - это AIX 6.1, но также должна работать и другая версия, а также на солнце и Linux.


person NeronLeVelu    schedule 06.11.2013    source источник


Ответы (1)


Каждый процесс имеет свои ограничения по времени, но time показывает совокупное время выполнения скрипта. Каждый раз, когда вы создаете дочерний процесс, этот дочерний процесс будет иметь свои собственные ограничения. Так, например, если вы вызываете cut и grep в сценарии, то эти процессы используют свое собственное процессорное время, квота не уменьшается по сравнению со сценарием, хотя сами ограничения наследуются.

Если вам нужен срок, вы можете исследовать trap ALRM.

person cdarke    schedule 06.11.2013
comment
танки для информации. Я думал, что время было отведено для следующего процесса (поэтому использование подоболочки). Я заменяю ulimit на улов идентификатора процесса (запущенного в фоновом режиме) с помощью сторожевого таймера сна / уничтожения. - person NeronLeVelu; 06.11.2013