簡體   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