- 締切済み
FTP転送中断について
以下の手順でFTP転送を中断した場合に、直ぐに転送が中断が中断されなくて(セッションがクローズされない)困っています。直ぐに中断できる方法を知っている方、教えてください。 [1]8台のクライアントから同時にFTP転送を要求する。 [2]8台分の転送中に4台でFTPクライアントをSIGKILLで強制終了させる。 [3][2]の直後に4台のFTPクライアントから[1]とは別のデータ転送を要求する。 このときに、2台分のFTPクライアントでNotConnectedとなってしまいます。理由は、SIGKILLでFTPセッションをクローズしようとしたが、クローズしきれずに、8本のセッション+4本のセッションを同時接続しようとして、FTPライセンス数オーバー(8+4>10)により、接続できないようです。 また、調査の結果、SIGKILL時に別クライアントの転送処理が実行されている場合、その転送が完了するまで、SIGKILLをサーバー側で検知してくれません。別クライアントの転送処理が全く実行されていない場合は、SIGKILL直後にサーバー側で即座に転送中断&セッションクローズをしてくれます。 データ転送の有無に因らず、FPTクライアントの転送中断を即座に確実に実行する方法がありましたら教えてください。 とにかくやりたいことは、「8本転送中に、4本を直ぐ止めて、直ぐに別の4本のデータを転送したい」です。 <環境> FTPサーバー(WindowsPC×1台):WindowsXPのIISのFTP *IISのFTPサーバーは最大10本の同時接続が可能。 FTPクライアント(LINUXPC×8台):LINUXのFTPクライアント
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- ham_kamo
- ベストアンサー率55% (659/1197)
直接の回答ではないのですが、なぜSIGTERMでなくてSIGKILLなのでしょうか? 通常のプロセスはSIGTERMを受けると終了のための処理を行ってから終了します。(ちゃんとSIGTERMをハンドリングしていれば、ですが) しかし、SIGKILLでは強制的にOSがプロセスを停止してしまい、適切な終了処理が行われません。一般的には、プロセスを中断させるときにはまずSIGTERMやSIGINTで試し、それでもプロセスが停止しないときにSIGKILLを使うべきです。 もしFTPクライアントがSIGTERMを受け取るとセッションの中断をサーバに伝えるような仕様になっているのなら、SIGKILLでなくSIGTERMに変えると、うまくいくかもしれません。(FTPの内部プロトコルについて詳しくないので、この辺は想像の域に過ぎませんが)
補足
なぜ、SIGKILLなのかは既に担当された方が不在で、その経緯を把握しきれていません。SIGINTではすぐに止まってくれないので、SIGKILLにしたぐらいのことしか分かっていません。 以下のとおり7種類のシグナルによりFTPクライアントを停止させた時の、クライアント側、サーバー側双方の動作を確認して見ました。 SIGKILL、SIGTERM、SIGUSR1、SIGUSR2の4種類は即クライアント、サーバー共に停止できた。ただし、裏で別のデータ転送が走っていると、サーバー側の転送中断が直ぐに実行されない。 このように、どうやったら、クライアント、サーバー双方を即座に停止できるのかまだ分かっていません。 (凡例) [1-N]FTP中断シグナルの種類 [2-N]中断時のクライアント動作 [3-N]中断時のサーバー動作 *N=1~7の整数値(シグナルを7種類試した) (実験結果) [1-1]SIGKILL [2-1]即座に転送データの受信を中断する。プロセスリストからFTPクライアントが即消える。 [3-1]クライアントのSIGKILLと同時に即座に426で転送中断完了する。 [1-2]SIGINT [2-2]即座に転送データの受信を中断する。ただし、FTPクライアントは転送完了後も残り続ける。15分後(900秒後)にタイムアウトによりFTPクライアントが消える。 [3-2]ABORTを受信して、ABORT処理を完了させる。ただし、ABORT完了までの時間=転送完了までの時間のため、転送完了を待って、ABORT完了としているものと思われる?タイムアウトによりセッションのクローズが完了する。 [1-3]SIGTERM [2-3]即座に転送データの受信を中断する。プロセスリストからFTPクライアントが即消える。 [3-3]クライアントのSIGTERMと同時に即座に426で転送中断完了する。 [1-4]SIGUSR1 [2-4]即座に転送データの受信を中断する。プロセスリストからFTPクライアントが即消える。 [3-4]クライアントのSIGTERMと同時に即座に426で転送中断完了する。 [1-5]SIGUSR2 [2-5]即座に転送データの受信を中断する。プロセスリストからFTPクライアントが即消える。 [3-5]クライアントのSIGTERMと同時に即座に426で転送中断完了する。 [1-6]SIGSTOP [2-6]即座に転送データの受信を中断するが、プロセスリストからFTPクライアントが消えない。 [3-6]転送しない。USER,PASS以降のログが出力されない。 [1-7]SIGTSTP [2-7]即座に転送データの受信を中断するが、プロセスリストからFTPクライアントが消えない。 [3-7]転送しない。USER,PASS以降のログが出力されない。