【问题标题】:Update a global variable in active session from a background process Rstudio Server从后台进程 Rstudio Server 更新活动会话中的全局变量
【发布时间】:2017-08-17 15:54:14
【问题描述】:

这可能比其他任何事情都更具理论性;一个解决方案将是非凡的,但任何反馈/想法都受到欢迎。

简单来说,我想知道是否可以完全从会话外部的后台进程更新 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) 开头,因此我们始终将最新的更新分配给活动的工作会话,并且它始终具有全局相同的变量名称。

现在的目标是能够从我们的外部脚本更新该环境变量,在 cron 或替代方案上运行,如有必要,可以使用任何更新的行。

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

纯粹好奇/不确定我是否正确地理解了整个想法?

谢谢!

【问题讨论】:

    标签: bash shell environment-variables rstudio rstudio-server


    【解决方案1】:

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

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

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

    【讨论】:

    • 好主意。感谢您的反馈。出于好奇,您过去是否尝试过实施类似的方法?
    猜你喜欢
    • 2013-02-27
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多