airflow-scheduler.service

airflow-scheduler.service

У меня есть служба systemd, которая вызывает PHP-скрипт, создающий tmuxсессию при загрузке.

Глобально у меня самая последняя версия tmuxдля дистрибутива (V>=2.5).
Скрипт USERимеет $HOME/bin/tmuxверсию 2.0

Мне нужно, чтобы это systemdиспользовало tmuxдвоичный файл в $HOME пользователя.
Я установил переменные USER и GROUP в файле службы systemd, но, похоже, он вызывает глобально установленный двоичный файл.

Можно ли явно задать двоичный файл, который следует вызвать для этого вызова службы?

Если возможно, я бы предпочел не начинать жестко кодировать путь в самом PHP-файле.

Большое спасибо.

решение1

Вы можете жестко закодировать это PATHв службе systemd:

[Service]
Environment=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Более гибким был бы PAM. Это ужасно окольный путь по сравнению с простым использованием bash -c '....', но вы можете сделать это с PAM.

Создайте новую конфигурацию PAM /etc/pam.d(например /etc/pam.d/foo, ) и добавьте:

session    required     pam_env.so user_envfile=some-file user_readenv=1

И в /home/someUser/some-file, добавьте:

PATH DEFAULT=/home/someUser/bin:${PATH}

Конечно, вы можете изменить some-fileимя на что-то более разумное, но путь user_envfileдолжен быть указан относительно домашнего каталога пользователя (пользователя, которого вы указали User=в службе).

Затем в файле службы, в [Service]разделе, добавьте ( fooфайл был /etc/pam.dсоздан ранее):

PAMName=foo

Теперь, когда вы запустите службу (после перезагрузки и т.п.), модули sessionбудут /etc/pam.d/fooзапущены, что в данном случае простоpam_env. pam_envзагрузит переменные среды из /etc/environment, с учетом ограничений в /etc/security/pam_env.conf, а затем пользовательскую среду из ~/some-file. Поскольку PATHв установлено значение по умолчанию /etc/environment, пользовательская среда добавляется к этому значению по умолчанию.

Здесь значение по умолчанию user_envfileравно .pam_environment, которое также считывается конфигурацией PAM других вещей, таких как вход в систему SSH или LightDM и т. д. Я использовал другой файл здесь на случай, если вы не хотите влиять на эти вещи. Вы можете удалить user_envfile=...и использовать значение по умолчанию ~/.pam_environment. Вы также можете просто использовать существующую конфигурацию PAM, в /etc/pam.dкоторой есть user_readenv=1, но другие модули PAM могут вызвать нежелательные побочные эффекты.

решение2

Кажется, это ужасно хакерски, но предварительная загрузка $PATHобновления, похоже, работает.
Я слежу за побочными эффектами, однако...

Пример:

ExecStart=/bin/bash -c "PATH=/home/someUser/bin:$PATH exec /usr/bin/php /some/path/to/a/script.php"

решение3

Я знаю, что откапываю немного устаревший пост, но я тоже пытался выяснить, как мне настроить переменные PATH/среды таким образом, чтобы я мог автоматически запускать планировщик при работе сервера.

Я нашел решение, которое работает у меня на Ubuntu 18.04 и 18.10.

Я предоставил полное описание того, какустановить Airflow и PostgreSQLна бэкэнде по ссылкездесь.

**из последней части моей статьи По сути, все сводится к внесению определенного изменения в файл airflow-scheduler.system.

Это один из «подводных камней» для реализации на Ubuntu. Команда разработчиков, создавшая Airflow, спроектировала его для работы на другом дистрибутиве Linux, поэтому необходимо внести небольшое (но важное) изменение, чтобы Airflow автоматически запускался при включении сервера. Файлы служб systemd по умолчанию изначально выглядят так:

[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service

[Service]
EnvironmentFile=/etc/sysconfig/airflow
User=airflow
Group=airflow
Type=simple
ExecStart=/bin/airflow scheduler
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

Однако это не сработает, поскольку протокол «EnvironmentFile» не поддерживается в Ubuntu 18. Вместо этого закомментируйте эту строку и добавьте:

Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Вероятно, вам захочется создать файл службы systemd по крайней мере для Airflow Scheduler, а также, вероятно, для Webserver, если вы хотите, чтобы пользовательский интерфейс также запускался автоматически. На самом деле, в этой реализации нам нужны оба файла, поэтому мы создадим два файла, airflow-scheduler.service и airflow-webserver.service. Оба они будут скопированы в папку /etc/systemd/system. Они следующие:


airflow-scheduler.service

[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service

[Service]
#EnvironmentFile=/etc/default/airflow
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow scheduler
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
#airflow-webserver.service

airflow-вебсервер.сервис

[Unit]
Description=Airflow webserver daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service

[Service]
#EnvironmentFile=/etc/default/airflow
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow webserver -p 8085 --pid /home/ubuntu/airflow/airflow-webserver.pid
Restart=on-failure
RestartSec=5s
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Наконец, скопировав оба файла в папку /etc/systemd/systemd с помощью команды суперпользователя sudo cp, пора включить зажигание:

sudo systemctl включить airflow-scheduler sudo systemctl запустить airflow-scheduler sudo systemctl включить airflow-webserver sudo systemctl запустить airflow-webserver

решение4

В настраиваемой мной службе (Apache Airflow) у меня был установлен файл среды.

В моем /etc/systemd/system/airflowфайле была такая строка:

[Service]
EnvironmentFile=/etc/default/airflow

Открыв этот файл среды, я добавил нужную мне строку, в моем случае:

SCHEDULER_RUNS=5
PATH=/opt/anaconda3/bin:$PATH

Добавьте любые пути к исполняемым файлам, которые вам нужны, чтобы служба могла к вам обратиться, и все должно быть в порядке. У меня это сработало хорошо.

Связанный контент