問題の説明
私のフラスコ プログラムでは、別の python プログラム - test.py を開始します。
os.system('nohup python /opt/test/test.py >/dev/null 2>&1 &')
フラスコ プログラムを終了して再度開始すると、ポートが占有されているというエラーが報告されます。
Port 5000 is already in use
そして、私の 5000 ポートを占有するプログラムは、まさに私がフラスコで実行する test.py プログラムです
解決策 1: ポートを占有しているプロセスを強制終了する
最初に netstat コマンドを実行して、ポート 5000 を占有する pid を見つけ、次にプロセスを強制終了し、flask を再起動します。
netstat -npl |grep 5000
tcp 0 0 1xx.1xx.xx.xx:5000 0.0.0.0:* LISTEN 9345/python
kill -9 9345
基本的に、この方法はインターネット上でさまざまな方法でコピー アンド ペーストされます. 問題を解決することはできますが、最初に起動した test.py プログラムを強制終了する必要があります. 明らかに、これでは根本的な問題は解決しません.
解決策 2: python コマンドの送信方法に切り替える
現在の問題の鍵は、フラスコで開始したプログラムが常にポート番号を占有する理由です. 継続的な実験の後、最終的に問題を発見しました: ポート番号が占有されている理由は、送信コマンドを使用したためです:
os.system('nohup python /opt/test/test.py >/dev/null 2>&1 &')
os.system で送信すると、実行中の test.py プログラムがフラスコ プロセスによって管理されるサブプロセスであることがわかります。そのため、フラスコが終了しても、このサブプロセスは私の 5000 ポート番号を引き続き占有します。
したがって、代わりに次の方法で提出します。
subprocess.Popen('nohup python /opt/test/test.py >/dev/null 2>&1 &', shell=True)
subprocess は Python 2.4 の新しいモジュールで、flask プロセスとは関係のない新しいプロセスを生成できるため、ポート占有の問題を根本的に解決します。
サブプロセス