2017-08-17 5 views
0

これは他の何よりも理論的かもしれません。解決策は目覚しいものですが、どんなフィードバック/アイデアも歓迎されます。アクティブセッションのグローバル変数をバックグラウンドプロセスから更新するRstudio Server

簡単に言えば、セッション外のバックグラウンドプロセスから、rstudio-server上のアクティブなセッションの環境変数を更新できるかどうかは疑問です。

たとえば、のは言わせて:

  1. 私たちは、ウェブサイトの世論調査シリーズcronジョブとして毎分を実行して、data.frame
  2. 私たちの関数に特定の要素を解析しているスクリプトが最初で読み込み、持っていますdata.frameが最初に作成され、ポーリングしているウェブサイトの変更を検出した場合は、タイムスタンプ付きの新しい行が追加され、data.framerdsファイルに保存されます。差異が見つからない場合は、単に終了します。
  3. .Firstの機能では、すべてのセッションはassign('.url_df', readRDS('/home/user/url_checkr.rds'), envir = .GlobalEnv)で始まり、常に最新の更新がアクティブな作業セッションに割り当てられ、常に同じ変数名がグローバルに割り当てられます。

これで、必要に応じて更新された行を使用して、cronまたはalternativeで実行される外部スクリプトから環境変数を更新できるようになりました。

私はそれがecho msg > /proc/$pid/fd/0を使用して端末間でメッセージを送信することが可能です方法を知っていると我々はすべてのアクティブなセッションを確認し、そのpidを得るために私達の初期関数でsystem('ps', intern=TRUE)を使用することができます知っています。質問はですは、どのようにしてこのアプローチを使用して、更新されたフィールドとのアクティブセッションのバックグラウンドでその.Global変数を実際に更新することができますか?そこから、コンソールなどにメッセージを送信する方法を策定するのは難しくありません。

私の頭を全体のアイデアのまわりで正しく包み込んでいるかどうかはまったく不思議です。

ありがとうございます!

答えて

1

これを行う最も簡単な方法は、RのaddTaskCallback functionを使用することです。

この機能は、トップレベルのRタスクが完了するたびに(つまり、コンソールで実行されるすべてのR式の後に)コードを実行することを効果的に許可します。 .Firstであなたがやっていることを効果的に行うタスクコールバックを確立できます(つまり、必要に応じてグローバル変数を更新します)。コールバックを実行すると、ユーザーがRコードを実行し続けると、グローバル変数がバックグラウンドで自動的に更新されます。

データのサイズによっては、毎回RDSファイル全体がディスクから読み取られないようにいくつかのセーフガードを追加することができます。たとえば、ファイルと一緒にチェックサムを書くことができ、チェックサムが異なるかどうかを確認するだけです。

+0

素晴らしいアイデア。フィードバックをお寄せいただきありがとうございます。好奇心のために、これまでと同様のものを実装しようとしましたか? –

関連する問題