Вопрос или проблема
Я пытаюсь запустить скрипт в 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
через скрипт, который запускается при загрузке системы, не срабатывает по следующим причинам:
-
Локальная область видимости переменных в скрипте: Переменные, заданные в скрипте Bash, являются локальными для самого скрипта и не могут быть доступны другим процессам, запущенным позже, несмотря на использование
export
. -
Неправильный синтаксис: В вашем скрипте есть лишние пробелы вокруг знака равенства
=
при назначенииENV_TYPE
, что приводит к ошибке. Это неверно:export ENV_TYPE = 'dev'
Правильный вариант:
export ENV_TYPE='dev'
-
Запись журнала: Убедитесь, что ваш лог-файл корректно записывается. Если ваш скрипт не выполняется, причина может быть отсутствия прав доступа или ошибок в самом скрипте.
Рекомендации по установке переменных окружения
Для того чтобы переменные окружения могли использоваться другими процессами, рекомендуется использовать следующие подходы:
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-заданий требует понимания области видимости переменных и методов их передачи другим процессам. Используя вышеуказанные методы, вы сможете успешно установить и использовать переменные в вашей рабочей среде.