
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で質問しましょう!
似たような質問が見つかりました
- UNIX・Linux redmineにメールを飛ばす方法 1 2022/09/13 22:02
- その他(プログラミング・Web制作) Windows上のプログラム。「予め決められた時刻に自分で起動して処理して自分で終了する」って可能? 3 2023/01/04 14:29
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- Excel(エクセル) 【マクロ】エラーが発生⇒実行時エラー58既に同名のファイルが存在 5 2022/08/31 10:03
- Excel(エクセル) ファイル一覧表を使ったファイルの移動 5 2022/08/10 15:37
- 物理学 時間を語るなら、(複数の時間の正体)を知る必要が有る。 1 2023/02/16 22:14
- Yahoo!メール ぷららメールの送受信が出来なくなった 2 2023/07/16 11:48
- デスクトップパソコン ん~…分からん 7 2022/06/10 10:47
- Ameba(アメーバブログ) アメブロは、HTMLのタグの入力を許さないブログ・サイトですか? 1 2023/06/18 18:48
- ホームページ作成・プログラミング アメーバ・ブログは"HTMLタグ"を許可してないのですか? 2 2023/06/17 21:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
同じIEのウィンドウで、リンク...
-
アプリからVB(Form)
-
リストポックスについて
-
フォームの内容をリフレッシュ...
-
VB6は初心者です。
-
ブラウザからphotoshopを実行し...
-
Adobe Photoshop 7.0がPCを起動...
-
【VB2005】別のプログラムから...
-
エクスプローラの終了と再起動...
-
Notepad起動のイベントでEXC...
-
MDIアプリケーションの子ウィン...
-
タスクスケジューラを利用して実行
-
Excelの残骸
-
VisualBasic6.0で作ったスクリ...
-
VBSで起動したアプリが前面表示...
-
VisualC++で他アプリ起動ボタン
-
MSDOS(バッチファイル)でプロセ...
-
VBA ユーザーフォームについて
-
VBSから別のVBS起動するとき変...
-
アウトルックが起動しているか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでOutlookを終了させたい Ex...
-
アウトルックが起動しているか...
-
Process.Startで起動したアプリ...
-
VBで実行中のEXEファイルの情報...
-
Windows上のプログラム。「予め...
-
キー操作 (WSH:コピー&ペー...
-
exeファイルを実行するとすぐに...
-
VBSで起動したアプリが前面表示...
-
EXCEL VBAから他アプリケーショ...
-
VBSから別のVBS起動するとき変...
-
VB6で呼び出し元の情報を取得す...
-
フォームの最前面が効かない
-
gccプログラムで複数の実行ファ...
-
ウィンドウを終了させたい・・・
-
C# 他のアプリケーションを優先...
-
MSDOS(バッチファイル)でプロセ...
-
64bitで作ったEXEを32bitで起動...
-
VBAでSeleniumからChromeを起動...
-
VB6.0からエクセルを起動
-
VBSでExcelのUserFormをエクス...
おすすめ情報
バッチファイルの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とは見なされないようです。
お騒がせしました。