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