공기 흐름 스케줄러.service

공기 흐름 스케줄러.service

tmux부팅 시 세션을 생성하는 PHP 스크립트를 호출하는 시스템 서비스가 있습니다 .

전 세계적으로 최신 tmux배포판을 보유하고 있습니다(V>=2.5).
스크립트의 값은 2.0 USER입니다 .$HOME/bin/tmux

나에게 필요한 것은 사용자의 $HOME에 있는 바이너리를 systemd사용하는 것 입니다. systemd 서비스 파일에 USER & GROUP 변수를 설정했지만 전역적으로 설치된 바이너리를 호출하는 것 같습니다.tmux

이 서비스 호출을 위해 호출되어야 하는 바이너리를 명시적으로 설정할 수 있습니까?

가능하다면 PHP 파일 자체에 경로를 하드코딩하지 않는 것이 좋습니다.

많은 감사를 드립니다.

답변1

PATHsystemd 서비스에서 하드코딩할 수 있습니다 .

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

PAM이 더 유연할 것입니다. 단순히 를 사용하는 것과 비교하면 엄청나게 우회적이지만 bash -c '....'PAM을 사용하면 이 작업을 수행할 수 있습니다.

/etc/pam.d(가령 /etc/pam.d/foo) 에서 새 PAM 구성을 생성 하고 다음을 추가합니다.

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-filePATH/etc/environment

여기에서 의 기본값은 user_envfileSSH .pam_environment또는 LightDM 로그인 등과 같은 다른 항목의 PAM 구성에서도 읽히는 입니다. 이러한 항목에 영향을 주지 않으려는 경우를 대비하여 여기서는 다른 파일을 사용했습니다. 을 제거 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 파일을 특정 변경하는 것으로 귀결됩니다.

이것은 우분투에서의 구현을 위한 '문제점' 중 하나입니다. Airflow를 만든 개발팀은 Airflow가 다른 Linux 배포판에서 실행되도록 설계했기 때문에 서버가 켜져 있을 때 Airflow가 자동으로 실행되도록 하려면 작지만 중요한 변경 사항이 필요합니다. 기본 시스템 서비스 파일은 처음에 다음과 같습니다.

[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"

UI가 자동으로 시작되도록 하려면 최소한 Airflow Scheduler 및 웹 서버에 대한 시스템 서비스 파일을 생성해야 할 것입니다. 실제로 우리는 이 구현에서 두 가지를 모두 원하므로 airflow-scheduler.service 및 airflow-webserver.service라는 두 개의 파일을 생성할 것입니다. 둘 다 /etc/systemd/system 폴더에 복사됩니다. 이는 다음과 같습니다:


공기 흐름 스케줄러.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

마지막으로, 슈퍼유저 복사 명령 sudo cp를 통해 두 파일을 /etc/systemd/systemd 폴더에 복사했으므로 이제 시동을 걸 시간입니다.

sudo systemctl 공기 흐름 스케줄러 활성화 sudo systemctl 공기 흐름 스케줄러 시작 sudo systemctl 공기 흐름 웹 서버 활성화 sudo systemctl 공기 흐름 웹 서버 시작

답변4

내가 설정한 서비스(Apache Airflow)에는 환경 파일 세트가 있었습니다.

/etc/systemd/system/airflow파일에는 다음 줄이 있습니다.

[Service]
EnvironmentFile=/etc/default/airflow

이 환경 파일을 열고 제 경우에는 필요한 줄을 추가했습니다.

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

여기에서 서비스가 접근할 수 있어야 하는 실행 파일에 경로를 추가하면 문제가 없습니다. 나를 위해 잘 일했습니다.

관련 정보