ときどき動かないことがあるプログラム!?

こんにちは、石川さんです。ときどきうまく動かないことがあるんです、と、言われちゃいました。何のことかって?当然、プログラムですよ!こうしたらこうなる、という再現性がある不具合は解決しやすいのですよ。再現性がないときにどうするか、っちゅう話ですね。

今回のケース

データ受信したときに、その日の夕方に自動的に返信するためにタスクスケジューラに登録しておく、というプログラムを用意したのですけど、だいたいはうまくいっているのに、たまにデータが返信できていないことがある、ということで、調査ですね。とりあえずは再現待ちということだったのですが、先日再現しました、と、ご連絡をいただきました。

タスクスケジューラで確認

まずは、タスクスケジューラにタスクが登録されているのかどうか、タスクスケジューラで確認しました。ありません。。。タスクは登録されていないし、実行もされていませんね。過去には実行された形跡がありました。

イベントビューアで確認

何か失敗していたら、イベントビューアに記録が残っているかもしれない、と、確認してみましたが、、、こちらもありません。タスクが実行されていないので、そりゃ何もないのが普通か。ただ、タスクスケジューラを実行したときに、何かの問題があって、ということであれば、何かが記録されているはず、と思ったのですが、ありません。むむ、手ごわいぞ。。。

実行している箇所を確認

ぼくが担当しているのは、PowerBuilderで作られたオンプレのクライアントサーバーアプリケーションです。実行個所を確認したら、以下のような記述が。。。

// タスクスケジューラのタスクを作成するバッチを実行する
run("addTask.bat")

およ。バッチファイルを実行している。これは、、、カレントディレクトリにあるバッチスクリプトを実行していますね。もしかして、カレントディレクトリが変更されたときには、動かなくなる、という可能性があるのでは。。。

カレントディレクトリが変更される可能性について

普通にChangeDirectoryコマンドを使ってディレクトリを明示的に指定すれば当然カレントディレクトリを変更できます。それ以外にも、気づかないうちにディレクトリが変わっている可能性がありました。GetFileOpenName、GetFileSaveNameファンクションを使用した場合です。これらを使用するとダイアログウィンドウが開いてファイルを選択することができますが、選択したフォルダにカレントディレクトリが移動してしまいます。

VBAなどで開発されている場合には、GetOpenFilenameやGetSaveAsFilenameといったファンクションも同様の挙動で同じ問題が起きる可能性がありそうですよ!

原因は…

と、いうことで、うまく動いたり動かなかったりするのは、おそらくこのカレントディレクトリの移動が原因じゃないかな、と、いう結論になりました。対応は、絶対パスでバッチファイルを記載するか、カレントディレクトリをバッチファイルのあるところへ変更してから実行するか、の、いずれかでしょうね。

今回調査が難しかったのは、普段あまり使用していなかったタスクスケジューラへの登録と実行、という難易度の高めの処理があったため、登録時の失敗や、実行時の失敗、ログオンしているときしていないとき、プログラム使用者の権限の問題などの可能性も考慮せねばならず、そちらへ大きく気を取られてしまった、ということがありました。

まとめ

バッチファイルなどの外部スクリプトや他のプログラムがうまく動作しないことがあるときは、相対パスで指定されていないか確認しましょう。
あ、書いてて思いつきましたが、もしかしたらgetFolderファンクションでもカレントディレクトリが変わるかも知れません。。。