スケジュールに基づいてWindowsサーバーで自動的に実行したいスクリプトをPythonで作成しています。バッチファイルを簡単に操作してみましたが、代わりにPythonスクリプトに熱心に移行し、問題なく動作しています。私が書いたスクリプトは簡単に書くことができ、手動で実行したときに私が望んでいることを正確に実行します。私は今、多くの異なるスクリプトを作成しました。主に、ファイルのコピー、削除、名前の変更、またはディレクトリの移動を扱います。
問題は、Windowsタスクスケジューラを使用してPythonスクリプトをスケジュールしようとすると、それらの多くが実行に失敗することです(タスクスケジューラは「最終実行結果= 0x1」と表示します)。これは常に起こります。バッチファイルでも同様の経験があります(手動で実行できるバッチファイルは、スケジュールされたときに実行できません)。これまでの私の限られた経験を考えると、これは確かにWindowsタスクスケジューラの問題であり、Pythonの問題ではないと言わざるを得ません。
Pythonスクリプトの例を次に示します。
#import modules
import os, shutil, datetime, subprocess
#global variables
zip_dir = 'Y:\7z'
zip_dir_misc = 'X:\7z'
zip_extension = '.7z'
def newest_zip_file(directory, extension = zip_extension):
return max(
(os.path.join(dir_name, file_name)
for dir_name, dir_names, file_names in os.walk(directory)
for file_name in file_names
if file_name.endswith(extension)),
key=lambda fn: os.stat(fn).st_mtime)
def copy_zip_file(src_dir_p, temp_dir_p):
src_file = newest_zip_file(src_dir_p)
new_file = temp_dir_p + '\\' + os.path.basename(src_file)
shutil.copyfile(src_file, new_file)
copy_zip_file(zip_dir, zip_dir_misc)
このスクリプトは、ネットワークフォルダー(X:パーティションとして表される)を介して、あるサーバーから別のサーバーに.7zファイルをコピーします。このスクリプトは手動で実行すると機能しますが、スケジュールされている場合は機能しません。ただし、同じ.7zファイルを同じサーバー上の別のディレクトリ(ネットワークフォルダーではない)にコピーするようにスクリプトを変更すると、手動またはスケジュールで実行した場合でも、スクリプトは問題なく機能します。
上記のスクリプトでプログラム的に間違ったことをしている場合(おそらくネットワークフォルダーを不適切に参照している場合)、このスクリプトを一度修正できます(ただし、次のようなものを使用してネットワークフォルダーを定義するために想像できるすべての組み合わせをすでに試しましたが完全なサーバー名)。しかし、同じように動作するまったく異なるPythonスクリプトで同じ問題が発生し続けているため、本当の問題が発生します。
Windowsタスクスケジューラを介して開始したときに、一見有効に見えるPythonスクリプトが実行されないのはなぜですか?
私のWindowsタスクスケジューラの構成:
- ユーザーがログオンしているかどうかに関係なく実行
- 最高の特権で実行する
- 直接呼び出されたアクション(Pythonスクリプト)(プログラムの開始:abc.py)。Python.exeへの引数として送信されませんが、Python.exeアプローチも何度も試しました。どちらのアプローチも(スケジュールされたタスクを実行する限り)他のアプローチよりも優れているとは思わないので、スクリプトを直接呼び出すだけです。
私は主に、この一般的な問題を解決するための提案とベストプラクティスを探していますが、上記のサンプルスクリプトに対する具体的な修正はそれほど多くありません。