@Rentable
Инженер

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

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

Подскажите, как мне при входе по SSH набрать команду и увидеть вывод работы скрипта, а именно то, что заложено в логику скрипта - Эхо, принты и всё то, что я раньше видел в консоле Pycharm
  • Вопрос задан
  • 769 просмотров
Решения вопроса 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.
Ответ написан
Ваш ответ на вопрос

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

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