R 使用 mkdtemp() 在 TMPDIR 的子目录中创建特定于会话的临时目录,并在 R 退出时删除该目录树。调用 tempfile() 和调用 pdf() 时默认使用此目录。
我发现对于一些运行时间非常长(例如 2 天)的 Rscript 作业,特定于会话的临时目录似乎消失了。我收到由plot.new() 产生的“没有这样的文件或目录”错误,或写入使用tempfile() 创建的路径时出现的类似错误。
我在几个数据集上使用了相同的代码,但我只在最大、运行时间最长的数据集上看到这个问题。最终出现错误的同一进程能够在进程的早期创建其他 PDF,因此推测临时目录在进程生命周期的某个时刻存在。另请注意,在 PDF 情况下,问题最终会导致段错误,从而在退出时清理特定于会话的临时目录之前结束 R 进程。我从核心文件中提取了特定于会话的临时目录的名称,并确认它不存在。
知道什么是删除特定于会话的临时目录吗?
显示 R 在到达临时目录清理代码之前崩溃的段错误:
#0 0x00000037ff467934 in fwrite () from /lib64/libc.so.6
#1 0x00002ae33b8c10e2 in PDF_endpage () at devPS.c:6509
#2 0x00002ae33b8c284b in PDF_Close () at devPS.c:7257
#3 0x00002ae338dbf05e in removeDevice.part.0 ()
from /broad/software/free/Linux/redhat_6_x86_64/pkgs/r_3.3.0/lib64/R/lib/libR.so
#4 0x00002ae338dbf4c9 in Rf_KillAllDevices ()
from /broad/software/free/Linux/redhat_6_x86_64/pkgs/r_3.3.0/lib64/R/lib/libR.so
#5 0x00002ae338ee42e4 in Rstd_CleanUp ()
from /broad/software/free/Linux/redhat_6_x86_64/pkgs/r_3.3.0/lib64/R/lib/libR.so
#6 0x00002ae338e21947 in run_Rmainloop ()
from /broad/software/free/Linux/redhat_6_x86_64/pkgs/r_3.3.0/lib64/R/lib/libR.so
#7 0x00000000004007bb in main () at Rmain.c:29
根据 @kba 在 Serverfault 上的回答,针对这个问题/tmp什么时候被清除? https://serverfault.com/questions/377348/when-does-tmp-get-cleared
这取决于你的分布。在某些系统上,它仅在启动时删除,其他系统则运行 cronjobs 来删除早于n hours.
- 在类似 Debian 的系统上:启动时(规则定义在
/etc/default/rcS
).
- 在类似 RedHat 的系统上:按年龄(RHEL6)
/etc/cron.daily/tmpwatch
; RHEL7 和 RedHat 类似,其配置为 systemd/usr/lib/tmpfiles.d/tmp.conf
, 调用者systemd-tmpfiles-clean.service
).
- 在 Gentoo 上
/etc/conf.d/bootmisc
.
您可以通过更改 R 工作目录来解决此问题。在你的 ~/.Renviron 文件中,输入
TEMP=~/Rworkdir
或类似的东西。 (您可能必须使用 TMP 而不是 TEMP。)这将告诉 R 在您的主目录下创建其工作目录。替换任何适合您的路径。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)