2015-12-11 5 views
0

У меня есть 3 машины (более реально, но 3 для целей этого вопроса) в сети, 2 рабочих станциях и сервере. На сервере размещается приложение Rails, которое посещает пользователи на рабочей станции A, что позволяет им просматривать и анализировать данные из базы данных сервера. У меня также есть сценарий Ruby на рабочей станции B, который генерирует данные и хранилища в базе данных на сервер. Я хочу, чтобы у приложения Rails появилась функция запуска этого сценария Ruby на рабочей станции B, когда пользователь из A щелкнет определенную кнопку на странице приложения Rails, чтобы 1. максимально возможная часть моей системы содержалась в приложении и 2. Я могу избежать необходимости подключаться через удаленный рабочий стол или, что еще хуже, физически переходить на рабочую станцию ​​B.удаленно запускает рубиновый скрипт через веб-страницу

Я действительно не знаю, как подойти к этому даже на базовом уровне; Я использовал PSExec в прошлом для удаленного запуска процессов, но я не знаю, будет ли этот инструмент жизнеспособным для этого приложения. Если я не могу представить, как использовать его для этой цели. Может кто-нибудь указать мне в правильном направлении?

+0

- это серверные окна? Можете ли вы запустить демон/слушателя на рабочей станции b? вы посмотрели на DRB (http://docs.ruby-lang.org/en/2.2.0/DRb.html) – Doon

+0

это окна. возможно, я неправильно читаю, но похоже, что DRB разрешил мне запускать процессы на сервере, а не удаленно на другой машине, используя сервер в качестве посредника. Я ошибаюсь? –

+0

да, Drb распределен рубин. вы можете запустить процесс на рабочей станции b, а затем сервер подключается к этому процессу и может выполнять вызовы объектов и т. д. --- dRuby позволяет обрабатывать методы в одном процессе Ruby на объект Ruby, расположенный в другом Ruby-процессе, даже на другом машина. просто нужно tcp-соединение между обоими. – Doon

ответ

1

Существует множество способов запуска подпроцесса из рубина - system, exec, backticks, open3. Они все немного отличаются в зависимости от того, как вы хотите с ним взаимодействовать точно: this answer to a similar question contains a handy flowchart. Я не уверен, что лучше всего работает на какой версии Windows с какой версией Ruby; вы должны искать каждый из этих вариантов и свои версии, чтобы узнать.

В действии контроллера в вашем рельсах приложение, вы можете позвонить по одному из них, чтобы выполнить свой рубиновый скрипт, например:

require 'open3' 

class WhateverController < ActionController 
    def start 
    Open3.popen3('ruby your_script.rb') {|stdin, stdout, stderr, wait_thr| 
     # do whatever you need to with the output streams here 
    } 
    render nothing: true # So that the request returns to the user who pushed the button 
    end 
end 

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

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