質問: ### 前提・実現したいこと Windows7にてファイルのバックアップをバッチ処理で行う。 バッチファイルは(fessのクロール処理に組み込んでいるため)Groovyからキックされる。 処理の流れはとしては、バッチが終わった後にfessのクロールが走る。 ファイルをコピーする際のコマンドはcopyでもxcopyでもそのほかでも可。 以下のバッチはファイルパスさえ環境に合わせてやれば動くのですが動作が不安定なため今回質問することにいたしました。 **※補足情報は必ずお読みください。解決したい内容が書かれています。** **追記:**ソースコードと補足情報を更新しました 2016/09/13/ 17:22 現在 ### 該当のソースコード ``` @echo off rem 格納パス set MYSQLPATH="C:\Program Files\MySQL\MySQL Server 5.6\bin" rem 接続文字列とかを環境変数で登録しとく rem DB情報 set MYSQLDATABASE=fess_db set MYSQLUSER=root set PGPASSWD=mysql@dmin01 rem ファイルパス rem 環境によって変化するもの set BATPATH=C:\batch\bat set BACKUPPATH=C:\backup set SOLRPATH=C:\fess\solr rem 環境には左右されないもの set LOGPATH=%BATPATH%\..\log set ERRLOGPATH=%LOGPATH%\errlog set CORE1PATH=%SOLRPATH%\core1\data set CORE1SGPATH=%SOLRPATH%\core1-suggest\data set SOLRBACKUPPATH1=%BACKUPPATH%\solr\core1 set SOLRBACKUPPATH2=%BACKUPPATH%\solr\core1-suggest rem バックアップデータ作成 mkdir %LOGPATH% > NUL 2>&1 call :getTime echo # %LOGTIME% # "バックアップバッチ処理 start" >> %LOGPATH%\%LOGDATE%_batch.log rem バックアップ用のフォルダ作成 call :getTime echo # %LOGTIME% # "フォルダ作成 start" >> %LOGPATH%\%LOGDATE%_batch.log mkdir %BACKUPPATH%\MySQL > NUL 2>&1 mkdir %SOLRBACKUPPATH1% > NUL 2>&1 mkdir %SOLRBACKUPPATH2% > NUL 2>&1 call :getTime echo # %LOGTIME% # "フォルダ作成 end" >> %LOGPATH%\%LOGDATE%_batch.log rem MySQLのバックアップ call :getTime echo # %LOGTIME% # "mysqldump start" >> %LOGPATH%\%LOGDATE%_batch.log cd %MYSQLPATH% mysqldump -u %MYSQLUSER% -p%PGPASSWD% %MYSQLDATABASE% --single-transaction > %BACKUPPATH%\MySQL\%MYSQLDATABASE%.dump if not %errorlevel%==0 type RET:%errorlevel% >> %ERRLOGPATH%\%LOGDATE%_mysqldump.elog rem echo %LOGTIME% mysqldump-end >> %LOGPATH%\%LOGDATE%_batch.log call :getTime echo # %LOGTIME% # "mysqldump end" >> %LOGPATH%\%LOGDATE%_batch.log rem Indexのバックアップ call :getTime echo # %LOGTIME% # "index1バックアップ start" >> %LOGPATH%\%LOGDATE%_batch.log rem %path%\*.* %path%\*.* /Y rem copy "%CORE1PATH%\index\*.*" %SOLRBACKUPPATH1%\index\*.* /Y rem xcopy "%CORE1PATH%\index" %SOLRBACKUPPATH1%\index /i /y /c 2>&1> %LOGPATH%\%LOGDATE%_xcopy1.log robocopy "%CORE1PATH%\index"\ %SOLRBACKUPPATH1%\index\ /COPYALL /R:3 /W:1 rem >> %LOGPATH%\%LOGDATE%_robocopy1.log rem /NDL /UNILOG+:%LOGPATH%\%LOGDATE%_robocopy1.log echo # %LOGTIME% # "index1バックアップ end" >> %LOGPATH%\%LOGDATE%_batch.log echo # %LOGTIME% # "index2バックアップ start" >> %LOGPATH%\%LOGDATE%_batch.log rem copy "%CORE1SGPATH%\index\*.*" %SOLRBACKUPPATH2%\index\*.* /Y rem xcopy "%CORE1SGPATH%\index" %SOLRBACKUPPATH2%\index /i /y 2>&1> %LOGPATH%\%LOGDATE%_xcopy1.log robocopy "%CORE1SGPATH%\index"\ %SOLRBACKUPPATH2%\index\ /COPYALL /R:3 /W:1 rem >> %LOGPATH%\%LOGDATE%_robocopy2.log call :getTime echo # %LOGTIME% # "index2バックアップ end" >> %LOGPATH%\%LOGDATE%_batch.log rem バックアップデータ作成完了 call :getTime echo # %LOGTIME% # "バックアップバッチ処理 end" >> %LOGPATH%\%LOGDATE%_batch.log echo. >> %LOGPATH%\%LOGDATE%_batch.log exit /b 0 rem 時間取得 :getTime set TIME0=%time: =0% set LOGTIME=%TIME0% set LOGDATE=%date:~0,4%%date:~5,2%%date:~8,2% exit /b ``` ### 補足情報(言語/FW/ツール等のバージョンなど) OS:windows7 64bit アプリケーション:fess ※以下のような不穏な動作があります。 1"xcopy"コマンドや"robocopy"コマンドを実行する際に結果を別ファイルリダイレクトするようにバッチを記載すると正常に処理が終了する ``` rem 正常動作時のコマンド xcopy "%CORE1PATH%\index" %SOLRBACKUPPATH1%\index /i /y /c 2>&1> %LOGPATH%\%LOGDATE%_xcopy1.log rem 正常動作時のコマンド robocopy "%CORE1PATH%\index"\ %SOLRBACKUPPATH1%\index\ /COPYALL /R:3 /W:1 >> %LOGPATH%\%LOGDATE%_robocopy1.log ``` 2"xcopy"コマンドや"robocopy"コマンドを実行する際に結果を受け取らない(リダイレクトしない)場合は処理が途中で停止する。 ``` rem 動作が途中で止まるときのコマンド xcopy "%CORE1PATH%\index" %SOLRBACKUPPATH1%\index /i /y /c rem 動作が途中で止まるときのコマンド robocopy "%CORE1PATH%\index"\ %SOLRBACKUPPATH1%\index\ /COPYALL /R:3 /W:1 ``` 以上です。 ご教授の程、よろしくお願いします。
回答: ファイルがロックされている、恐らくはまだ何かのプログラムが使用中なのでしょう。 まずは問題のファイルの特定からです。 二箇所あるので、どっちが原因なのか(あるいは両方なのか)、ログを仕込んで確認してみてはどうでしょうか? xcopy "%CORE1PATH%\index" %SOLRBACKUPPATH1%\index /i /y xcopy "%CORE1SGPATH%\index" %SOLRBACKUPPATH2%\index /i /y 次に誰が握っているのかの特定ですが、心当たりがあるならそれで問題有りません。 ない場合はProcess Explorer等で調べられますが、一瞬しかロックされてない場合はちょっとわかりません。 逆にその場合はコピー処理を数秒遅らせる事で対処するという手もあります。 参考URL Process Explorerでロックしているファイルを探す