python 스크립트 충돌을 방지하기 위해 systemd 사용

python 스크립트 충돌을 방지하기 위해 systemd 사용

내 Raspberry Pi(Stretch OS)에서 여러 Python 스크립트가 충돌하는 것을 방지하고 싶습니다.

이것이 방지하기 위해 시스템 파일을 구현한 것인지 명확히 하고 싶습니다.많은 종류의 파이썬스크립트 충돌을 방지하세요. 서비스 파일의 서비스 섹션에서 일반적인 형식은 다음과 같습니다.

[Service]
ExecStart=/path/too/script
Restart=always

하지만 달리고 있으니까여러 비단뱀스크립트를 작성하려면 경로 앞에 Python을 추가하고 서비스 부분을 쌓아야 할 것 같습니다. 내가 틀렸다면 정정해주세요.

내 현재 스크립트(constantrun.service)는 다음과 같습니다.

[Unit]
Description='python scripts that needs to be run constantly'

[Service]
ExecStart=python /home/pi/projects/script1.py
Restart=always
[Service]
ExecStart=python /home/pi/projects/script2.py
Restart=always
[Service]
ExecStart=python /home/pi/projects/script3.py
Restart=always

[Install]
WantedBy=multi-user.target

그러나 을 사용하여 실행하려고 하면 sudo systemctl start constantrun.service다음 오류가 발생합니다.

Failed to start constantrun.service: Unit constantrun.service is not loaded properly: Invalid argument.
See system logs and 'systemctl status constantrun.service' for details.

로그를 열어보니 다음과 같았습니다.

● constantrun.service - 'python scripts that needs to be run constantly'
   Loaded: error (Reason: Invalid argument)
   Active: inactive (dead)

Feb 18 17:15:12 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:11] Executable path is not absolute, ignoring: python /home/pi/P
Feb 18 17:15:12 raspberrypi systemd[1]: constantrun.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
Feb 18 17:20:17 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:5] Executable path is not absolute, ignoring: python /home/pi/Pr
Feb 18 17:20:17 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:8] Executable path is not absolute, ignoring: python /home/pi/Pr
Feb 18 17:20:17 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:11] Executable path is not absolute, ignoring: python /home/pi/P
Feb 18 17:20:17 raspberrypi systemd[1]: constantrun.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
Feb 18 17:20:33 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:5] Executable path is not absolute, ignoring: python /home/pi/Pr
Feb 18 17:20:33 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:8] Executable path is not absolute, ignoring: python /home/pi/Pr
Feb 18 17:20:33 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:11] Executable path is not absolute, ignoring: python /home/pi/P
Feb 18 17:20:33 raspberrypi systemd[1]: constantrun.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.

위의 코드를 어떻게 수정하여 제대로 작동하게 할 수 있나요? 또한 Python 라이브러리에 경로를 추가해야 합니까 PYTHONPATH=/home/pi/.local/lib/python2.7/site-packages?

저는 Linux 환경을 처음 접했고 이에 대한 조언을 주시면 정말 감사하겠습니다!

답변1

귀하의 서비스는 다음과 같이 정의됩니다.

[Service]
ExecStart=python /home/pi/projects/script1.py
Restart=always

각 오류 메시지는 다음과 같습니다.

Executable path is not absolute, ignoring: python /home/pi/...

의 경우 systemd서비스 정의의 "실행 가능"은 입니다 python. 이는 분명히 절대 경로가 아닙니다. 이는 /home/pi/projects/script1.py이 실행 파일에 대한 매개 변수일 뿐이며 python, 올바른 형식을 관리하는 것이 실행 파일의 임무입니다.

Python 관련 환경 변수(예: 사용자)는 PYTHONPATH전혀 의미가 없습니다.systemd~ 해야 하다매번 서비스 정의의 실행 파일에 대한 절대 경로를 제공하십시오.

일반적으로 Python 인터프리터의 절대 경로는 이지만 /usr/bin/python다음을 확인할 수 있습니다.

$ type python
python is /usr/bin/python

따라서 서비스 정의는 다음과 같아야 합니다.

[Service]
ExecStart=/usr/bin/python /home/pi/projects/script1.py
Restart=always

systemd에 대한 매우 유용한 소개는 여기에서 찾을 수 있습니다. Telegram 봇을 Python 스크립트로 실행하고 유지합니다.

관련 정보