2023年1月4日水曜日

CGIのプログラミングミスで大量のデータファイルが作られていた

 劇場の席の予約を管理するプログラムをCGIで作成していて色々いじっていたのだが、ファイルの構成を変えようと思っていじったのだがうまくいかない。
うまくいかない…というかftpがおかしい。データをしまっておくディレクトリを開こうとするとやたらとデータ転送が起こりそのままフリーズしてしまう。
他のファイルは普通にやり取りできるしディレクトリも開ける。そのディレクトリだけ。

で、とりあえずコマンドラインでやってみようと思った。
cmdで「ftp (ftpサーバーアドレス)」→「ユーザー名」→「パスワード」と入力してftpサーバーにログイン。cdでディレクトリ移動、dirでディレクトリ情報を見ていくと、やはりデータのディレクトリではやたらと時間がかかったが、膨大な数のデータファイルが作られていることがわかった。

これ、CGIの途中にデータファイルをループで一つ一つ開いて調べてデータのリストを作る箇所があるのだが、読み込む順番を逆にしようとしたのが原因のようだ。
つまり12個あるファイルを1から12まで行ったら止める様になっていたところを12から1に逆行させようとして、間違って12から13,14…と上の方に開いて行き、見つからない時はファイルを生成するようになってしまったのだ。…と思う。

めちゃくちゃ初歩的なミスだ。

とりあえずそのままには出来ないので、そこから削除をしてみることにした。
複数のファイルをまとめて削除する場合は「mdel *.dat」などとすれば「.dat」がつくファイルを一気に削除できるが、このコマンドそのまま使うと1つのファイルごとに「このファイル削除していいか?」を聞いてくる。

そこで「prompt」と入れて対話モードを止めた。これで一気に削除が進む…はずだが、終わらない。いつまで立っても終わらない。本当に減っているのだろうか?その内サーバーから接続を切られてしまった。もう一度やってみるがやはりいつまで立っても終わらない。

Ctrl+Cで止めるとコネクション自体が止まるので、一旦止めて、ftpを「bye」で閉じてから改めてftpサーバーに接続してdirでdataディレクトリ内のファイルを見る。
...減ってる気がしない。

そこで、「〇〇*.dat」と頭に2文字程度付けて削除してみることにした。これなら条件にあったファイルだけを削除して一旦止まるので少しずつだが進んでいることが確認できる。

ああ、しかし、先は長そうだ。
で、これはftpでやろうとしているから遅いのかもと思った。
sshでサーバーに直接入ったらどうだろう。

サーバーのssh設定でsshができるように設定し、秘密鍵のファイルを作成してPCに保存。cmdでもやれるらしいが面倒くさいのでteratermをダウンロードし、接続先のサーバーアドレス、ポート(ここのサーバーの場合22ではなく10022だった)を設定して進む→ユーザー名と秘密鍵を作った際に使ったパスフレーズを入れ、秘密鍵のファイルを指定して接続で、ログインできた。

データのディレクトリに言ってワイルドカードでファイルを削除しようとしたら「引用リストが長すぎます」と怒られた。ファイルが多すぎるとこうなるらしい。
そこで「rm -rf データのディレクトリ」(四の五の言わずに中身のファイルごとディレクトリを削除)を実行したらちょっとしてすぐにプロンプトが出てあっけなく終了。
こういう作業はssh経由が良いらしい。まああまり世話になりたくないけど。

これで改めて制作作業開始だけど、今度はこんなことのないように、よくよく確認して進めるようにしたい。