Eu tenho um serviço systemd que chama um script PHP que cria uma tmux
sessão na inicialização.
Globalmente tenho o que há de mais atual tmux
para a distro (V>=2.5).
O script USER
tem um $HOME/bin/tmux
valor de 2.0
O que eu preciso é que isso systemd
use o tmux
biná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 PATH
no 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-file
nome para algo mais sensato, mas o caminho user_envfile
deve 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 ( foo
sendo o arquivo /etc/pam.d
criado anteriormente):
PAMName=foo
Agora, ao iniciar o serviço (após recarregar, etc.), os session
módulos /etc/pam.d/foo
serão executados, o que neste caso é apenaspam_env
. pam_env
carregará variáveis de ambiente de /etc/environment
, sujeitas a restrições /etc/security/pam_env.conf
e, em seguida, o ambiente do usuário de ~/some-file
. Como PATH
está 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.d
qual possui user_readenv=1
, mas outros módulos PAM podem causar efeitos colaterais indesejados.
Responder2
Parece terrivelmente hackeado, mas acrescentar uma $PATH
atualizaçã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/airflow
arquivo, 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.