установить переменные окружения из задания cron

Вопрос или проблема

Я пытаюсь запустить скрипт в cron при перезагрузке, чтобы установить переменную окружения для дальнейшего использования (PM2)

Я пытался выполнить скрипт в crontab с помощью

. /home/myuser/scripts/startup.sh

Я пытался добавить PATH в скрипт, но снова без успеха.

Мой скрипт на данный момент выглядит так

#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
export ENV_TYPE='dev'

но когда я проверяю

echo $ENV_TYPE

он возвращает пустое значение.

Запись в /etc/crontab следующая:

@reboot myuser /home/myuser/scripts/startup.sh >> /home/myuser/scripts/logs/startup.log 2>&1

В startup.log ничего не записывается.

Переменные, установленные и экспортированные в скрипте, доступны только дочерним процессам, запущенным в этом скрипте, и недоступны для последующих процессов, таких как PM2.

Чтобы сделать ENV_TYPE постоянной, вы можете установить переменную в глобальном профиле файла /etc/environment. Вы можете редактировать этот файл с помощью sudo и добавить в конец строки, подобные этой:

ENV_TYPE=dev

Обратите внимание, что в вашем примере скрипта вы добавили пробелы вокруг =; пробелы не допускаются вокруг =, и любые другие пробелы справа от него должны быть заключены в кавычки.

В качестве более надежного способа вы можете явно передать переменную окружения при запуске PM2 (команда ниже является только примером):

ENV_TYPE=dev /path/to/pm2 any parameters

Ответ или решение

Установка переменных окружения из cron-задания

Если вы хотите установить переменные окружения, которые могут использоваться другими процессами (например, PM2), с помощью задания в cron, вам нужно учесть несколько важных моментов.

Основные проблемы

Ваша текущая попытка установить переменную ENV_TYPE через скрипт, который запускается при загрузке системы, не срабатывает по следующим причинам:

  1. Локальная область видимости переменных в скрипте: Переменные, заданные в скрипте Bash, являются локальными для самого скрипта и не могут быть доступны другим процессам, запущенным позже, несмотря на использование export.

  2. Неправильный синтаксис: В вашем скрипте есть лишние пробелы вокруг знака равенства = при назначении ENV_TYPE, что приводит к ошибке. Это неверно:

    export ENV_TYPE = 'dev'

    Правильный вариант:

    export ENV_TYPE='dev'
  3. Запись журнала: Убедитесь, что ваш лог-файл корректно записывается. Если ваш скрипт не выполняется, причина может быть отсутствия прав доступа или ошибок в самом скрипте.

Рекомендации по установке переменных окружения

Для того чтобы переменные окружения могли использоваться другими процессами, рекомендуется использовать следующие подходы:

1. Использование /etc/environment

Этот файл предназначен для глобальных переменных окружения. Вы можете добавить переменные туда, и они будут доступны для всех пользователей и процессов на системе.

sudo nano /etc/environment

Добавьте строку:

ENV_TYPE=dev

Сохраните и закройте файл. Обратите внимание, что синтаксис не допускает пробелов вокруг знака =. После внесения изменений перезагрузите систему, и переменная окружения будет доступна.

2. Передача переменной при запуске PM2

Если вы хотите использовать переменную только для процесса, запускаемого через PM2, вы можете передать переменную непосредственно при запуске:

ENV_TYPE=dev pm2 start /path/to/your/script.js

Этот подход гарантирует, что переменная будет доступна только для указанного процесса и не будет влиять на другие процессы системы.

Примеры исправленного скрипта

Вот пример корректного скрипта, который устанавливает и экспортирует переменную окружения:

#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
export ENV_TYPE='dev'
# Запускаем PM2 с указанной переменной
ENV_TYPE=$ENV_TYPE pm2 start /path/to/your/script.js

Обновление cron

Убедитесь, что ваше задание в crontab добавлено правильно:

@reboot myuser /home/myuser/scripts/startup.sh >> /home/myuser/scripts/logs/startup.log 2>&1

И проверьте права доступа к файлам и директориям, чтобы убедиться, что cron может записывать в лог.

Заключение

Правильная установка переменных окружения из cron-заданий требует понимания области видимости переменных и методов их передачи другим процессам. Используя вышеуказанные методы, вы сможете успешно установить и использовать переменные в вашей рабочей среде.

Оцените материал
Добавить комментарий

Капча загружается...