マンガでよめる痔のこと・薬のこと

以下の手順で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クライアント

このQ&Aに関連する最新のQ&A

A 回答 (1件)

直接の回答ではないのですが、なぜ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以降のログが出力されない。

補足日時:2006/12/14 17:34
    • good
    • 1

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QFTPコマンドでディレクトリごとファイル移動できるコマンドはありますか?

タイトルどおりなのですが、FTPでファイルを転送する際に、サブフォルダを含むディレクトリごとファイル転送するコマンドはありますでしょうか。
ディレクトリの中にあるすべてのファイルを移動したいのですが、サブフォルダがたくさんあるので、わざわざディレクトリの場所へ移動してmputを繰り返すのはめんどうで仕方ありません。
よろしくお願いします。

Aベストアンサー

ご使用になるOS環境が書いてないのですが、Linux,BSD等ならncftpで、get -R dir。
Windowsならffftpを使えば良いと思います。

QFTPによるファイル取得について

一定の間隔であるサーバに接続し、画像ファイルを取得するプログラムを作成しています。

C言語で作成されたプログラムより、以下のようなシェルを実行し、画像ファイルを取得することを考えています。

-----------------------------
#!/bin/sh

ftp -in <<EOL
open 接続先IPアドレス
user ユーザ名 パスワード
lcd ローカルのディレクトリ
cd リモートのディレクトリ
mget data[ABC]_${d}.tar.gz
quit
EOL
-----------------------------

ここで、以下のような問題に悩んでいます。
1.上記シェルを実行し、まさにFTPを行っているとき、LAN断などにより遠隔サーバとの接続が切れたときに、だんまり状態となってしまう。

2.FTPが成功した場合、取得したファイルの正当性が保証されるのか?せめてファイルサイズチェックだけでも行いたいが、FTP実行前にファイルのサイズが取得できるか?

Aベストアンサー

サンプルを見てようやく分かりました。
ご提示ありがとうございます。

c側からsystemで起動したftpのプロセスを殺したいということでよろしいでしょうか?

この場合は PPIDを検索すればよいのです。
切断するだけのプロセスを起動したほうが楽なのかもしれません。

例えば コマンド名を killchild 親のPID番号 として、fork/execを使用してftpを起動します。
このときにforkされたPIDは認識できると思います。

次に時間が経過した場合に、killchild をsystem()で呼び出します。引数は先ほどのPID番号です。

killchild では、ps -e により全プロセスを取得し、その中でPPIDが引数(ftpの親のPID)と一致するものを検索してそのプロセスを強制切断する

これでいけると思うのですが、いかがでしょうか?

Qftpのmgetコマンドの自分の格納場所の指定方法は?

先日、ftpコマンドについてこのサイトで色々教えていただき感謝しております。

複数のファイルを受信するのにmgetコマンドを教えていただいたのですが、
相手より受信した場所の格納場所の指定が上手くいきません。

先方にFTPとしてログインでき、"PROMPT"→"MGET *"と行うのですが、受信したファイルの格納場所がCドライブの直下になってしまいます。
自分のインターネットサービスマネージャーの
ルートは別のフォルダに設定してあるのですが、これは受信したデータの初期値にはならないのでしょうか?
また、調べたところ省略すると、ワーキングディレクトリに作成されるみたいにかかれていましたが、ワーキングディレクトリはどこかで指定できるのでしょうか?

たとえばC:\AAAに受信したファイルを格納したい場合はどうやって書けばよいでしょうか?

MGET * C:\AAA見たいに色々試して見ましたが、駄目でした。

Aベストアンサー

方法は2つあります。

(1)データを格納するディレクトリに移動してからftpを起動させる。

cd 格納先ディレクトリ
ftp ホスト名
mget *

(2)ftpした後格納するディレクトリを指定する方法

ftp ホスト名
lcd 格納先ディレクトリ(自分のマシン)
mget *


lcd とは、"Local Change Directory" と思っておくと忘れなくていいですよ♪

QFTPで書き込み中のファイルの完了を知りたい

FTPで書き込み中のファイルがあるとします。そのファイルが、書き込み中なのか、それとも、書き込みが完了したのかを、知りたいのですが、良い方法はありますでしょうか。書き込みファイル名はあらかじめ、わかっています。(書き込み中に読んだ場合、最後まで読み切ることが出来ないために書き込み完了迄待ちます)当方で、調査した限りでは、ファイル名を指定して、そのファイルが、他プロセスによってオープンされているか否かを知るシステムコールは存在しませんでした。OSは、sun solaris10を使用の予定ですが、UNIX系(linux含む)で実現可能であれば、かまいません。

Aベストアンサー

一般のUnix系のOSで、fopen() でチェックできるかどうかは疑問です^^

たしかに、Unix系のOSで、ファイルをオープンしているプロセスがあるかどうかを調べられるような標準的なシステムコールがあるという話は、あまり聞かないですよね。

http://www.mlb.co.jp/linux/mld-ml/200206/msg00028.html ←存在しないのがほんとに真実かどうかは知りませんが^^

ftp の際、get してくるファイルのサイズ情報をどこかに出力しておいて、そのサイズに達したか否かで、「書き込み中か、書き込み完了か」を判定するのがもっともポータブルな方法かと^^

※ 最初に lseek などして、見掛けのサイズを大きくしておいてから rewind して実際に書き込みを始めるみたいなことしてる ftp の実装なんてあるとまずいですけど^^;

Q-bash: ftp: コマンドが見つかりません

ftpでファイルを転送したいのですが、現在出来ておりません。
因みにその端末(サーバ)は外部からのftpのやり取りも必要な為、vsftpdをインストールしています。
試しに、コマンドでftpと入力した時に題目のようなエラーが表示されます。

Linuxはまだ経験が殆ど無く、シェルに関してもまだ分かりません。

ftpクライアントのインストールとか必要でしょうか?
それとも何か追加設定が必要でしょうか?

途中のファイアーウォール機器では通過の設定ができております。

教えていただけますでしょうか。
宜しくお願い致します。

Aベストアンサー

echo ${PATH}

として、パス(コマンドサーチパス)を確認してみてください。

その上で、

find / -name ftp -print > /tmp/find.log

として、「ftp」コマンドがどこのディレクトリにあるかを確認してください。
※ エラーメッセージ(~:許可がありません)が出力されますが、無視してください。

cat /tmp/find.log

/usr/kerberos/bin/ftp
/usr/bin/ftp


そのあとで、「/etc/profile」に、「ftp」コマンドが存在するディレクトリを追記してください。

最終行に追加
PATH=/usr/kerberos/bin:/usr/bin:$PATH

いったん、ログアウトしてログインして、パスが追加できてるかを確認してください。
echo ${PATH}

追加できてれば、「ftp」コマンドが使えるようになっているはずです。

QFTPエラー425

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTertermでログインしてlocalhostにftpするとlsできるので、
ftpd自体に問題はなさそうです。
また、サーバー側の設定は直しておらず、突如動かなくなったので、
クライアントのファイアウォール設定が変わったのを疑っていますが、
ファイアウォールを一時停止しても解消しませんでした。
どこが悪いか原因を切り分けられるずに困っています。
原因箇所を調べる良い方法があればご教示ください。

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTerterm...続きを読む

Aベストアンサー

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッセージです。

クライアントソフトはActive FTPで接続しようとしているものの、サーバ側がActive FTPを恐らくサポートしていないので、「Passiveモードに移行してよ」とメッセージを出した。にも関わらずクライアントはPASVコマンドを実行することもなく、LISTコマンドを実行したので「425 Failed to establish connection」、つまり「だぁかぁらぁ、データセション張ってないんだから」と返したわけです。

「Passiveモードでの使用を検討して下さい」というメッセージは柔らかな表現ですが「いいか、俺はPassiveモードしか受け付けないからな。次はPASVコマンドを打てよな。それ以外は知らんからな」と等価です。まぁ、QUITやBINARYやASCII等は受け付けてくれるとは思いますが。

>またサーバーが20番ポートにセッションを張ろうとしている形跡がありませんでした。
>これはPASVモードになっているのでしょうか?

サーバは少なくともPassiveモードしかサポートしていないようです。なので、サーバからクライアントの20/TCPにはコネクションを張らずに、21/TCPでクライアントからのPASVコマンド待ちです。PASVコマンドがクライアントから来れば、21/TCPでEntering Passive Mode (X,X,X,X,A,B)を返しますので、クライアントはサーバの(A*256+B)/TCPポートに対してSYNを送信、所謂3ウェイハンドシェイクでデータセションが繋がるという流れになります。

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッ...続きを読む

QFTPでタイムアウトになる

RedHatLinuxのサーバ間でFTP転送しようとしています。
例えばAとBとCというサーバがあったとします。
OSは全てRedHatLinuxでAとBは7.1、Cは7.3です。
FTPサーバは全てwu-ftpdです。
FTPコマンドで接続し、putで転送しようとしていて、BからAへの転送は正常にできます。
CからAに行おうとすると、接続は問題無いのですが、ファイル転送の際、数分後に「Connection Timed out」と出てしまい転送できません。
CからBに転送しようとしても同様のエラーでできませんでした。
ちなみにAとB及びCの間にファイアウォールが設定されていますが、BからもCからも通す設定にしていますし、
接続が正常にできるのでこれは問題ないと思うのです。BとCの間にはありません。
アクセス制限によるものかと思いましたが、特に制限していないですし、
一応ftphosts、tpusers、ftpgroupsやhosts.allow、hosts,denyファイルを確認してみたのですが、特に
これと思われるものがありませんでした。
転送するファイルのアクセス権限を色々いじってたので、これが原因かとも思いましたが、
BからAに転送したものと同様に変更してみましたが、ダメでした。
何が原因なのでしょうか。

RedHatLinuxのサーバ間でFTP転送しようとしています。
例えばAとBとCというサーバがあったとします。
OSは全てRedHatLinuxでAとBは7.1、Cは7.3です。
FTPサーバは全てwu-ftpdです。
FTPコマンドで接続し、putで転送しようとしていて、BからAへの転送は正常にできます。
CからAに行おうとすると、接続は問題無いのですが、ファイル転送の際、数分後に「Connection Timed out」と出てしまい転送できません。
CからBに転送しようとしても同様のエラーでできませんでした。
ちなみにAとB及びCの間にファイアウ...続きを読む

Aベストアンサー

#5お礼より
>>PASVをオンにしたらではないでしょうか?
>いえ、やっぱりオフにすると転送できます。
>
そうでしたか。それは失礼しました。
iptablesの設定内容がわからないので、たぶんinは不許可にしているとふんだのですが...^ ^;;

ということで、#6の方もiptablesについて回答されていますが
まずはiptabelsの設定について確認されるといいでしょう。
ipchainsとの比較も含めて以下が参考になると思います。
http://tlec.linux.or.jp/docs/iptables.html


iptables設定については以下のものもいいでしょう。
http://www.atmarkit.co.jp/flinux/rensai/security05/security05a.html


実際に"ip_conntrack_ftp"(NATを使わないならこれだけでOK)を使って
接続の追跡(ステートフルインスペクションなんかと言われます)を行うなら、以下の設定を。
http://www.sns.ias.edu/~jns/security/iptables/iptables_conntrack.html#FTP

参考URL:http://tlec.linux.or.jp/docs/iptables.html

#5お礼より
>>PASVをオンにしたらではないでしょうか?
>いえ、やっぱりオフにすると転送できます。
>
そうでしたか。それは失礼しました。
iptablesの設定内容がわからないので、たぶんinは不許可にしているとふんだのですが...^ ^;;

ということで、#6の方もiptablesについて回答されていますが
まずはiptabelsの設定について確認されるといいでしょう。
ipchainsとの比較も含めて以下が参考になると思います。
http://tlec.linux.or.jp/docs/iptables.html


iptables設定については以下のものも...続きを読む

QFTPの送信結果を検知したい

WindowsでFTPをバッチファイルから呼び出すことを考えています。FTPで送信エラーが発生した場合に、FTPのエラーとして検知したいのですが、その方法をご存じのかたおりましたら教えて下さい。(Windows-NTで標準で提供されるFTPを使用しています)直接私が確認したわけではありませんが、FTP送信でエラーが発生してもFTPの終了コードが0になってしまうらしく、FTPのエラーを検知できないそうです。WindowsであればWindows-NT以外の環境でもかまいませんので、ご存じのかたおりましたら教えて下さい。

Aベストアンサー

標準のツールでやるなら、ftpコマンドの出力をファイルにリダイレクトして、find か findstr コマンドで適当な文字列の有無で判断するしかないですね。

>FTPで転送後に転送先のホスト内のある処理が自動的に動き
とのことですが、転送先ホストで単純にデータファイルの有無で先に進むと、転送途中のファイルを読んだり、転送エラーで途中で終わったファイルを読んだりする可能性があるので、普通は、転送元でデータファイルの正常転送を確認後に目印ファイル(中身は空でよい)を送り、転送先では目印ファイルがあることでデータファイルが正しく受信できたことを判断して目印ファイルを消して先に進む(データファイルを処理する)のが良く使われる手法です。

QUNIXからWindowsへのファイル転送

UNIXからWindowsサーバーへFTP以外でファイル転送をしようと考えています。

方法としてはSFTPがあると思いますが、
Windowsサーバー側に条件はなにがありますでしょうか?
IISでFTPを構築しないとだめでしょうか?

UNIXでsftpコマンドは実行できることを確認しています。

また、逆のパターンとして
WindowsサーバーからUNIXサーバーへWinSCPでのファイル転送の場合は
WinSCPを導入するだけでよいでしょうか?
転送する側でIISでのFTP設定も必要でしょうか?

初歩的な質問で申し訳ございませんが、
ご教授の程よろしくお願いいたします。

Aベストアンサー

通信を暗号化する必要がなければ、smbclient コマンドでWindows側の共有フォルダへputするのが簡単だと思います。
Linuxだとパッケージで導入出来るはず。Unixだとsambaがサポートされていれば付いているかも。無ければソースからインストールなのでやや面倒か。

smbclient -U ユーザ名 '\\サーバ名\共有名'
詳しくはmanを。

もしくは、管理者権限で動作させて良いなら、Windowsの共有フォルダをマウントして、書き込むか。
mount -t cifs -o user=ユーザ名 //サーバ名/共有名 /mnt先


SFTPを使うならWindows側にsshサーバが必要です。SFU(Service For Unix)をインストール使うのかな?

>WindowsサーバーからUNIXサーバーへWinSCPでのファイル転送の場合は

UNIX側でsshサーバが上がっていれば、Windows側はクライアントがあればいいです。

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング