내 Raspbian 시스템에서 VPN 공급자와의 성공적인 OpenVPN 연결을 통해 VPN 연결이 활성화되어 있는 동안 백그라운드에서 계속 실행되어야 하는 Python 스크립트를 시작하고 싶습니다. VPN 연결이 오프라인이 되면 Python 스크립트를 종료하고 싶습니다.
내 생각은 이것이다: up
OpenVPN 구성 파일의 및 플래그는 서비스를 시작하고 중지하는 쉘 스크립트를 실행합니다. 이 서비스와down
systemd
Requires
openvpn.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
up
→ovpn_up.sh
→sudo systemctl start vpn_up.service
→ExecStart=/path/to/start_pythonscript.sh
→coding; python my_script.py
OpenVPN
down
→ovpn_down.sh
→sudo 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가 응용 프로그램을 중지/종료하려고 시도합니다.start
stop
start
ExecStop
신호 처리기