AWS Elastic Beanstalk: запуск сценария Cron.d, отсутствие переменных среды

Я пытаюсь запустить скрипт PHP, который запускается cron-скриптом (в cron.d). Сценарий запускается должным образом, но ему не хватает «Переменные среды» из эластичного beanstalk, которые хранятся в супергелбале $ _SERVER. На данный момент скрипт запускается как пользовательский «root», но он не находится в той же среде, где есть переменные среды. Переменные заданы правильно, если я запускаю скрипт из полной оболочки, он работает отлично.

Где «экспорт» для этих переменных? Где они устанавливаются? Я нашел SetEnvs для Apache в /etc/apache/conf.d/aws_env.conf. Я не могу найти что-либо в файле .bashrc, .bash_profile и т. Д. Есть ли обходной путь? Лучший способ сделать это?

Благодарю.

Solutions Collecting From Web of "AWS Elastic Beanstalk: запуск сценария Cron.d, отсутствие переменных среды"

При поиске решений по той же проблеме я столкнулся с этим сообщением в блоге: http://sebgoo.blogspot.nl/2013/10/elastic-beanstalk-cron-command-and-rds.html . Подводя итог, вы можете загрузить переменные среды Elastic Beanstalk с помощью файла opt/elasticbeanstalk/support/envvars :

 0 3 * * * . /opt/elasticbeanstalk/support/envvars; some_command 

Надеюсь это поможет!

Я просто нашел это, используя

 grep -r "export MY_VAR" / 

EDIT: Кажется, что Amazon перемещает местоположение файла время от времени. Текущее местоположение:

 /opt/elasticbeanstalk/support/envvars 

Поэтому я думаю, что просто включу (исходный [путь к файлу]), который в моем скрипте перед вызовом моего php-скрипта. Все еще кажется напуганным способом делать что-то. Я все еще готов к лучшим решениям.

Я запускал PHP через скрипт bash, запускаемый cron. Поэтому, чтобы настроить среду, я бы сделал что-то вроде этого:

 #!/bin/bash source /opt/elasticbeanstalk/support/envvars php -f my-script.php 

См. Ответ @ userid53 ниже для решения PHP.

Я потратил несколько часов, пытаясь понять, как передать переменные среды в PHP CLI. Я пытался:

  • настройка в конфигурации ebextensions: $ source /opt/elasticbeanstalk/support/envvars.d/sysenv
  • установив все мои переменные среды в файл конфигурации.

Независимо от того, что я пробовал, переменные env не будут передаваться в PHP CLI.

Когда я вхожу в мой экземпляр EC2 как пользователь ec2 и делаю это: $ echo $ENVIRONMENT Я получаю prod . Если я делаю это как $ sudo su а затем $ echo $ENVIRONMENT я получаю prod .

Если я вручную запускаю файл CLI PHP (используемый в cronjob), мой скрипт работает. Когда он запускается автоматически (через cronjob), переменные среды не передаются моему сценарию.

Вот что я сделал. Поместите это в свой скрипт ввода cronjob:

 $variables = '/opt/elasticbeanstalk/support/envvars.d/sysenv'; if (file_exists($variables) && is_file($variables)) { $contents = file_get_contents($variables); foreach(explode("\n", $contents) as $line) { if (empty($line)) continue; $new_line = str_replace('export ', '', $line); $first_part = strpos($new_line, '='); $last_part = substr($new_line, $first_part, strlen($new_line)); $variable_value = str_replace(array('=', '"'), array('',''), $last_part); $variable_name = substr($new_line, 0, $first_part); putenv($variable_name."=".$variable_value); } } 

Он извлекает каждую строку из файла /opt/elasticbeanstalk/support/envvars.d/sysenv , удаляет часть export , получает имя и значение переменной и устанавливает ее с помощью функции putenv () .

Я добавил следующую строку в свой сценарий оболочки:

 source /opt/elasticbeanstalk/support/envvars .bash_profile 

Таким образом, мой скрипт, выполняемый crontab, выглядит так:

 #!/bin/sh source /opt/elasticbeanstalk/support/envvars .bash_profile # do some php stuff 

Я знаю, что это старый поток, но мне недавно нужно было сделать что-то подобное в среде Node.js, развернутой на Elastic Beanstalk; для того, что я мог сказать, файл /opt/elasticbeanstalk/support/envvars отсутствует в средах Node.js. Я закончил писать сценарий Python, который загружал переменные окружения из /opt/elasticbeanstalk/bin/get-config , а затем выполнил мой сценарий Node.js.

Код, который я использовал, был:

 #!/usr/bin/env python import os import subprocess from subprocess import Popen, PIPE, call import simplejson as json envData = json.loads(Popen(['/opt/elasticbeanstalk/bin/get-config', 'environment'], stdout = PIPE).communicate()[0]) for k, v in envData.iteritems(): os.environ[k] = v call(["babel-node", "/var/app/current/<script_name>.js"]) 

Надеюсь, это поможет любому, кто хочет сделать то же самое.

Для полной конфигурации, которую я развернул, вы можете обратиться к моему оригинальному сообщению Как установить переменные среды в Amazon Elastic Beanstalk при запуске задания cron (Node.js)