Bash

如何使用 crontab 為所有使用者設置 ENV 變數?

  • January 8, 2021

我試圖每隔一段時間設置一個ENV variablecrontab更改 session_secret。同時使用rubyand bash,我似乎無法擺脫他們使用的沙盒環境。我需要將此變數設置為隨機生成hex的這麼多字元的值。

這可能嗎?我似乎無法更改目前實例值。

MYVAR=$(openssl rand -hex 32)

這是在bash腳本中,但當我以自己的使用者身份進行檢查時不會改變。不知道我做錯了什麼。

錯誤的結論——從流程外部改變流程環境的能力。

假設您執行一個ruby腳本。

這將啟動一個帶有環境變數的 bash shell 實例,其中 ruby​​ 解釋器開始繼承目前的 bash shell 實例環境,並可能添加一些解釋器特定的新環境變數。

每個正在執行的程序都有一個process idaka pid。程序環境儲存在/proc/<pid>/environ其中只讀且不能從外部更改 - 正如此處指出的那樣更改正在執行的程序的環境

當您的 ruby​​ 腳本執行時,父 bash 實例也在執行。此 bash 實例未讀取已更改的 env var,也未將新 var 繼承或傳播給它的子項:

$ 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。即使從外部更改程序 env 是可能的,並且腳本不斷讀取環境變數 - env 可能是記憶體副本,而不是真正的交易。

(蟒蛇範例)

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

# do something with key until scripts ends

答案:

  1. 修改 ruby​​ 腳本以openssl rand -hex 32不時執行並將結果讀取到變數中。
  2. 修改ruby腳本,將文件讀/path/data入cron生成的變數,openssl rand -hex 32不時輸出。
  3. cronjob 使用新環境重新啟動腳本。(即,sudo # see switches -i -u and --)如評論中提到的使用者範圍的環境可以在 profile.d what-do-the-scripts-in-etc-profile-d-do 中設置

引用自:https://unix.stackexchange.com/questions/627738