システム間でファイルを受け渡すにあたり、その転送が異常終了したらどうなるのか検証した。
TL;DR
- cp の場合、コピー先に中途半端なファイルが出来上がる。
- ftp の場合、転送先に中途半端なファイルが出来上がる。
- scp の場合、(調べてない。編集リクエスト募集)
- HULFT の場合、(調べてない。知っている方は教えてください)
- sftpの場合、(調べてない。編集リクエスト募集)
- (そのほか知ってる/知りたいファイル転送方法があれば編集リクエストで教えてください)
確認手順
ftp
手元にあった Windows10 に入れた BlackJumboDog を FTPサーバとし、Git Bash に入っている Curl で FTP転送しつつ、ぶった切ってみた。
$ yes | curl ftp://username:passw0rd@localhost/dest.txt --upload-file -
別シェルから
$ kill -9 curlのPID
結果、中断した時点までのファイルが出来た。
cp
手元にあった Windows10 に入っていた Git Bash に入っている cp でコピーしつつ、ぶった切ってみた。
$ cp hugefile.txt hugefile2.txt
別シェルから
$ kill -9 cpのPID
結果、コピー元より小さいサイズのファイルが出来た。
(そのほかの転送方法をここに追記する)
(ATDK)
発生し得る問題
- 送信先システム側でファイルをポーリング監視しつつつ、受信後に何らかの処理をしている場合、中途半端なファイルを使って勇み足で動き出してしまう。
- JP1/AJSのファイル監視ジョブは、ファイル転送中(他のプロセスがまだつかんでいる場合) は待ってくれる。らしい。
考えられる対策
- 巨大ファイル転送中は一時ファイル名としておき、完了後にリネームする。
- 巨大ファイル転送後に、別名のファイルをサイズゼロで作成して、それを完了フラグとして扱う。
- FTPサーバの転送完了ログをトリガーとする。
- FTPサーバの機能を使う。 JP1/FTP/FTSの伝送カードは完了時だけ動作する。らしい。一方、リネームではトリガーしされないのがめんどい
残確認事項
- BlackJumboDogではなく、IISのFTPサーバだとどうなる?
- LINUXだとどうなる?
- ファイルシステムによっても違うのか
- S3とかは?
- HTTP POSTのときは?
- TWSとか Senjuとか Hinemosとか SystemWalkerだと?
- バッファサイズとの関係があるか。サイズがある程度小さければ考慮不要なのか、合計2byte中の1byteだけ飛んでしまうのか。