스크립트를 시스템 서비스로 실행하려면 어떻게 해야 합니까?

스크립트를 시스템 서비스로 실행하려면 어떻게 해야 합니까?

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 장치의 로그)에서 메시지를 찾는 경우, 플러시하기 전에 충분한 데이터가 인쇄될 때까지 오랜 시간 기다려야 할 수도 있습니다.

이에 대한 간단한 테스트는 -uPython에 옵션을 추가하여 출력을 버퍼링되지 않게 만드는 것입니다. systemctl daemon-reload서비스 단위 파일을 편집한 후에 이 작업을 수행하는 것을 잊지 마십시오 .

strace실행 중인 Python 프로세스에 연결을 사용할 수도 있습니다 . 사용자 futex를 기다리고 있는 것을 알 수 있지만 적절한 시간이 지나면 futex 호출이 반환되는 것을 확인한 다음 다시 입력해야 합니다.

답변2

print()다른 쓰기 파일 설명자(파일, 파이프 등)를 사용할 때 flush()즉시 출력이 필요한 경우 버퍼를 플러시해야 합니다.

또는표준 입력,표준 출력그리고표준 에러-uPython에 설명된 옵션을 사용하여 버퍼링되지 않은 모드를 사용할 수 있습니다.매뉴얼 페이지.

관련 정보