私はいくつかの(同等ではない)クライアントマシンで一連のシミュレーションを実行しています。各シミュレーションが1回だけ実行されるようにするために、クライアントはLinuxサーバーに接続してタスクをスケジュールします。Linuxサーバーは、スケジュールされたタスクを実行します。タスクssh
はクライアントに戻り、実行する次のシミュレーションの実行をスケジュールします。
一部のクライアントはWindowsXP(cygwinを実行)を実行しているため、クライアント側のスケジューリングスクリプトの一部は、クライアントがlinuxまたはcygwinを実行しているかどうかを確認し、対応するat
コマンドを使用してシミュレーションの実行をスケジュールします(cygwinのat
コマンドはWinXPat
コマンドを使用します)。構文が異なります)。
Windowsクライアントで正常にスケジュールでき、呼び出すスクリプトがシミュレーションを実行します。ただし、スケジュールされたタスクは実行されますが、シミュレーションは実行されないことがわかりました。
ただし、コマンドラインからシミュレーションを呼び出す(スケジュールされたコマンドをコピーして貼り付ける)と、問題なく機能します。
誰かが私がこれを理解するのを手伝ってもらえますか?
より技術的な詳細:
シミュレーションは、クライアントファイルシステムにあるPythonスクリプトです。
開始cmd
すると、で始まりますH:\>
。これが、スクリプトの一部がで始まる理由ですc: &&
。スケジュールされたスクリプトはPythonスクリプトです。正しいPython実行可能ファイルは、Windowsパスの一部です。$PATH
cygwinの変数も同様です
私のスケジュールされたスクリプト(関連する部分):
import subprocess
import sys
import smtplib
scenario, p,h,t,c,m,run, IP = sys.argv[1:]
homedir = 'myUserName'
if IP == "137.122.88.124":
homedir = 'myOtherUserName'
subprocess.check_call("""c: && cd \"c:\\cygwin\\home\\%(home)s\\project\\dir\\scenario%(scenario)s\\p%(popsize)sh%(height)st%(tournsize)sc%(crossprob)sm%(mutprob)s\" && python "c:\\cygwin\\home\\%(home)s\\project\\dir\\scenario%(scenario)s\\p%(popsize)sh%(height)st%(tournsize)sc%(crossprob)sm%(mutprob)s\\GP%(run)s.py" """ %{'home':homedir, 'scenario':scenario, 'popsize':p, 'height':h, 'tournsize':t, 'crossprob':c, 'mutprob':m, 'run':run}, shell=True)
わかりやすくするために、上記で呼び出すコマンドをsubprocess.check_call
改行で区切って以下に示します。
c: &&
cd \"c:\\cygwin\\home\\%(home)s\\project\\dir\\scenario%(scenario)s\\p%(popsize)sh%(height)st%(tournsize)sc%(crossprob)sm%(mutprob)s\" &&
python "c:\\cygwin\\home\\%(home)s\\project\\dir\\scenario%(scenario)s\\p%(popsize)sh%(height)st%(tournsize)sc%(crossprob)sm%(mutprob)s\\GP%(run)s.py"
編集1:
スケジュールされたスクリプトが呼び出されているかどうかをテストするために、スクリプトの先頭に次の行を追加しました。
f = open("C:\\Documents and Settings\\user\\Desktop\\somesimfile.txt", 'w')
f.write('I actually ran')
f.close()
したがって、スクリプトがpythonで実行された場合、実行されたことを確認するデブリファイルが残ります。
スケジューラーがジョブの実行を示した後、デブリファイルが見つかりませんでした。したがって、スクリプトは実行されませんでした。
編集2:
スケジューラーがcygwin環境内でコマンドを実行する可能性があると考えて、デブリファイルパスを次のように変更しました/home/user/somesimfile.txt
それでも、デブリファイルは作成されませんでした。
タスクがスケジュールされていても、実行されていないと結論付けることしかできません。
これがアクセス許可の問題である可能性があると考えて、チェックしました。すべてのシミュレーションスクリプトに755
アクセス許可があります。
編集3:
これも私のログイン権限の制限ではないようです。cmd
ログインを使用して、タスクを直接スケジュールし、その結果を取得することができます。それでも、このシミュレーション(またはその他のPythonスクリプト)をから直接スケジュールすることはできません。cmd