시스템 서비스가 Python 코드를 실행하고 오류 코드 상태 1로 종료됩니다.

시스템 서비스가 Python 코드를 실행하고 오류 코드 상태 1로 종료됩니다.

_note: 원래 게시된 질문이 편집되어 모양이 크게 변경되었습니다!

요약:

apshceduler를 사용하는 Python 스크립트가 종료 코드 staus1을 사용하여 서비스로 로드되지 않습니다. while True:동일한 작업을 수행하기 위해 apscheduler를 사용하지 않고 10초마다 실행되도록 설계된 동일한 스크립트의 구문이 데몬(서비스)으로 잘 실행된다는 점에 유의하는 것이 중요합니다 .


세부 사항

나는 간단한 test.py 프로그램을 작성했습니다. 10초마다 "some" 문자열이 포함된 일부 a.txt 파일을 추가합니다. 데몬 서비스로 실행하려고 하면 오류 코드가 발생합니다. . 코드 자체는 데몬(서비스)으로 사용하지 않고도 잘 작동합니다. 그리고 test.py 파일 작성시 apscheduler를 사용하지 않으면 서비스가 원활하게 실행됩니다.

다음을 포함한 자세한 내용을 위해 여기에 모든 코드를 입력하겠습니다.systemctl status

#!/usr/bin/env python3
import os, glob, shutil
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
def test():
    appendFile = open(r'/home/sangharsh/code/a.txt', 'a')
    appendFile.write("Jai Bhim \n" )
    appendFile.close()
sched.add_job(test, 'interval', seconds=10)

sched.start()

데몬으로 실행 하려면 /home/sangharsh/code/workingWithFiles/ 서비스 파일을 생성합니다.

[Unit]
Description=Test Service
After=multi-user.target
[email protected]

[Service]
Type=simple
ExecStart=/usr/bin/env python3 /home/sangharsh/code/workingWithFiles/test.py
StandardInput=tty-force

[Install]
WantedBy=multi-user.target

파일은 에 있습니다 /lib/systemd/system/.

데몬을 다시 시작합니다.

sudo systemctl daemon-reload

그런 다음 test.service 파일을 활성화하십시오 -

sudo systemctl enable test.service

test.service를 시작하십시오.

sudo systemctl start test.service

그리고 상태를 확인해보세요

sudo systemctl status test.service

공연 systemctl status:

● test.service - Test Service
   Loaded: loaded (/lib/systemd/system/test.service; enabled; vendor preset: ena
   Active: failed (Result: exit-code) since Tue 2019-07-09 22:57:31 IST; 8min ag
  Process: 4750 ExecStart=/usr/bin/env python3 /home/sangharsh/code/workingWithF
 Main PID: 4750 (code=exited, status=1/FAILURE)

Jul 09 22:57:31 sangharsh-HP-240-G4-Notebook-PC systemd[1]: Started Test Service
Jul 09 22:57:31 sangharsh-HP-240-G4-Notebook-PC systemd[1]: test.service: Main p
Jul 09 22:57:31 sangharsh-HP-240-G4-Notebook-PC systemd[1]: test.service: Failed

'sudo Journalctl -xe'의 출력은 다음과 같습니다.

Subject: Unit failed
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- The unit test.service has entered the 'failed' state with result 'exit-code'.
Jul 13 02:12:23 sangharsh-HP-240-G4-Notebook-PC sudo[18333]: sangharsh : TTY=pts/0 ; PWD=/home/sangharsh ; USER=root ; COMMAND=/bin/systemctl status test.service
Jul 13 02:12:23 sangharsh-HP-240-G4-Notebook-PC sudo[18333]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jul 13 02:12:38 sangharsh-HP-240-G4-Notebook-PC systemd-resolved[856]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP.
Jul 13 02:13:11 sangharsh-HP-240-G4-Notebook-PC sudo[18333]: pam_unix(sudo:session): session closed for user root
Jul 13 02:13:53 sangharsh-HP-240-G4-Notebook-PC sudo[18364]: sangharsh : TTY=pts/0 ; PWD=/home/sangharsh ; USER=root ; COMMAND=/usr/bin/pip3 install apscheduler
Jul 13 02:13:53 sangharsh-HP-240-G4-Notebook-PC sudo[18364]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jul 13 02:13:55 sangharsh-HP-240-G4-Notebook-PC sudo[18364]: pam_unix(sudo:session): session closed for user root
Jul 13 02:14:13 sangharsh-HP-240-G4-Notebook-PC systemd-resolved[856]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP.
Jul 13 02:15:13 sangharsh-HP-240-G4-Notebook-PC sudo[18378]: sangharsh : TTY=pts/0 ; PWD=/home/sangharsh ; USER=root ; COMMAND=/bin/journalctl -xe
Jul 13 02:15:13 sangharsh-HP-240-G4-Notebook-PC sudo[18378]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jul 13 02:16:02 sangharsh-HP-240-G4-Notebook-PC sudo[18378]: pam_unix(sudo:session): session closed for user root
Jul 13 02:16:32 sangharsh-HP-240-G4-Notebook-PC sudo[18388]: sangharsh : TTY=pts/0 ; PWD=/home/sangharsh ; USER=root ; COMMAND=/bin/journalctl -xe test.service
Jul 13 02:16:32 sangharsh-HP-240-G4-Notebook-PC sudo[18388]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jul 13 02:16:32 sangharsh-HP-240-G4-Notebook-PC sudo[18388]: pam_unix(sudo:session): session closed for user root
Jul 13 02:16:44 sangharsh-HP-240-G4-Notebook-PC sudo[18390]: sangharsh : TTY=pts/0 ; PWD=/home/sangharsh ; USER=root ; COMMAND=/bin/journalctl -xe
Jul 13 02:16:44 sangharsh-HP-240-G4-Notebook-PC sudo[18390]: pam_unix(sudo:session): session opened for user root by (uid=0)
~
~

나는 언급했다이것질문. 이 옵션을 시도했지만 도움이 되지 않았습니다.

안내해주세요.

몇 가지 설명

혼란을 피하기 위한 몇 가지 설명 -

  1. test.py 스크립트를 실행해 보았는데 잘 작동합니다. "a.txt" 파일에 메시지를 쓸 수 있습니다. 따라서 코드는 성공합니다.
  2. 나는 또한 다른 방법을 시도했다. "apscheduler"를 제거하고 대신 구문을 사용해 보았습니다 while True. 이런 식으로 데몬을 실행할 수 있었습니다. 이 경우 출력이 systemctl status활성화됩니다. "a.txt" 파일에서 ugo에 rwx 권한을 부여한 후 서비스 파일로 실행할 수 있었습니다(위 요약에서 언급한 대로).

답변1

시스템 단위 파일의 다음 줄은 여전히 ​​잘못되었습니다.

ExecStart=/usr/bin/env/python3 /home/sangharsh/code/workingWithFiles/test.py

/usr/bin/env/python3나는 그것이 당신의 시스템에 존재하지 않는다고 확신합니다. 이것은 Mulu의 첫 번째 댓글과 같은 질문입니다.

답변2

백그라운드에서 실행해야 하기 때문에 BlockingScheduler으로 변경되었습니다 .BackgroundScheduler

BlockingSchedulersystemd에서 사용할 수 없는 활성 터미널이 필요합니다.

관련 정보