Твои действия, если компилируемая программа, выводящая метрики в терминал, не делает этого в Linux

«Твои действия, если компилируемая программа, выводящая метрики в терминал, не делает этого в Linux» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я проверяю цепочку вывода данных, начиная с приложения и заканчивая терминалом.

  1. Проверка запуска и завершения:
    # Запускаю программу в foreground и смотрю на код возврата
    ./my_metrics_app
    echo $?  # Код возврата 0 обычно означает успешное завершение
    # Если завершается мгновенно, добавляю задержку или логирую
    timeout 5 ./my_metrics_app || echo "Программа завершилась/зависла"
  2. Диагностика системных вызовов: Использую strace для отслеживания операций записи (write):
    strace -e trace=write -o trace.log ./my_metrics_app
    # Смотрю, делает ли программа вызовы write в файловый дескриптор 1 (stdout)
    grep 'write(1,' trace.log
  3. Проверка перенаправления вывода и окружения:
    # Принудительный вывод в терминал и файл одновременно
    ./my_metrics_app | tee /tmp/debug_output.log
    # Проверка, не перехвачен ли stdout демоном или systemd
    echo $TERM
    # Проверка переменных окружения, которые могут влиять на вывод
    env | grep -E "DEBUG|LOG|OUTPUT"
  4. Анализ через systemd: Если программа запущена как служба, проверяю её журнал:
    sudo journalctl -u my-metrics-service -f --no-tail

    Частая причина — буферизация вывода. В таком случае принудительно сбрасываю буфер в коде или использую флаги типа stdbuf -oL ./my_metrics_app.