하나의 단위로 실행되는 Python 스크립트의 출력은 순서가 없지만 셸은 영향을 받지 않는 것처럼 보입니다.

하나의 단위로 실행되는 Python 스크립트의 출력은 순서가 없지만 셸은 영향을 받지 않는 것처럼 보입니다.

시스템 관리 python2 스크립트의 모든 출력을 터미널에 나타나는 것처럼 즉시 로그에 넣을 수 있는 방법은 무엇입니까?

나는 centos 7을 사용하고 있지만 아치에서도 같은 것 같습니다.

systemd 매뉴얼에 따르면 stdout과 stderr은 자동으로 로그로 이동해야 합니다.

시스템 설정

#DefaultStandardOutput=journal
#DefaultStandardError=inherit

이건 내 단위야/usr/lib/systemd/system/tick.service

[Unit]
Description=Tick

[Service]
Type=simple
ExecStart=/home/stack/tick

스크립트

#!/usr/bin/python
import time
import sys

print "Tick"
sys.stderr.write('First error\n')
time.sleep(10)
sys.stdout.write("Tick\n")
sys.stderr.write('Second error\n')
time.sleep(10)

로그 출력입니다. 시간과 순서에 주의하세요.

Oct 30 14:30:41 controller systemd[1]: Starting Tick...
Oct 30 14:30:41 controller systemd[1]: Started Tick.
Oct 30 14:30:41 controller tick[5020]: First error
Oct 30 14:30:51 controller tick[5020]: Second error
Oct 30 14:31:01 controller tick[5020]: Tick
Oct 30 14:31:01 controller tick[5020]: Tick

Python3을 사용하면 프로세스가 끝날 때까지 stderr도 지연됩니다.

비슷한 C 프로그램을 사용해 봤는데 같은 것 같아요

그러나 이것은 bash 스크립트에는 영향을 미치지 않는 것 같습니다.

#!/bin/bash
echo "Tick"
echo "First error" 1>&2
sleep 10
echo "Tick"
echo "Second error" 1>&2
sleep 10

잡지

Oct 30 14:41:36 controller systemd[1]: Starting Tick...
Oct 30 14:41:36 controller systemd[1]: Started Tick.
Oct 30 14:41:36 controller tick[5084]: Tick
Oct 30 14:41:36 controller tick[5084]: First error
Oct 30 14:41:46 controller tick[5084]: Tick
Oct 30 14:41:46 controller tick[5084]: Second error

답변1

표준 출력은 버퍼링입니다. 아마도 시스템 리디렉션 때문일 것입니다.

쓰기 또는 PYTHONUNBUFFERED 환경 후에 sys.stdout.flush()를 추가하면 이 문제가 해결됩니다.

스택 오버플로 질문도 참조하세요.Python 출력 버퍼링.

관련 정보