시스템 관리 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 출력 버퍼링.