
Windows2003上のタスクスケジューラで動かしていたPerlのスクリプトを2008に移行したところ、動かなくなり、原因が判らず困っています。
内容としては、mail_get.plというスクリプトで下記の処理をしています。
1.popサーバーからメールを受信
2.所定のフォルダに添付ファイルを出力
3.複号用バッチファイル(encode.bat)の起動
4.エンコードした結果をメールで送信し、サーバーへファイル転送
3.のバッチファイルを起動するところで、出力される添付ファイルが見つからない、という状態でエラーになります。
不思議なことに上記のスクリプトをタスクスケジューラでなく、手動で動かした場合は正常に動作します。デバッグ表示したところ、パスが通っていないという状況ではないようです。
3.を行う前に時間稼ぎのループを入れれば解決するのかもしれません。
perlはスクリプト言語なので、逐次動作するものと思っているのですが、OSの違いやCPU速度の関係で、先に子プロセスが呼び出されてしまう可能性があるのでしょうか?
同じような経験をされた方はおられないでしょうか?
No.2ベストアンサー
- 回答日時:
タスクスケジューラーもwindows2008も使ってないので完全に勘ですが、
起動状況によってファイルが見つからないと言うのは、パスが通ってないのでは?
例えば普通は起動させた位置がカレントディレクトリになります。
例えばタスクスケジューラーから起動させた場合、の位置がカレントディレクトリになってたりとかはしないですか?
またタスクスケジューラーの仕組みは知らないのですが、どのように起動させてますか?
例えばの一つとして、起動の方法も数多くありますが、
AプログラムがBファイル(perl)の文字列を読み込み、
Aプログラムがその文字列をperlコンパイラに送りつける。
こんな手法が取られていればカレントディレクトリは間違いなくAプログラムの位置です。
ファイルの位置を見つけられないのはPerlですよね?
そして、起動方法によって見つかったり見つからなかったりするわけですよね?
ぱっと思いつく限りでは、明らかにカレントディレクトリが怪しいです。
カレントディレクトリは常に起動された環境に依存するからです。
>先に子プロセスが呼び出されてしまう可能性があるのでしょうか?
スクリプトどうこうは関係ないです。
これについてはどうperlを書いたかによります。
どんな条件下でも間違いなく、必ず処理を待つように書けている保証は必要です。
その確証が得られるように見直しをして下さい。
コメント有難うございます。
カレントディレクトリはタスクスケジューラの開始ディレクトリで指定できるのでそれを信用しています。
Perlで行っている添付ファイルの取得処理が終わる前にバッチファイルでおこなっているエンコード処理が始まっているような感じなのです。ファイルの作成を待って処理を開始させる方法は良く判らないので、時間稼ぎをして起動させてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでOutlookを終了させたい Ex...
-
VC++アプリからEXCEL...
-
VBで実行中のEXEファイルの情報...
-
Windows上のプログラム。「予め...
-
EXCEL VBAから他アプリケーショ...
-
EclipseとTomcat使用時、すぐに...
-
MSDOS(バッチファイル)でプロセ...
-
2回以上PDFをコピーや印刷がで...
-
Designer.vbは直接コードをいじ...
-
excel vbaから実行するexe実行...
-
VBAでエクセルからワードへの差...
-
う~ん…。
-
VBAにて指定したセルをプルダウ...
-
C++初心者です。 debug asserti...
-
VB.NETでDLLを読み込ませる時に...
-
vba 時間の引き算 例えば 15:00...
-
電卓の作成 VB
-
DLLを作成してVBAから使用する...
-
プリンターを指定して印刷するには
-
意味不明の実行時エラーで困っ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでOutlookを終了させたい Ex...
-
VBSで起動したアプリが前面表示...
-
VBSから別のVBS起動するとき変...
-
アウトルックが起動しているか...
-
Process.Startで起動したアプリ...
-
Windows上のプログラム。「予め...
-
VBで実行中のEXEファイルの情報...
-
exeファイルを実行するとすぐに...
-
ACCESS VBAで別のACCESS(mdb)を...
-
WinSCPで画像のように puttyを...
-
VBAでSeleniumからChromeを起動...
-
フォームの最前面が効かない
-
VB6で呼び出し元の情報を取得す...
-
同じIEのウィンドウで、リンク...
-
gccプログラムで複数の実行ファ...
-
アプリからVB(Form)
-
VBSでExcelのUserFormをエクス...
-
VBからExcelに書き込む方法
-
Notepad起動のイベントでEXC...
-
C# 他のアプリケーションを優先...
おすすめ情報
バッチファイルのecho offを外して、処理結果をファイル出力にして実行してみました。
(前略)
if exist e:\edidata\data.csv goto MAIN
echo 入力のデータが無いので処理を中止します。 file=e:\edidata\data.csv
goto ERR_check
:MAIN
copy /Y e:\edidata\data.csv e:\edidata\wrk
set rc=%errorlevel%
if not %rc% == 0 goto ERR_check
(後略)
のCOPYのところで、「0 個のファイルをコピーしました。」となり、後の処理が止まっています。
コマンドラインだとこのコピーは実行でき、e:\edidata\wrkの中にある同名のファイルは前回分の値が入っていて処理時に掴んでいるものではありません。
解決しました。
タスクスケジューラで、「最上位の特権で実行する」にチェックを入れたら動きました。
コマンドライン上でもタスクスケジューラの設定でもadministratorでログインした状態で行い、登録時もそのパスワードを入れて登録したのですが、ここにチェックを入れないとadministratorとは見なされないようです。
お騒がせしました。