• ベストアンサー

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

一定の間隔であるサーバに接続し、画像ファイルを取得するプログラムを作成しています。 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実行前にファイルのサイズが取得できるか?

質問者が選んだベストアンサー

  • ベストアンサー
  • m_mik
  • ベストアンサー率26% (31/117)
回答No.4

サンプルを見てようやく分かりました。 ご提示ありがとうございます。 c側からsystemで起動したftpのプロセスを殺したいということでよろしいでしょうか? この場合は PPIDを検索すればよいのです。 切断するだけのプロセスを起動したほうが楽なのかもしれません。 例えば コマンド名を killchild 親のPID番号 として、fork/execを使用してftpを起動します。 このときにforkされたPIDは認識できると思います。 次に時間が経過した場合に、killchild をsystem()で呼び出します。引数は先ほどのPID番号です。 killchild では、ps -e により全プロセスを取得し、その中でPPIDが引数(ftpの親のPID)と一致するものを検索してそのプロセスを強制切断する これでいけると思うのですが、いかがでしょうか?

mkob
質問者

お礼

ありがとうございました。 ps -e で親のPIDを見れたのですね^^;; なんとかなりそうです。 感謝します。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • m_mik
  • ベストアンサー率26% (31/117)
回答No.3

子プロセスのPIDが取得できないということでしょうか? 子プロセスのPIDは$!で取得できると思いますが…

mkob
質問者

補足

なんかちょっと違う気がします^^;; プロセスAが以下の処理だったとします。 main(){ 処理(1) system("ftp XXXXX"); 処理(2) ・・・ ・・・ return; } systemコマンドにて、ftpを実行しています。 で、FTPの実行中にプロセスAに対して終了シグナルを発行したときに、実行中のFTPプロセスが残ったままとなってしまうのです。 これをKillする方法を知りたいのです。

すると、全ての回答が全文表示されます。
  • m_mik
  • ベストアンサー率26% (31/117)
回答No.2

親プロセス→子プロセスとしてスクリプト起動→子プロセスのスクリプトからFTPを子プロセスとして起動 このようになるということでしょうか? この場合には、親プロセスから子プロセスにシグナルを送るようにしてはいかがでしょうか? 子プロセスではシグナルを受けてftpを強制終了させると… このようにすると、親プロセスは孫プロセスであるftpのPIDを知る必要はありません。 シグナルの捕らえ方はtrap文を参照してみてください。

mkob
質問者

補足

たびたびすみません。 >子プロセスではシグナルを受けてftpを強制終了させると… そもそもの問題はここだった気がします^^; 親でも子でもいいのですが、あるプロセスでFTPを実行した場合に、強制終了はどうやってするのでしょう?? ps -a | grep ftp 上記のようにして、ftpプロセスのPIDを取得してKillすることは考えたのですが、 現在開発しているシステムでは、一度に複数のプロセスが、ほぼ同時にFTPを行うのです。 そのときに、親からシグナルを受けた子プロセスでは、”自分が起動したFTPプロセスだけ”をkillしたいのです。 上記psコマンドでは、FTPプロセスがたくさん存在した場合、どれが自分の子なのか???がわからずに悩んでいます。。。 毎回、言葉足らずで申し訳ないです。 よろしくお願いします。

すると、全ての回答が全文表示されます。
  • m_mik
  • ベストアンサー率26% (31/117)
回答No.1

1)ftpを子プロセスとして作成して、親プロセス側で時間監視を行い、一定時間経過してもftpのプロセスが終了しない場合には強制的にftpのプロセスを終了させるなどの手はいかがでしょうか? 2)ftpコマンドのsizeでファイルのサイズが取得できますので、それでサイズ一致の確認ができると思います。またls -lでもファイルのサイズは取得できます。 ただし、これらのことをやるとなった場合には途中のmgetで行っているものが扱えない可能性がありますので、先にftpでリモートの全ファイル一覧を取得して、 後からgetで1つずつファイルを転送するようにしないと正しくチェックできないと思います。 参考になりますでしょうか?

mkob
質問者

補足

回答ありがとうございます。 1)についてですが、 プロセスAより子プロセスA’を作成し、そこでFTPを実行するようにしたとします。 そうすると、FTP実行中には3つのプロセスが存在しますよね?(FTPを行った時点で一つプロセスが作成されませんか?) プロセスAでは時間を監視し、一定時間経過後にA’を強制終了することができますが、FTPを実行中のプロセス(A’の子?)のPIDはどのようにしたら分かるのでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A