如何使用 crontab 為所有使用者設置 ENV 變數?
我試圖每隔一段時間設置一個
ENV variable
來crontab
更改 session_secret。同時使用ruby
andbash
,我似乎無法擺脫他們使用的沙盒環境。我需要將此變數設置為隨機生成hex
的這麼多字元的值。這可能嗎?我似乎無法更改目前實例值。
MYVAR=$(openssl rand -hex 32)
這是在
bash
腳本中,但當我以自己的使用者身份進行檢查時不會改變。不知道我做錯了什麼。
錯誤的結論——從流程外部改變流程環境的能力。
假設您執行一個
ruby
腳本。這將啟動一個帶有環境變數的 bash shell 實例,其中 ruby 解釋器開始繼承目前的 bash shell 實例環境,並可能添加一些解釋器特定的新環境變數。
每個正在執行的程序都有一個
process id
akapid
。程序環境儲存在/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
答案:
- 修改 ruby 腳本以
openssl rand -hex 32
不時執行並將結果讀取到變數中。- 修改ruby腳本,將文件讀
/path/data
入cron生成的變數,openssl rand -hex 32
不時輸出。- cronjob 使用新環境重新啟動腳本。(即,
sudo # see switches -i -u and --)
如評論中提到的使用者範圍的環境可以在 profile.d what-do-the-scripts-in-etc-profile-d-do 中設置