2011-12-23 2 views
14

У меня есть JS-файл, который выполняется через node.js, поэтому обычно я запускаю окно терминала и набираю что-то вроде node myfile.js, и он работает и работает весь день; весело.trigger node js file

Тогда, когда я хочу перезагрузить его, я нажму кнопку control-c, и он уйдет. Затем я могу снова запустить команду.

Теперь то, что я хотел бы сделать, это сделать это через веб-страницу, чтобы мои пользователи могли запускать определенные JS-файлы, а также иметь возможность «перезагрузить» их.

Так два вопроса по этому поводу:

  1. Возможно ли, и если да, то как я могу начать?
  2. Безопасно ли, и если нет, может ли оно быть безопасным?

основе swatkins отклика

я попытался это и не получил ничего

$output = exec("node -v"); 
echo $output; 

тогда я пытался на моей локальной машине, и она работала хорошо, что дает?

также я до сих пор не уверен в безопасности и способности, чтобы остановить запущенную скрипт

+0

Нет, '$ output' должен передаваться как второй параметр функции exec:' exec ("node -v", $ output); print_r ($ output); ' – swatkins

ответ

16

Предполагая, что вы находитесь на Unix на базе ОС:

Вы можете запускать команды оболочки через Exec() функция:

// in php file 
// to start the script 
exec("node myscript.js &", $output); 

$output становится массивом каждой строки вывода, так что вы можете увидеть, что идентификатор процесса является. Затем вы должны использовать этот идентификатор процесса, чтобы убить скрипт:

exec("kill " . $processid); 
+0

и как я остановил бы этот сценарий? и безопасно ли это работать? также как узнать, работает ли он? – mcgrailm

+0

обновил мой ответ - вам нужно получить идентификатор процесса, поэтому, запустив mysys.js в фоновом режиме (добавив команду '&' к команде), вы получите идентификатор процесса в выходном массиве. Вам, вероятно, потребуется выполнить некоторые манипуляции с строкой, чтобы получить фактический идентификатор, но тогда вы просто используете это, чтобы убить процесс. – swatkins

+0

это определенно запускает скрипт, но не дает мне никакого вывода, пока я не убью процесс, а затем он даст мне данные, которые записываются в console.log() – mcgrailm

2

Я бы избегал прямого взаимодействия с оболочкой. Это, вероятно, будет самым безопасным, чтобы решить это так:

  • реализовать некоторый общий «сервис» -script, который запускает пользовательский узел-приложение и держит это работает (что-то вроде https://github.com/isaacs/node-supervisor)
  • Сделать это , поэтому он автоматически перезагружается при изменениях либо соответствующих файлов, либо записи базы данных.
  • Когда пользователь запускает перезагрузку, добавьте флаг (временную метку?) в запись базы данных или файл, который просматривается сценарием перезагрузки. Затем он перезагрузит node.js-app/script.
+3

Почему у вас нет взаимодействия с оболочкой? Что случилось с принятым ответом? –