我试图经常设置一个来更改 session_secret ENV variable
。crontab
使用ruby
和bash
,我似乎无法摆脱他们使用的沙盒环境。我需要将此变量设置为hex
这么多字符的随机生成值。
这可能吗?我似乎无法更改当前实例值。
MYVAR=$(openssl rand -hex 32)
这是在bash
脚本中,但当我以我自己的用户身份检查时不会改变。不确定我做错了什么。
答案1
错误的结论——从流程外部改变流程环境的能力。
假设您运行一个ruby
脚本。
这将启动一个带有环境变量的 bash shell 实例,其中 ruby 解释器开始继承当前的 bash shell 实例环境,并可能添加一些特定于解释器的新环境变量。
每个正在运行的程序都有一个process id
aka 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
答案:
- 修改ruby脚本,
openssl rand -hex 32
定时执行并读取结果到变量中。 - 修改 ruby 脚本,将文件读
/path/data
入 cron 生成的变量中,并不openssl rand -hex 32
时输出。 - cronjob 使用新环境重新启动脚本。 (即,
sudo # see switches -i -u and --)
正如评论中提到的,用户范围的环境可以在 profile.d 中设置etc-profile-d-中的脚本做什么