r - PNG 图像在 linux 服务器节点上但不在头节点上时生成错误

标签 r linux server

我的最终目标是在我大学的 Linux 服务器上呈现 R Markdown 文档,该服务器使用 SLURM 进行队列管理。但是,使用 PNG 图形设备会产生错误,而 PDF 图形设备会提供不适当的输出。

请注意,我有一台 Windows 计算机,并且正在使用 PuTTY 与服务器通信。 Xming 已安装,PuTTY 已启用 X11 转发。

当我运行时

salloc --ntasks 1 --partition <partition_name>
srun Rscript -e "png('test.png'); plot(1,1); dev.off()"` 

没有保存绘图,我收到以下警告消息:

1: In png("test.png") :

unable to load shared object '/opt/exp_soft/R- 3.5.2/lib64/R/library/grDevices/libs//cairo.so': /lib64/libcairo.so.2: undefined symbol: FT_Get_Var_Design_Coordinates

2: In png("test.png") : 加载cairo DLL失败

空设备

但是,当我只删除 srun 命令并运行时

salloc --ntasks 1 --partition <partition_name>
srun Rscript -e "png('test.png'); plot(1,1); dev.off()"` 

然后保存文件test.png。此外,输出 PDF 而不是 PNG 也能正确生成绘图 (Rscript -e "pdf( 'test.pdf'); plot(1,1); dev.off()") .

同理,一开始不使用srun,使用Rscript -e "('test.Rmd')"渲染Rmd文档,会正确渲染Rmd医生。但是把 srun 放在开头不会生成 Rmd 文档,只会生成警告信息:

File test2_files/figure-html/unnamed-chunk-1-1.svg not found in resource path

Error: pandoc document conversion failed with error 99

In addition: Warning messages:

1: In grDevices::png(f) : unable to load shared object '/opt/exp_soft/R-3.5.2/lib64/R/library/grDevices/libs//cairo.so': /lib64/libcairo.so.2: undefined symbol: FT_Get_Var_Design_Coordinates

2: In grDevices::png(f) : failed to load cairo DLL

3: In (function (filename = if (onefile) "Rplots.svg" else "Rplot%03d.svg", : failed to load cairo DLL

Execution halted

srun: error: srvcnthpc100: task 0: Exited with exit code 1

如果我将 dev='pdf' 设置为 knitr block 选项,则会呈现 Rmd 文档,但 html 文档中的绘图非常奇怪,因为它有一个滚轮和一个灰色背景(dev_equals_png_rmd_output)。

我注意到上述错误消息“FT_Get_Var_Design_Coordinates”中的“ undefined symbol ”是 FreeType 库的一部分。但是,我不确定这可能意味着什么,或者如果它意味着什么我会怎么做。

我重新安装了 Cairo R 包,但这并没有改变错误消息。

由于 PNG 图像呈现在头节点上(即没有 srun)而不是在服务器节点上(即有 srun),所以在我看来RSLURM 和服务器节点之间的通信中断,而不是某些文件或程序丢失。

我还认为 pandoc 会抛出错误,因为运行 R 代码时未生成 png 图像。

请注意,当使用 sbatch 而不是 srun 时也会产生上述错误(即代码以批处理而不是交互模式运行)。

任何帮助将不胜感激!我刚开始使用 Linux,并且开始喜欢上它了!

在服务器上运行 Rscript -e "sessionInfo()" 产生:

R version 3.5.2 (2018-12-20)

Platform: x86_64-pc-linux-gnu (64-bit)

Running under: CentOS Linux 7 (Core)

Matrix products: default BLAS: /usr/lib64/libblas.so.3.4.2 LAPACK: /usr/lib64/liblapack.so.3.4.2

locale:

1 LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C

[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8

[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8

[7] LC_PAPER=en_US.UTF-8 LC_NAME=C

[9] LC_ADDRESS=C LC_TELEPHONE=C

[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages: 1 stats graphics grDevices utils datasets methods base

other attached packages: 1 rmarkdown_1.11

loaded via a namespace (and not attached): 1 compiler_3.5.2 tools_3.5.2 htmltools_0.3.6 Rcpp_1.0.0 [5] knitr_1.21 xfun_0.5 digest_0.6.18 evaluate_0.13

当我运行 Rscript -e capabilities() 时,我得到以下信息:

jpeg         png        tiff       tcltk         X11        aqua
TRUE        TRUE        TRUE        TRUE       TRUE       FALSE
http/ftp     sockets      libxml        fifo      cledit       iconv
TRUE        TRUE        TRUE        TRUE       FALSE        TRUE
NLS     profmem       cairo         ICU long.double     libcurl
TRUE       FALSE        TRUE        TRUE        TRUE        TRUE

最佳答案

所以,问题确实出在 FreeType 上。以前的 FreeType 库坏了(不确定具体是什么意思,但系统管理员是这么说的),系统管理员推出了更新和修复的 FreeType。然而,他一不小心只在头节点和他测试的服务器节点上做了这个。一旦他更新了整个集群,代码就按预期运行了。直接的 PNG 图和渲染带有图形的 Rmd 文档都工作正常。

关于r - PNG 图像在 linux 服务器节点上但不在头节点上时生成错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54987284/

相关文章:

java - 当存在多个客户端时如何向单个客户端发送消息

c# - 如何在网络流中写入一个小间隙?

linux - 文件的最后两行相同表示触发电子邮件

javascript - ReactJS 和 NodeJS 是同一个服务器吗?

r - 如何在ggplot2中的堆叠条组之间放置空间

r - 使用 phantomjs 通过 Rselenium 发送 key

r - 将列名作为参数传递给 R 语言中的函数

rstudio 的 traceback() 不再以交互方式工作

c - ECONNRESET 在发送 Linux C

linux - python 记录器,唯一的错误是写