crontabを使用してすべてのユーザーにENV変数を設定するには?

crontabを使用してすべてのユーザーにENV変数を設定するには?

session_secretを変更するために頻繁に設定しようとしていますENV variable。 andをcrontab使用すると、彼らが使用するサンドボックス環境を取り除くことができないようです。あまりにも多くの文字に対して、この変数をランダムに生成された値に設定する必要があります。rubybashhex

可能ですか?現在のインスタンス値を変更できないようです。

MYVAR=$(openssl rand -hex 32)

これはスクリプトにありますが、bash私のユーザーとして確認しても変更されません。何が間違っているのかわかりません。

答え1

間違った結論 - プロセス外でプロセス環境を変更する能力。

スクリプトを実行するとしますruby

これにより、環境変数を持つbashシェルインスタンスが起動します。ここでRubyインタプリタは現在bashシェルインスタンス環境を継承し始め、インタプリタに関連するいくつかの新しい環境変数を追加できます。

実行中のすべてのプログラムにはprocess idakaがありますpid。プロセス環境は/proc/<pid>/environここに保存され、読み取り専用であり、外部から変更することはできません。ここで指摘したように実行中のプロセスの環境の変更

Ruby スクリプトが実行されると、親 bash インスタンスも実行されます。この bash の例は次のとおりです。変更された環境変数を読み取らないそして継承または転送されない子項目の新しい変数:

$ pstree -p | grep ruby
bash(1234)---ruby(5678)

grepを使ってenv.varsを見つけることができます。 xargs -n 1 -0 < /proc/5678/environ | grep MYVAR

スクリプトの実行中に新しく変更された環境変数を取得する唯一の方法は、新しいbash / ruby​​インスタンスを起動して古いインスタンスを終了することです。


考えられる誤った結論 - スクリプトはenvから継続的に読み取られます。 - envが変更されると、スクリプトに通知が渡されます。 - env はインタプリタによってキャッシュされません。

通常、スクリプトは最初に環境変数を読み込みます。スクリプトを起動するときにのみ、実行時にはenv_varsの代わりに内部変数を使用し続けます。プロセス環境が外部から変更される可能性があり、スクリプトが継続的に環境変数を読み取っても、環境は実際の環境ではなくキャッシュされたコピーになる可能性があります。

(Pythonの例)

# start
key = os.environ.get('MYVAR')

# do something with key until scripts ends

答え:

  1. Rubyスクリプトを修正し、openssl rand -hex 32定期的に実行して結果を変数として読み込みます。
  2. /path/datacronによって生成された変数にファイルを読み込み、時々出力するようにopenssl rand -hex 32Rubyスクリプトを変更します。
  3. cronjob は新しい環境を使用してスクリプトを再起動します。 (つまり、sudo # see switches -i -u and --)コメントで述べたように、ユーザースコープ環境はprofile.dで設定できます。etc-profile-d-のスクリプトが実行するアクション

関連情報