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 대신 내부 변수를 계속 사용합니다. 프로세스 환경이 외부에서 변경될 수 있고 스크립트가 지속적으로 환경 변수를 읽는 경우에도 환경은 실제 환경이 아닌 캐시된 복사본일 수 있습니다.

(파이썬 예)

# 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 32수시로 출력하도록 Ruby 스크립트를 수정합니다 .
  3. cronjob은 새 환경을 사용하여 스크립트를 다시 시작합니다. (즉, sudo # see switches -i -u and --)주석에서 언급했듯이 사용자 범위 환경은 profile.d에서 설정할 수 있습니다.etc-profile-d-의 스크립트가 수행하는 작업

관련 정보