Raspbianマシンで、VPNプロバイダーへのOpenVPN接続を成功させて、Pythonスクリプトを開始します。これは、VPN接続がアクティブである限り、バックグラウンドで永続的に実行する必要があります。 VPN接続がオフラインになった場合は、Pythonスクリプトを終了します。
私の考えはこれです。OpenVPNの構成ファイルのup
およびdown
フラグは、systemd
サービスを開始および停止するシェルスクリプトを実行します。そのサービスRequires
the openvpn.service
およびcannot(should not)run without without it。
複雑なのは、PythonスクリプトをVirtualenv
内で実行することです。これは、bashではalias coding="cd /home/p1/Coding/Python/Virtual/py279/bin; source activate; cd /home/p1/Coding/Python/Projects"
からアクセスできます。 Pythonファイルの場所は、後者のフォルダーです。
ただし、systemd
が上記のalias coding
のようにコマンドラインを実行できないことは私の理解です。
だから私は解決策を推測しますcouldsystemd
が.service
を実行して.sh
スクリプトを実行し、次に.py
Pythonスクリプト。
回路図:
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スクリプトの最初の行であるシバンです。次のようになります。
#!/path/to/your/virtualenv/bin/python
スクリプトが実行可能である場合(chmod +x script_name
)次に、上記の行で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
およびstart
コマンドライン引数で渡された場合に開始され、stop
で呼び出されたときに、2番目の呼び出しがstart
edアプリケーションに通知する方法を知っていることと正常にシャットダウンします。 IIRCは、ExecStop
がない場合、アプリを停止/終了しようとします。これは シグナルハンドラ でキャッチできます。