从后台进程 Rstudio Server 更新活动会话中的全局变量

Update a global variable in active session from a background process Rstudio Server

这可能比其他任何东西都更具有理论意义;一个解决方案将是非凡的,但任何 feedback/ideas 都同样受欢迎。

简单来说,我想知道是否有可能在 rstudio-server 上的活动会话中完全从会话之外的后台进程更新环境变量。

例如,假设:

  1. 我们有一个脚本,每分钟 运行 作为一项 cron 作业,它轮询一系列网站并将某些元素解析为 data.frame
  2. 我们的函数首先读取最初创建的 data.frame,如果它检测到我们正在轮询的网站发生变化,它会附加一个带有时间戳的新行,然后保存 data.frame回到rds文件;如果它没有发现任何差异,它就会退出。
  3. 在我们的 .First 函数中,每个会话都以 assign('.url_df', readRDS('/home/user/url_checkr.rds'), envir = .GlobalEnv) 开头,因此我们始终将最新更新分配到活动工作会话中,并且它始终具有相同的全局变量名。

现在的目标是能够从我们的外部脚本更新该环境变量,运行ning on cron 或替代,必要时使用任何更新的行。

我知道如何使用 echo msg > /proc/$pid/fd/0 在终端之间发送消息,并且知道我们可以在我们的 INITIAL 函数中使用 system('ps', intern=TRUE) 来检查任何活动会话并获取它们的 pid。问题是 如何 we/is 可能 使用这种方法在活动会话的后台使用任何更新的字段实际更新 .Global 变量?从那里不难制定将消息发送到控制台等的方法。

纯粹是好奇/不确定我是否正确地围绕着整个想法?

谢谢!

我认为最直接的方法是使用 R 的 addTaskCallback function

此函数有效地允许您在每次顶级 R 任务完成时(即在控制台中执行的每个 R 表达式之后)运行 编写代码。您可以建立一个任务回调,它可以有效地完成您在 .First 中正在做的事情(即,如有必要,更新全局变量)。有了回调,当用户继续执行 R 代码时,全局变量将在后台自动更新。

根据数据的大小,您可能需要添加一些保护措施,以免每次都从磁盘读取整个 RDS 文件;例如,您可以将校验和与文件一起写入,然后检查校验和是否不同。