Как создать каталог в / запустить для каждой программы Supervisor?
У меня есть сервер Ubuntu 14.04 LTS, на котором запущено несколько разных программ под Supervisor. Многие из программ должны хранить сокеты и другие именованные каналы в файловой системе, и /run
кажется идеальным выбором для файлов такого типа. К несчастью, /run
is tmpfs и удаляется при каждой перезагрузке, а права root необходимы для (повторного) создания каталогов, в которые каждая программа может писать.
Мне нужен способ создать несколько подкаталогов в /run
и установите для владельца / режима то, с чем может работать каждая программа, и делайте это при каждой перезагрузке, прежде чем Supervisor попытается их запустить. Похоже, что Supervisor не поддерживает механизм запуска предварительных команд перед запуском программы.
Большинство других ответов на этот тип вопросов предлагают делать это в сценарии инициализации, но это относится к пакету Supervisor, и я не хочу связываться с ним (или должен поддерживать его, когда он изменяется в восходящем направлении).
Если бы на этой машине был Systemd, похоже, я мог бы использовать /etc/tmpfiles.d
, но это не так.
Лучшая идея, которую я придумал, - использовать отдельный Upstart. pre-start
скрипт для каждой программы, который только создает каталоги без фактического запуска каких-либо процессов. Что-то вроде:
/etc/init/myapp1.conf
start on runlevel [2345]
pre-start script
mkdir -p -m 0755 /var/run/myapp1
chown app1user: /var/run/myapp1
end script
...без всяких exec
линия. Я не уверен на 100%, что это правильно или нормально, но, похоже, работает. Есть ли более чистые способы сделать что-то подобное?
1 ответ
Вы запускаете свои приложения под наблюдателем от определенного пользователя? Потому что по умолчанию приложения запускаются с правами root.
Я бы сделал простой скрипт, который выполняет следующие действия:
- Проверяет, созданы ли необходимые файлы / папки.
- Устанавливает владельца при необходимости.
- Затем запускает ваше приложение
Поместите этот скрипт в конфигурацию вашего супервизора вместо непосредственного запуска вашего приложения. Убедитесь, что он запускается с правами root (удалите пользователя из конфигурации или установите user=root).
Таким образом, вы всегда можете убедиться, что ваша среда настроена и ваши каталоги существуют. Поэтому, если вы по каким-либо причинам очистите временные файлы, ваши сценарии будут работать без перезагрузки.
Если вам НУЖНО запускать приложения под конкретным пользователем, вы можете сделать следующее:
- Переместите первые 2 точки в отдельный скрипт установки (как вы бы сейчас делали, используя свое решение).
- Создайте другой скрипт, который вызывает ваш скрипт установки с помощью sudo и запускает ваше приложение
- Добавьте своего пользовательского пользователя и скрипт в файл sudo, чтобы ваш пользователь мог вызывать этот скрипт как root без запроса пароля. (Помните: это угроза безопасности, если кто-то получает доступ к вашему серверу. Убедитесь, что ваш установочный скрипт НЕ доступен для записи)