У меня есть сценарий R, использующий Rserve для предоставления его в качестве конечной точки API / HTTP.У меня есть пара файлов в настройке.Runner.R
source("funcs5.R")
startWebListener("Test.R", 8081)
И funcs.R
library(plumber)
library(jsonlite)
library(httr)
library(Rserve)
server.headers <<- list("none", "offline")
# Expose any annotated functions within the specified file as a REST API on the specified port
startWebListener <- function(modelName, httpPort) {
custom_json <- function() {
function(val, req, res, errorHandler) {
tryCatch({
json <- jsonlite::toJSON(
val,
auto_unbox = TRUE,
pretty = FALSE,
digits = 15
)
# Reformat empty values for ROME
json <- gsub("\"NaN\"", "null", json)
json <- gsub("\"N/A\"", "null", json)
res$setHeader("Content-Type", "application/json")
res$body <- json
return(res$toResponse())
}, error = function(e) {
errorHandler(req, res, e)
})
}
}
addSerializer("custom_json", custom_json)
# r <- plumb(modelName)
# r$run(host = "0.0.0.0", port = httpPort)
Rserve(debug = FALSE, httpPort, args="--no-save")
}
Примечание. Ранее использовался сантехник, и из-за проблем с производительностью я пытаюсь перейти на Rserve.
Test.R содержит программную логику, которая не связана с моей проблемой.Когда я запускаю эту настройку в PM2, как
pm2 -f start --interpreter="Rscript" Runner.R
Процесс запускается, а затем переходит в состояние ошибки.Когда я просматриваю журнал процесса, я вижу, что это повторяется примерно 15 раз (что, я думаю, означает количество попыток запуска службы)
190|SC | Loading required package: methods
190|SC | Starting Rserve on port
190|SC | 8081 :
190|SC | /usr/lib64/R/bin/R CMD /home/tonyan/Rserve/libs//Rserve --no-save --RS-port 8081
190|SC | R version 3.4.1 (2017-06-30) -- "Single Candle"
190|SC | Copyright (C) 2017 The R Foundation for Statistical Computing
190|SC | Platform: x86_64-redhat-linux-gnu (64-bit)
190|SC | R is free software and comes with ABSOLUTELY NO WARRANTY.
190|SC | You are welcome to redistribute it under certain conditions.
190|SC | Type 'license()' or 'licence()' for distribution details.
190|SC | Natural language support but running in an English locale
190|SC | R is a collaborative project with many contributors.
190|SC | Type 'contributors()' for more information and
190|SC | 'citation()' on how to cite R or R packages in publications.
190|SC | Type 'demo()' for some demos, 'help()' for on-line help, or
190|SC | 'help.start()' for an HTML browser interface to help.
190|SC | Type 'q()' to quit R.
190|SC | ##> SOCK_ERROR: bind error #98(address already in use)
190|SC | Rserv started in daemon mode.
Я смотрел на процессы, запущенные надо того, как я запустил свой сценарий (с помощью "sudo netstat -lanp"), и на порту 8081 не было ни одного. После того, как я запустил свой процесс, существует процесс Rserve, работающий на 127.0.0.1:8081.
Итак, что не так с моим кодом или настройкой, которая может вызвать эту ошибку?
Спасибо!