타이머에 의해 트리거된 시스템 서비스가 항상 해당 프로그램을 실행하지는 않습니다.

타이머에 의해 트리거된 시스템 서비스가 항상 해당 프로그램을 실행하지는 않습니다.

시스템 타이머로 이동하려는 많은 cron 작업을 실행하는 서버가 있습니다. .service 및 .timer 파일을 생성하는 과정에서 다음과 같은 문제가 발생했습니다.CentOS에서 이 오류가 발생했습니다.(우리가 사용하고 있는). 동일한 문제가 발생하지 않도록 하기 위해 .service 파일이 시간과 환경 변수의 값만 인쇄하는 간단한 Python 스크립트를 가리키도록 선택했습니다. 며칠 동안 실행해 본 결과 타이머 자체는 제 시간에 작동했지만 때로는 실제 서비스가 실행되지 않는 경우가 있었습니다. 이것은 내 journalctl유닛 파일 의 결과입니다 .

Feb 03 15:52:28 li681-190 python3[12230]: Service "Business Script" ran at 2020-02-03 15:52:28.483885
Feb 03 15:52:28 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:53:46 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:53:46 li681-190 python3[12296]: Service "Business Script" ran at 2020-02-03 15:53:46.299353
Feb 03 15:53:46 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:55:01 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:55:01 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:56:01 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:56:01 li681-190 python3[12427]: Service "Business Script" ran at 2020-02-03 15:56:01.952895
Feb 03 15:56:01 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:57:02 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:57:02 li681-190 python3[12539]: Service "Business Script" ran at 2020-02-03 15:57:02.790428
Feb 03 15:57:02 li681-190 systemd[1]: Started business_script.py runner.

보시다시피 서비스가 테스트 스크립트를 실행하는 경우도 있고 그렇지 않은 경우도 있습니다. 여기에 설명된 대로 oneshotwith를 사용하는 데 OnUnitActiveSec문제가 있을 수 있다는 것을 알고 있습니다.systemd 문제 6680 댓글, 여전히 나에게는 잘 작동하기 때문에 이상합니다. 그런데 OnCalendar타이머가 실행될 때 항상 서비스를 시작하지 않는 일부 스크립트가 있습니다 . 내 서비스가 항상 실행되지 않는 이유는 무엇입니까? CentOS 7-6.1810을 실행 중입니다.

내 .timer 파일은 다음과 같습니다.

[Unit]
Description=Run business-script.py script every minute.
Requires=business-script.service

[Timer]
Unit=business-script.service
OnBootSec=1min
OnUnitActiveSec=1min

[Install]
WantedBy=timers.target

내 .service 파일은 다음과 같습니다.

[Unit]
Description=timer_test.py runner
After=network.target

[Service]
User=business-script-user
Group=business-script-user
Type=oneshot

WorkingDirectory=/usr/local/bin/
ExecStart=/usr/bin/python3 timer-test.py
Environment='SERVICE_NAME="Business Script"'

[Install]
WantedBy=multi-user.target

제가 작성한 Python 스크립트는 다음과 같습니다.

import datetime
import os


def main():
    service_name = os.getenv('SERVICE_NAME')
    now = datetime.datetime.now()
    print('Service {} ran at {}'.format(service_name, now))


if __name__ == '__main__':
    main()

답변1

그래서 전체 시스템을 확인하기로 결정했고 journalctl스크립트가 실제로 실행되었지만 유닛 파일에 로그인하지 않았다는 것을 발견했습니다. 내 원래 질문이 이제 올바르지 않으며 다른 문제에 대해 추가 조사가 필요하다고 생각합니다.

이 문제가 발생한 사람은 journalctl대신 journalctl -u your-unit.service서비스가 실행 중이라는 증거를 확인하세요.

관련 정보