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 up→→→→ovpn_up.shsudo systemctl start vpn_up.serviceExecStart=/path/to/start_pythonscript.shcoding; python my_script.py

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

おすすめ記事