Systemd: Virtualenv 내에서 백그라운드로 실행되어야 하는 Python 스크립트를 시작/중지하는 방법

Systemd: Virtualenv 내에서 백그라운드로 실행되어야 하는 Python 스크립트를 시작/중지하는 방법

내 Raspbian 시스템에서 VPN 공급자와의 성공적인 OpenVPN 연결을 통해 VPN 연결이 활성화되어 있는 동안 백그라운드에서 계속 실행되어야 하는 Python 스크립트를 시작하고 싶습니다. VPN 연결이 오프라인이 되면 Python 스크립트를 종료하고 싶습니다.

내 생각은 이것이다: upOpenVPN 구성 파일의 및 플래그는 서비스를 시작하고 중지하는 쉘 스크립트를 실행합니다. 이 서비스와downsystemdRequiresopenvpn.service할 수 없습니다(해서는 안 된다) 그것 없이 실행.

상황을 복잡하게 만들기 위해 후자 폴더에 있는 .Python 파일의 위치를 Virtualenv​​통해 액세스할 수 있는 bash에서 Python 스크립트를 실행 하고 싶습니다 .alias coding="cd /home/p1/Coding/Python/Virtual/py279/bin; source activate; cd /home/p1/Coding/Python/Projects"

그러나 내가 아는 바로는 systemd위의 방식으로는 명령줄을 실행할 수 없습니다 alias coding.

그래서 해결책을 원해요할 수 있다Python 스크립트를 실행하는 스크립트를 systemd실행 하는 데 사용됩니다 ..service.sh.py

개략도:

OpenVPN upovpn_up.shsudo systemctl start vpn_up.serviceExecStart=/path/to/start_pythonscript.shcoding; python my_script.py

OpenVPN downovpn_down.shsudo systemctl stop vpn_up.service

내 가정에는 여기에 특히 Python 스크립트를 올바르게 종료하는 방법과 관련하여 몇 가지 주의 사항 및/또는 문제가 있다고 가정합니다.

질문:

  • 이것이 가능한가?
  • 이 작업을 수행하려면 서비스 파일과 서비스 명령의 어떤 부분이 필요합니까?
  • Python 스크립트를 종료한 후 적절한 정리, 시스템이 종료/다시 시작되면 어떻게 되는지 등 전반적인 배열에 대해 특별히 고려해야 할 사항이 있습니까?

답변1

먼저 별칭을 단순화해야 하며 활성화 작업을 수행할 필요가 없습니다. 중요한 것은 Python 스크립트의 첫 번째 shebang 줄입니다. 그것은해야한다:

 #!/path/to/your/virtualenv/bin/python

스크립트가 실행 가능한 경우( chmod +x script_name) 위 행은 virtualenv에 설치된 Python이 호출되고 virtualenv에 설치된 패키지를 가져오는 것을 확인합니다.

스크립트에 대한 별칭을 생성하거나 PATH의 디렉터리에 스크립트를 배치할 수 있습니다.


systemd 서비스 파일에서는 스크립트의 전체 경로를 사용해야 합니다. 이러한 스크립트는 다음과 같습니다.

[Unit]
Description=your program description
Requires=any services that need to be installed
After=run after this service

[Service]
Restart=always
ExecStart=/root/bin/application start
ExecStop=/root/bin/application stop

[Install]
WantedBy=multi-user.target

위의 내용은 Python 스크립트가 이미 존재하고 명령줄 인수가 전달 /root/bin/application되면 시작되고 를 사용하여 호출될 때 두 번째 호출은 어떻게든 애플리케이션에 알리고 정상적으로 종료되는 방법을 알고 있다고 가정합니다. systemd가 없으면 IIRC가 응용 프로그램을 중지/종료하려고 시도합니다.startstopstartExecStop신호 처리기

관련 정보