
一定の間隔であるサーバに接続し、画像ファイルを取得するプログラムを作成しています。
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実行前にファイルのサイズが取得できるか?
No.4ベストアンサー
- 回答日時:
サンプルを見てようやく分かりました。
ご提示ありがとうございます。
c側からsystemで起動したftpのプロセスを殺したいということでよろしいでしょうか?
この場合は PPIDを検索すればよいのです。
切断するだけのプロセスを起動したほうが楽なのかもしれません。
例えば コマンド名を killchild 親のPID番号 として、fork/execを使用してftpを起動します。
このときにforkされたPIDは認識できると思います。
次に時間が経過した場合に、killchild をsystem()で呼び出します。引数は先ほどのPID番号です。
killchild では、ps -e により全プロセスを取得し、その中でPPIDが引数(ftpの親のPID)と一致するものを検索してそのプロセスを強制切断する
これでいけると思うのですが、いかがでしょうか?
No.3
- 回答日時:
子プロセスのPIDが取得できないということでしょうか?
子プロセスのPIDは$!で取得できると思いますが…
この回答への補足
なんかちょっと違う気がします^^;;
プロセスAが以下の処理だったとします。
main(){
処理(1)
system("ftp XXXXX");
処理(2)
・・・
・・・
return;
}
systemコマンドにて、ftpを実行しています。
で、FTPの実行中にプロセスAに対して終了シグナルを発行したときに、実行中のFTPプロセスが残ったままとなってしまうのです。
これをKillする方法を知りたいのです。
No.2
- 回答日時:
親プロセス→子プロセスとしてスクリプト起動→子プロセスのスクリプトからFTPを子プロセスとして起動
このようになるということでしょうか?
この場合には、親プロセスから子プロセスにシグナルを送るようにしてはいかがでしょうか?
子プロセスではシグナルを受けてftpを強制終了させると…
このようにすると、親プロセスは孫プロセスであるftpのPIDを知る必要はありません。
シグナルの捕らえ方はtrap文を参照してみてください。
この回答への補足
たびたびすみません。
>子プロセスではシグナルを受けてftpを強制終了させると…
そもそもの問題はここだった気がします^^;
親でも子でもいいのですが、あるプロセスでFTPを実行した場合に、強制終了はどうやってするのでしょう??
ps -a | grep ftp
上記のようにして、ftpプロセスのPIDを取得してKillすることは考えたのですが、
現在開発しているシステムでは、一度に複数のプロセスが、ほぼ同時にFTPを行うのです。
そのときに、親からシグナルを受けた子プロセスでは、”自分が起動したFTPプロセスだけ”をkillしたいのです。
上記psコマンドでは、FTPプロセスがたくさん存在した場合、どれが自分の子なのか???がわからずに悩んでいます。。。
毎回、言葉足らずで申し訳ないです。
よろしくお願いします。
No.1
- 回答日時:
1)ftpを子プロセスとして作成して、親プロセス側で時間監視を行い、一定時間経過してもftpのプロセスが終了しない場合には強制的にftpのプロセスを終了させるなどの手はいかがでしょうか?
2)ftpコマンドのsizeでファイルのサイズが取得できますので、それでサイズ一致の確認ができると思います。またls -lでもファイルのサイズは取得できます。
ただし、これらのことをやるとなった場合には途中のmgetで行っているものが扱えない可能性がありますので、先にftpでリモートの全ファイル一覧を取得して、
後からgetで1つずつファイルを転送するようにしないと正しくチェックできないと思います。
参考になりますでしょうか?
この回答への補足
回答ありがとうございます。
1)についてですが、
プロセスAより子プロセスA’を作成し、そこでFTPを実行するようにしたとします。
そうすると、FTP実行中には3つのプロセスが存在しますよね?(FTPを行った時点で一つプロセスが作成されませんか?)
プロセスAでは時間を監視し、一定時間経過後にA’を強制終了することができますが、FTPを実行中のプロセス(A’の子?)のPIDはどのようにしたら分かるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TOPコマンドで表示するCPU使用...
-
指定したプログラムの実行を禁...
-
inetdの再起動の方法
-
【Process Explorer】について
-
プロセス、サービス、デーモン...
-
Powershell プロセス二重起動
-
コマンドライン上でファイルを...
-
「rpm -e」でのアンインストー...
-
ps コマンドのステータス。S Ss...
-
突然シャットダウンします
-
タスクマネージャーのwinlogon....
-
右クリックをすると砂時計のま...
-
スクリプトのエラー「unexpecte...
-
Linuxコマンドは何の言語で書か...
-
UNIX コマンドにおける # や円...
-
IPアドレスだとPingが通るのに...
-
SONYの音楽ソフト「x-アプリ」...
-
pingは正常なのにtracerouteで...
-
ファイル名一覧の印刷
-
batファイルの強制終了を回避し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TOPコマンドで表示するCPU使用...
-
プロセス、サービス、デーモン...
-
System Idle Processってなに?...
-
プロセスがタスクマネージャー...
-
タスクバーの音量アイコンをク...
-
デスクトップ上の謎の白い□
-
CPU使用率取得方法について
-
タスクマネージャのCPU率がおか...
-
スリープ状態から復帰後、DPCs...
-
Windowsで作れるスレッド最大数...
-
コマンドライン上でファイルを...
-
プロンプトが返らない
-
CPU使用率が常に50~10...
-
メディアプレイヤーが終了でき...
-
アクロバットを終了しても、プ...
-
sighupとsigtermの違い
-
イラストレータでの透明部分の...
-
デュアルCPU(デュアルコアでは...
-
デーモンモードとは何でしょうか?
-
【プログラム】 iu14d2n.tmp ...
おすすめ情報