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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCEL VBAから他アプリケーショ...
-
VBSから別のVBS起動するとき変...
-
EclipseとTomcat使用時、すぐに...
-
exeファイルを実行するとすぐに...
-
アウトルックが起動しているか...
-
VBAでOutlookを終了させたい Ex...
-
VBで実行中のEXEファイルの情報...
-
ACCESS VBAで別のACCESS(mdb)を...
-
VBSで起動したアプリが前面表示...
-
C# 他のアプリケーションを優先...
-
64bitで作ったEXEを32bitで起動...
-
Windows上のプログラム。「予め...
-
VBからの作業フォルダ指定
-
VBで一定時間毎に他のプログ...
-
VB6で呼び出し元の情報を取得す...
-
Process.Startで起動したアプリ...
-
WinSCPで画像のように puttyを...
-
ミリ秒を○時間○分○秒にしたい
-
VBAでSeleniumからChromeを起動...
-
VBS から BAT を起動させたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アウトルックが起動しているか...
-
VBAでOutlookを終了させたい Ex...
-
Windows上のプログラム。「予め...
-
VBSで起動したアプリが前面表示...
-
VBSから別のVBS起動するとき変...
-
Process.Startで起動したアプリ...
-
VBAでSeleniumからChromeを起動...
-
VBSでExcelのUserFormをエクス...
-
EXCEL VBAから他アプリケーショ...
-
VB6で呼び出し元の情報を取得す...
-
exeファイルを実行するとすぐに...
-
VBで実行中のEXEファイルの情報...
-
64bitで作ったEXEを32bitで起動...
-
エクセル起動時別プロセスで開く
-
「FindWindow」、ウィンドウハ...
-
二重起動禁止にする理由とは
-
Shellで起動したプログラムのウ...
-
QueryPerformanceCounter の使...
-
フォームの最前面が効かない
-
AppActivateについて
おすすめ情報
バッチファイルの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とは見なされないようです。
お騒がせしました。