airflow-scheduler.service

airflow-scheduler.service

Eu tenho um serviço systemd que chama um script PHP que cria uma tmuxsessão na inicialização.

Globalmente tenho o que há de mais atual tmuxpara a distro (V>=2.5).
O script USERtem um $HOME/bin/tmuxvalor de 2.0

O que eu preciso é que isso systemduse o tmuxbinário no $HOME do usuário.
Eu configurei as variáveis ​​USER & GROUP no arquivo de serviço systemd, mas parece chamar o binário instalado globalmente.

É possível definir explicitamente o binário que deve ser chamado para esta invocação de serviço?

Se possível, prefiro não começar a codificar o caminho no próprio arquivo PHP.

Muito obrigado.

Responder1

Você pode codificar PATHno serviço systemd:

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

Mais flexível seria o PAM. É muito indireto comparado a simplesmente usar bash -c '....', mas você pode fazer isso com o PAM.

Crie uma nova configuração PAM em /etc/pam.d(digamos /etc/pam.d/foo) e adicione:

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

E em /home/someUser/some-file, adicione:

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

Claro, você pode ajustar o some-filenome para algo mais sensato, mas o caminho user_envfiledeve ser relativo ao diretório inicial do usuário (o usuário que você definiu User=no serviço).

Em seguida, no arquivo de serviço, na [Service]seção, adicione ( foosendo o arquivo /etc/pam.dcriado anteriormente):

PAMName=foo

Agora, ao iniciar o serviço (após recarregar, etc.), os sessionmódulos /etc/pam.d/fooserão executados, o que neste caso é apenaspam_env. pam_envcarregará variáveis ​​de ambiente de /etc/environment, sujeitas a restrições /etc/security/pam_env.confe, em seguida, o ambiente do usuário de ~/some-file. Como PATHestá definido com um valor padrão em /etc/environment, o ambiente do usuário precede esse valor padrão.

Aqui, o valor padrão de user_envfileé .pam_environment, que também é lido pela configuração do PAM de outras coisas como login SSH ou LightDM, etc. Usei um arquivo diferente aqui caso você não queira afetar essas coisas. Você pode remover user_envfile=...e usar o padrão ~/.pam_environment. você também pode usar apenas uma configuração PAM existente na /etc/pam.dqual possui user_readenv=1, mas outros módulos PAM podem causar efeitos colaterais indesejados.

Responder2

Parece terrivelmente hackeado, mas acrescentar uma $PATHatualização parece funcionar.
No entanto, estou atento aos efeitos colaterais. . .

Exemplo:

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

Responder3

Eu sei que estou desenterrando uma postagem um pouco desatualizada, mas eu também estava tentando descobrir como poderia configurar as variáveis ​​PATH/ambiente para que eu pudesse fazer com que o agendador fosse executado automaticamente quando o servidor estivesse em execução.

Encontrei uma solução que funciona para mim no Ubuntu 18.04 e 18.10

Eu forneci um artigo completo sobre comoinstalar Airflow e PostgreSQLno backend no linkaqui.

**da última parte do meu artigo Basicamente, tudo se resume a fazer uma alteração específica no arquivo airflow-scheduler.system.

Esta é uma das 'pegadinhas' para uma implementação no Ubuntu. A equipe de desenvolvimento que criou o Airflow o projetou para rodar em uma distribuição diferente do Linux e, portanto, há uma pequena (mas crítica) mudança que precisa ser feita para que o Airflow seja executado automaticamente quando o servidor estiver ligado. Os arquivos de serviço systemd padrão inicialmente se parecem com isto:

[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

No entanto, isso não funcionará porque o protocolo ‘EnvironmentFile’ não funciona no Ubuntu 18. Em vez disso, comente essa linha e adicione:

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

Você provavelmente desejará criar um arquivo de serviço systemd pelo menos para o Airflow Scheduler e provavelmente também para o servidor da Web se desejar que a IU seja iniciada automaticamente também. Na verdade, queremos ambos nesta implementação, então criaremos dois arquivos, airflow-scheduler.service e airflow-webserver.service. Ambos serão copiados para a pasta /etc/systemd/system. São os seguintes:


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-webserver.service

[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

Finalmente, com ambos os arquivos copiados para a pasta /etc/systemd/systemd por meio de um comando de cópia de superusuário, sudo cp, é hora de ligar a ignição:

sudo systemctl ativar agendador de fluxo de ar sudo systemctl iniciar agendador de fluxo de ar sudo systemctl ativar servidor de fluxo de ar sudo systemctl iniciar servidor de fluxo de ar

Responder4

Em um serviço que eu estava configurando (Apache Airflow), eu tinha um arquivo de ambiente definido.

No meu /etc/systemd/system/airflowarquivo, eu tinha esta linha:

[Service]
EnvironmentFile=/etc/default/airflow

Abrindo este arquivo de ambiente, adicionei a linha que precisava, no meu caso:

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

Adicione aqui todos os caminhos aos executáveis ​​​​que você precisa para poder ser acessado pelo serviço e você deve ficar bem. Funcionou bem para mim.

informação relacionada