私の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
に開始され、を使用して呼び出されると、2番目の呼び出しは何らかの方法でアプリケーションに通知され、正常に終了する方法を知っていると仮定しています。 systemdがない場合、IIRCはアプリケーションを停止/終了しようとします。start
stop
start
ExecStop
信号ハンドラ