X분마다 실행하려는 함수가 포함된 Python 스크립트가 있습니다.
from threading import Timer
x = 5
def control():
Timer(x*60, control).start()
rest_of_the_function()
control()
터미널의 Python 가상 환경에서 스크립트를 실행하면 아무런 문제가 없습니다. 시스템 서비스로 실행하면 control()
함수가 한 번만 호출되고 다른 작업은 수행되지 않습니다.
systemctl status myservice
내가 서비스를 통해 확인해보면긍정적인현장에서 대화하세요활동(실행). 로그에 오류가 없습니다.
/lib/systemd/system/myservice.service 파일의 내용은 다음과 같습니다.
[Unit]
Description=Short description
[Service]
Type=simple
WorkingDirectory=/home/user/myservice
ExecStart=/home/user/myservice/myvenv/bin/python main.py
[Install]
WantedBy=multi-user.target
왜 한 번만 호출됩니까 control()
? 고칠 수 있나요?
답변1
간단한 버퍼링 문제가 있는 것 같습니다. stdout(기본적으로 systemd 장치의 로그)에서 메시지를 찾는 경우, 플러시하기 전에 충분한 데이터가 인쇄될 때까지 오랜 시간 기다려야 할 수도 있습니다.
이에 대한 간단한 테스트는 -u
Python에 옵션을 추가하여 출력을 버퍼링되지 않게 만드는 것입니다. systemctl daemon-reload
서비스 단위 파일을 편집한 후에 이 작업을 수행하는 것을 잊지 마십시오 .
strace
실행 중인 Python 프로세스에 연결을 사용할 수도 있습니다 . 사용자 futex를 기다리고 있는 것을 알 수 있지만 적절한 시간이 지나면 futex 호출이 반환되는 것을 확인한 다음 다시 입력해야 합니다.
답변2
print()
다른 쓰기 파일 설명자(파일, 파이프 등)를 사용할 때 flush()
즉시 출력이 필요한 경우 버퍼를 플러시해야 합니다.
또는표준 입력,표준 출력그리고표준 에러-u
Python에 설명된 옵션을 사용하여 버퍼링되지 않은 모드를 사용할 수 있습니다.매뉴얼 페이지.