@Rentable
Инженер

Как отобразить работу скрипта Python запущенного через systemctl?

Есть скрипт бота на Python, работал на Windows в Pycharm, я следил в консоле за сообщениями, которые скрипт иногда выдавал (простенькая аналитика, типа сколько раз нажали на кнопку).
Затем, после отладки, скрипт перенёс на Линукс сервер (Debian11).
Запускаю: python3 bot.py
Всё работает, в консоле вижу ответы скрипта, всё замечательно.
Затем, как и положено, запустил скрипт через systemctl как сервис. Так же всё работает отлично, но я не могу понять как мне увидеть то, что я раньше видел в консоле - ответы скрипта (эхо, принты)
Попробовал через: journalctl -f -u bot
Выводит только что запущен сервис и всё.
Попробовал через: strace -p PID -s 513615 -e write
выводит внутрисистемный обмен работы скрипта.

Подскажите, как мне при входе по SSH набрать команду и увидеть вывод работы скрипта, а именно то, что заложено в логику скрипта - Эхо, принты и всё то, что я раньше видел в консоле Pycharm
  • Вопрос задан
  • 492 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
ОП, ты хочешь странного. Осознай, что демоны (а systemd управляет как раз программами типа daemon) по определению не предназначены для взаимодействия непосредственно с пользователем, в частности через терминал. А значит, у тебя два выхода:

1. Перестать хотеть странного, и реализовать нормальные логи и анализировать их. Тогда можно будет в любой момент посмотреть историю, выведенную в лог.
При необходимости отслеживать файл лога в реальном времени можно использовать команду tail -f файл.log. Почитай про неё.
Также можно натравить на лог какую-нибудь утилиту мониторинга, которая будет его читать и посылать тебе оповещения о событиях по другому каналу.
Если лог большой, есть logrotate.
Минус - специфические терминальные фишки в логе работать не будут. Скажем, прогрессбар там не сделаешь, и ввести текст не получится.

2. Отказаться от запуска программы как классического демона, и запускать её через утилиту screen. Тогда ты сможешь сконнектиться к сессии screen когда угодно.
Плюс - взаимодействие с терминалом как обычно. В том числе из разных ssh сессий.
Минус - screen не самая удобная штука, сочетания клавиш там мозголомные. Плюс всё равно запуск screen придётся заворачивать в systemd если тебе нужен автозапуск и автоперезапуск.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Как вариант можно в начале скрипта переобъявить стандартный вывод как вывод в файл, и до окончания работы скрипта все print-в будут выводиться в указанный файл.
Ответ написан
@ProFfeSsoRr
Сис.админ по Linux
Всё работает, в консоле вижу ответы скрипта, всё замечательно.

ну так соответственно это при запуске через systemd попадает в лог сервиса, который просматривается через journalctl -u имясервиса А если там этого вывода нет - то уже вопрос, куда именно вы выводите сообщения? STDOUT или STDERR?
Ответ написан
ValdikSS
@ValdikSS
Скорее всего, если ваш скрипт пишет в stdout/stderr, а вы это не видите в журнале, проблема с буферизацией вывода.
Запускайте скрипт как python3 -u bot.py. Параметр -u отключает буферизацию.

-u Force the stdout and stderr streams to be unbuffered. This option has no effect on the stdin stream.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы