一定の間隔であるサーバに接続し、画像ファイルを取得するプログラムを作成しています。
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で質問しましょう!
似たような質問が見つかりました
- サーバー Googleドライブなどを使わずにテザリングAndroidでWindowsとファイル共有 1 2023/02/19 13:14
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Visual Basic(VBA) outlook マクロが終了しません。 1 2022/09/02 11:14
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- サーバー FTPサーバについて詳しい方(アクセス権のないディレクトリを非表示にする方法) 4 2022/08/22 22:33
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Android tar.ファイルのインストールについて知りたいです 2 2022/07/23 15:34
- Windows 10 コマンドプロンプトの使い方 1 2022/10/13 14:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TOPコマンドで表示するCPU使用...
-
コマンドライン上でファイルを...
-
変なプロセスを終了したらブル...
-
CPU使用率25% の正体を...
-
強制終了できないプロセスの強...
-
プロセスがタスクマネージャー...
-
アプリケーションエラーを発生...
-
systemのCPU使用量が一瞬極端に...
-
プロセス、サービス、デーモン...
-
タスクマネージャのCPU率がおか...
-
イラストレータでの透明部分の...
-
System Idle Processってなに?...
-
リスクウェア Invaderが検知さ...
-
デュアルCPU(デュアルコアでは...
-
【プログラム】 iu14d2n.tmp ...
-
sighupとsigtermの違い
-
httpリクエストをkillするには?
-
プロセスの終了について教えて...
-
タスクバーの音量アイコンをク...
-
プロセス監視とサービス監視
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TOPコマンドで表示するCPU使用...
-
プロセス、サービス、デーモン...
-
System Idle Processってなに?...
-
タスクマネージャのCPU率がおか...
-
タスクバーの音量アイコンをク...
-
コマンドライン上でファイルを...
-
Powershell プロセス二重起動
-
プロセスがタスクマネージャー...
-
【プログラム】 iu14d2n.tmp ...
-
Windows 10のエクスプローラー...
-
実行中のプログラムを調べるには?
-
ps コマンドのステータス。S Ss...
-
プロンプトが返らない
-
タスクマネージャで終了できな...
-
強制終了できないプロセスの強...
-
CPU使用率取得方法について
-
HP-UXでのプロセス別メモリ使用...
-
CPU使用率が常に50~10...
-
killコマンドの終了と強制終了...
-
Windowsで作れるスレッド最大数...
おすすめ情報