繁体   English   中英

无法通过命令行从托管在 AWS EC2 上的 Shiny 应用启动第三方软件

[英]Unable to launch third party software via command line from Shiny app hosted on AWS EC2

我正在创建一个 Shiny 应用程序,它读取 Excel 个文件,重命名它们,然后将它们转换为 PDF 个文件。 转换步骤由 LibreOffice 在命令行中执行:

libreoffice --convert-to pdf myfile.xlsx

因为我需要 LibreOffice 作为我项目的外部依赖项,所以我无法使用 shinyapps.io,因为没有直接的方法可以在那里安装 LibreOffice。 因此,我启动了一个 AWS EC2 Ubuntu 实例并安装了 LibreOffice 的最新版本。 当然,我还安装了 Shiny 服务器,所以我的应用程序可以托管在那里。 我需要指出的是,我是在 AWS EC2 实例上使用 Shiny 服务器并总体上使用 Unix 命令行的初学者。

现在,这是我的问题。 当我通过 ssh 连接到服务器并使用 LibreOffice 将一些 Excel 文件转换为 PDF 时,它工作得很好。 但是,当我尝试通过启动的 Shiny 应用程序通过命令行功能访问 LibreOffice 时,该应用程序似乎无法访问该软件。 我验证了 Shiny 是否意识到 LibreOffice 安装在服务器上:

which libreoffice

它确实如此,因为响应是

/usr/bin/libreoffice

但似乎 Shiny 出于某种原因无法使用它。 即使我尝试从 Shiny 确定 LibreOffice 的版本时也会收到错误消息

libreoffice --version

Executing 'libreoffice' failed with status 127

这意味着根据我的研究没有找到libreoffice命令。 再一次,当我在服务器上使用命令行时,一切正常。

百思不得其解,Shiny怎么知道安装了软件,却不能使用。 我什至从 Shiny 验证了libreoffice的权限

ls -l -H /usr/bin/libreoffice

并获得

-rwxr-xr-x 1 root root 6731 Mar  1 08:39 /usr/bin/libreoffice

我不是 Unix/Linux 专家,但我认为这意味着所有用户都可以访问它?

那么我的问题是:如何让 Shiny 使用安装在服务器上的第三方软件?

值得一提的是,我使用Jeroen Ooms 的精彩 sys package 来满足我所有的命令行需求,而不是在 base R 中使用system2()

预先感谢大家的帮助。

我在 Docker 容器中对此进行了测试,这可能会或可能不会导致相同的错误。 我得到的错误是一个“丢失的文件”,即使从作为root启动的 R 进程执行时也是如此。

/usr/lib/libreoffice/program/soffice.bin: error while loading shared libraries: libreglo.so: cannot open shared object file: No such file or directory

遵循此建议并设置LD_LIBRARY_PATH环境变量解决了我测试中的问题。 使用此应用程序进行测试时,我可以从 Shiny 成功运行libreoffice --version

library(shiny)

Sys.setenv(
  LD_LIBRARY_PATH = "/usr/lib/libreoffice/program:$LD_LIBRARY_PATH"
)

ui <- fluidPage(
  textInput("command", "Enter a command"),
  submitButton("Submit"),
  verbatimTextOutput("output"),
)

server <- function(input, output, session) {
  output$output <- renderPrint({
    system(input$command, intern = TRUE)
  })
}

shinyApp(ui, server, options = list(host = "0.0.0.0", port = 8080))

而且,为了完整起见,我测试了Dockerfile

FROM rocker/shiny

RUN apt-get update && apt-get install -y \
  libreoffice-common

COPY . .

CMD ["Rscript", "app.R"]

并命令运行图像:

docker run --user shiny --rm -it -p 8080:8080 shiny-libre

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM