Подпроцесс Python не может найти команды оболочки при запуске systemctl - PullRequest
0 голосов
/ 19 декабря 2018

Когда я запускаю приложение python с systemctl, подпроцесс python завершается ошибкой при выполнении стандартных команд оболочки, таких как tail, awk и т. Д.

Пример кода:

import subprocess

process = subprocess.Popen(['awk'], stdout=subprocess.PIPE)

, сохраните выше изапустите его через python app.py - без проблем.

Запустите эту же команду, используя systemctl, и вы получите следующую ошибку:

FileNotFoundError: [Errno 2] No such file or directory: 'awk': 'awk'

То же самое относится ко всем другим командам, которые я знаюдля факта, который я установил - например, tail, sed и т. д.

Я пробовал разные способы запуска подпроцесса, такие как subprocess.run(), subprocess.call().Я также пытаюсь использовать shell=True и даже аргумент executable='/bin/bash.

Что касается systemctl, я пытался работать локально, используя systemctl start service_name --user и различные комбинации конфигурации, такие как изменение типа процесса, запусккак root, другой пользователь и группа.

Вот пример конфигурации:

[Unit]
Description={{ project_name }} Service
After=network.target

[Service]
User={{ user }}
Group={{ user_group }}

Restart=always
RestartSec=1s

WorkingDirectory=/home/{{ user }}/{{ project_folder }}
ExecStart=/home/{{ user }}/{{ project_folder }}/virtualenv/bin/python start.py

[Install]
WantedBy=multi-user.target

1 Ответ

0 голосов
/ 19 декабря 2018

Оказывается, что подпроцесс python использует переменные среды PATH для определения местоположения исполняемых файлов.

При запуске systemctl они не предоставляются.

Я нашел это, сравнив print(os.environ) при работе с systemctl и при запуске с python app.py.

Добавьте эту строку в раздел [Service] файла конфигурации systemctl:

Environment="PATH=/home/{{ user }}/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
...