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

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

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

libreoffice --convert-to pdf myfile.xlsx

因为我需要 LibreOffice 作为我项目的外部依赖项,所以我无法使用 shinyapps.io,因为没有直接的方法可以在那里安装 LibreOffice。因此,我启动了一个 AWS EC2 Ubuntu 实例并安装了 LibreOffice 的最新版本。当然,我还安装了 Shiny Server,这样我的应用程序就可以托管在那里。我需要指出的是,我是在 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 使用安装在服务器上的第三方软件?

同样重要的是,我使用 wonderful sys package by Jeroen Ooms 来满足我所有的命令行需求,而不是在 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

遵循 this advice 并设置 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