从后台进程 Rstudio Server 更新活动会话中的全局变量
Update a global variable in active session from a background process Rstudio Server
这可能比其他任何东西都更具有理论意义;一个解决方案将是非凡的,但任何 feedback/ideas 都同样受欢迎。
简单来说,我想知道是否有可能在 rstudio-server 上的活动会话中完全从会话之外的后台进程更新环境变量。
例如,假设:
- 我们有一个脚本,每分钟 运行 作为一项
cron
作业,它轮询一系列网站并将某些元素解析为 data.frame
- 我们的函数首先读取最初创建的
data.frame
,如果它检测到我们正在轮询的网站发生变化,它会附加一个带有时间戳的新行,然后保存 data.frame
回到rds
文件;如果它没有发现任何差异,它就会退出。
- 在我们的
.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 文件;例如,您可以将校验和与文件一起写入,然后检查校验和是否不同。
这可能比其他任何东西都更具有理论意义;一个解决方案将是非凡的,但任何 feedback/ideas 都同样受欢迎。
简单来说,我想知道是否有可能在 rstudio-server 上的活动会话中完全从会话之外的后台进程更新环境变量。
例如,假设:
- 我们有一个脚本,每分钟 运行 作为一项
cron
作业,它轮询一系列网站并将某些元素解析为data.frame
- 我们的函数首先读取最初创建的
data.frame
,如果它检测到我们正在轮询的网站发生变化,它会附加一个带有时间戳的新行,然后保存data.frame
回到rds
文件;如果它没有发现任何差异,它就会退出。 - 在我们的
.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 文件;例如,您可以将校验和与文件一起写入,然后检查校验和是否不同。