tmux
부팅 시 세션을 생성하는 PHP 스크립트를 호출하는 시스템 서비스가 있습니다 .
전 세계적으로 최신 tmux
배포판을 보유하고 있습니다(V>=2.5).
스크립트의 값은 2.0 USER
입니다 .$HOME/bin/tmux
나에게 필요한 것은 사용자의 $HOME에 있는 바이너리를 systemd
사용하는 것 입니다. systemd 서비스 파일에 USER & GROUP 변수를 설정했지만 전역적으로 설치된 바이너리를 호출하는 것 같습니다.tmux
이 서비스 호출을 위해 호출되어야 하는 바이너리를 명시적으로 설정할 수 있습니까?
가능하다면 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을 사용하면 이 작업을 수행할 수 있습니다.
/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-file
PATH
/etc/environment
여기에서 의 기본값은 user_envfile
SSH .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
여기에서 서비스가 접근할 수 있어야 하는 실행 파일에 경로를 추가하면 문제가 없습니다. 나를 위해 잘 일했습니다.