Невозможно разработать API с помощью RestRserve на удаленном сервере

Учтите, что я создал свое приложение, как в приведенном ниже примере:

library(RestRserve)
app = Application$new()
app$add_get(
  path = "/hello", 
  FUN = function(request, response) {
    response$set_body("Hello from RestRserve")
  })
backend = BackendRserve$new()
backend$start(app, http_port = 8080)

С последней командой Rserve просыпается и правильно слушает и отвечает на запрос на порту 8080. Теперь я хотел бы поместить приведенные выше команды в скрипт на удаленном сервере, запустить его с помощью Rscript и заставить его слушать вечно. Однако, как только я отключаюсь от ssh, он перестает работать. Я делаю что-то неправильно? Обратите внимание, что я установил только RestRserve, Rserve является зависимостью, но я ничего не менял и не настраивал какой-либо файл конфигурации.


person Fabio    schedule 24.07.2020    source источник


Ответы (2)


Глядя на исходный код, я бы предложил добавить именованный параметр background=TRUE в backend$start(app, http_port = 8080). По умолчанию этот параметр равен FALSE (строка 36). , когда TRUE Rserve будет запущен в новой отсоединенной R-сессии (строка 93). (Кстати, опустив указанный параметр, вы можете проверить, что отключение убивает ваш запущенный R-сеанс, оставив второе SSH-соединение открытым и перечислив запущенные процессы с фильтром: ps aux | grep bin/exec/R до и после отключения)

Если использование указанного параметра работает, вы также можете изучить перезапуски сервера. Судя по всему, я бы сказал, что RestRserve не может справиться с этим сам по себе, и вам может понадобиться небольшой служебный скрипт.

person karo    schedule 29.07.2020
comment
Спасибо за ваше объяснение. Я добавил background = TRUE. Однако это не работает. PID приложения — 449147, но когда я проверяю ps aux | grep R, процесс не существует. Может быть, это связано с RServe? Я просто установил его как зависимости RestRserve, не настраивая его. - person Fabio; 31.07.2020
comment
У меня не было немедленного доступа к достаточно свежей Linux/R, чтобы протестировать ее самостоятельно, рад, что вы смогли разобраться. - person karo; 31.07.2020

Я решил с помощью rexy.ai и karo: правильный скрипт использует backend$start(app, http_port = 8080) (без фоновой опции), но развертывание выполняется с использованием nohup Rscript app.R &. Это позволит приложению работать удаленно и принимать запросы!

person Fabio    schedule 31.07.2020