web-dev-qa-db-ja.com

Systemd:起動/停止方法PythonスクリプトはVirtualenv内でバックグラウンドで実行する必要があります

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 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スクリプトを終了した後の適切なクリーンアップ、システムのシャットダウン/再起動などで何が起こりますか?
3
Winterflags

最初にエイリアスを単純化する必要があります。アクティブ化を行う必要はありません。重要なのは、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番目の呼び出しがstartedアプリケーションに通知する方法を知っていることと正常にシャットダウンします。 IIRCは、ExecStopがない場合、アプリを停止/終了しようとします。これは シグナルハンドラ でキャッチできます。

4
Anthon