Пытаюсь запустить скрипт python как службу с помощью systemd

Это можно сделать с помощью Python apt API. Пакеты, которые вы видите в apt-mark showmanual, точно такие же, как в apt.cache.Cache(), для которых is_installedимеет значение true иis_auto_installed неверно. Но легче обрабатывать зависимости:

#! /usr/bin/env python3

from apt import cache

manual = set(pkg for pkg in cache.Cache() if pkg.is_installed and not pkg.is_auto_installed)
depends = set(dep_pkg.name for pkg in manual for dep in pkg.installed.get_dependencies('PreDepends', 'Depends', 'Recommends') for dep_pkg in dep)

print('\n'.join(pkg.name for pkg in manual if pkg.name not in depends))

Даже здесь перечислены некоторые пакеты, которые я не ожидал там увидеть (init, grep?!).

1
11.05.2017, 15:46
2 ответа

Начиная с man systemd.directives вы можете найти документы для любой директивы systemd. Здесь вы можете найти, что ExecStart= задокументировано в man systemd.service.

В документах говорится:

перенаправление с использованием «<», «<<», «>» и «>>», конвейеры с использованием «|», запуск программ в фоновом режиме с использованием «&» и другие элементы синтаксиса оболочки не поддерживаются.

Они также обычно не нужны. systemd по умолчанию уже запускает приложения в фоновом режиме, поэтому вам не нужны и . Он также автоматически записывает вывод в STDOUT и STDERR и регистрирует его для вас, поэтому вам также не нужно перенаправлять вывод в файл журнала.

Просто используйте journalctl -u cmcreader для просмотра журналов вашего сервиса или journalctl для просмотра всех журналов.

Если вы не уверены в синтаксисе файла systemd, вы можете использовать:

systemd-analyze verify ./path/to/your.service

Кроме того, создаваемые вами служебные файлы помещаются в /etc/systemd/system. Каталог /lib предназначен для служебных файлов, установленных пакетами, а не людьми.

Наконец, enable не запускает службу, а просто запускает раздел [Install], настраивая запуск приложения при загрузке.

Чтобы запустить службу, используйте systemctl start your.service.

5
27.01.2020, 23:14

Проблема в том, что вы пытаетесь использовать операторы перенаправления оболочки - systemd не будет неявно запускать строку ExecStart в оболочке.

Что он делает, так это запускает указанную вами программу (/usr/bin/python в вашем примере), а все остальное является аргументом указанной программы. Вы получаете ошибку недопустимого аргумента, потому что часть > /web/cmcreader/test.log 2>&1 является недопустимым аргументом для python.

Хотя я, безусловно, рекомендую вам просто использовать journalctl, как ответил @mark-stosberg, и удалить все из перенаправления вперед, если вы действительно хотите, чтобы ваш скрипт Python записывал в файл, у вас есть пара вариантов:

  • переписать ваш python так, чтобы он действительно писал в лог-файл
  • заставить systemd запустить скрипт bash, который запускает скрипт python и перенаправляет выходные данные
  • заставить systemd запускать bash явно а-ля ExecStart=bash -c "/usr/bin/python /web/cmcreader/test.py > /web/cmcreader/test.log 2>&1"

Опять же, я не очень рекомендую эти варианты, особенно последний.

1
27.01.2020, 23:14

Теги

Похожие вопросы