2013-03-02 3 views
4

Я предоставляю своим пользователям гибкий способ преобразования данных с использованием JavaScript, выполняемых с помощью Node.js на стороне сервера. С этой конструкцией, есть 3 проблемы, рассмотреть следующие вопросы:Как установить максимальное время выполнения скрипта с node.js?

  • безопасности: Я решил проблему безопасности с помощью sandbox, чтобы избежать использования собственных библиотек Node.js.

  • Ресурсы: мы можем легко установить максимальное использование памяти, используя опцию v8 --max_executable_size. Что касается использования ЦП, я посмотрю, как управлять им с помощью cpulimit или renice, теперь это не имеет значения.

  • Время: мне нужно ограничить время выполнения моих скриптов, чтобы они не работали как зомби-зомби. И здесь я застреваю.

Я пытался что-то вроде:

node -e ' 
    setTimeout(function() { 
     console.log("timeout"); 
     process.exit; 
    }, 5000); 
    console.log("begin"); 
    while (1); 
' 

Но этот код отображается только «начать», кажется, что мой тайм-аут не вызываются. Любая идея?

+0

Это ваши скрипты? Или вы пытаетесь ограничить выполнение произвольного кода? Вы пытаетесь установить лимит времени для всего приложения? Или кусок кода внутри? – Brad

+0

Я хочу ограничить выполнение фрагмента кода внутри. –

+1

ваш "while (1);" блокирует выполнение, удаляет его, и вы увидите как начало, так и тайм-аут. –

ответ

3

К сожалению, если ваши пользователи могут инициировать операции блокировки (например, while(1)), невозможно установить Node для выхода через определенное время, так как операция блокировки предотвратит обход обработчика setTimeout. Либо убедитесь, что инициированные пользователем файлы не будут блокировать основной цикл, или (и это очень плохой ) используют какой-то внешний авто-kill/timeout для уничтожения процесса узла.

В принципе, вы можете использовать Node, чтобы ограничить время выполнения неблокирующим кодом, но вся точка узла - это то, что блокирующий код блокирует все. Если ваши пользователи действительно могут запускать произвольный код, я бы рассмотрел возможность запуска вашего диспетчера процессов/тайм-аута на более высоком уровне: например, процессы нереста с тайм-аутами kill с использованием средства exec узла Node.

+0

А, ну, в таком случае, я буду использовать 'timeout 5s' непосредственно перед командой' node', это тоже убьет мой процесс. Спасибо, в любом случае. –

+0

Если вы идете по этому маршруту, убедитесь, что независимо от того, что делает ваш процесс Node, это то, что a) не нарушает работу, если оно прерывается в середине операции, и b) не оставит неиспользуемые ресурсы в вашей системе (это происходит, когда некоторые программы отправляются 'kill -9'). –

+0

На самом деле, [песочница, которую я использую] (http://gf3.github.com/sandbox/) делает то, о чем вы говорите (я вижу несколько execs и sigkills после таймаута, управляемый родительским процессом). Не видел его первым, потому что все примеры используют значения по умолчанию ... Ничего. –

7

Возможно, вам стоит взглянуть на tripwire (https://github.com/tjanczuk/tripwire). Это модуль, который может убивать скрипты сценариев убегающего узла, и вы можете установить тайм-аут. Это модуль родных узлов, поэтому это одно дело, но оно работает на Mac, Windows и Linux.

+0

Мой вопрос немного устарел, но ваш ответ выглядит очень интересным. –

+0

@AlainTiemblo lol Я вижу это сейчас. Это было передано мне от кого-то из моей команды, который только что нашел это. Он будет теперь для тех, кто ищет. : p –

+1

Да, вот почему значок «Некромант» существует :-) Некоторые свежие ответы лучше подходят для старых вопросов. Спасибо, что поделился. –

Смежные вопросы