Это можно сделать с помощью 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
?!).
Начиная с 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
.
Проблема в том, что вы пытаетесь использовать операторы перенаправления оболочки - systemd не будет неявно запускать строку ExecStart в оболочке.
Что он делает, так это запускает указанную вами программу (/usr/bin/python
в вашем примере), а все остальное является аргументом указанной программы. Вы получаете ошибку недопустимого аргумента, потому что часть > /web/cmcreader/test.log 2>&1
является недопустимым аргументом для python.
Хотя я, безусловно, рекомендую вам просто использовать journalctl, как ответил @mark-stosberg, и удалить все из перенаправления вперед, если вы действительно хотите, чтобы ваш скрипт Python записывал в файл, у вас есть пара вариантов:
ExecStart=bash -c "/usr/bin/python /web/cmcreader/test.py > /web/cmcreader/test.log 2>&1"
Опять же, я не очень рекомендую эти варианты, особенно последний.