2

私はいくつかの(同等ではない)クライアントマシンで一連のシミュレーションを実行しています。各シミュレーションが1回だけ実行されるようにするために、クライアントはLinuxサーバーに接続してタスクをスケジュールします。Linuxサーバーは、スケジュールされたタスクを実行します。タスクsshはクライアントに戻り、実行する次のシミュレーションの実行をスケジュールします。

一部のクライアントはWindowsXP(cygwinを実行)を実行しているため、クライアント側のスケジューリングスクリプトの一部は、クライアントがlinuxまたはcygwinを実行しているかどうかを確認し、対応するatコマンドを使用してシミュレーションの実行をスケジュールします(cygwinのatコマンドはWinXPatコマンドを使用します)。構文が異なります)。

Windowsクライアントで正常にスケジュールでき、呼び出すスクリプトがシミュレーションを実行します。ただし、スケジュールされたタスクは実行されますが、シミュレーションは実行されないことがわかりました。
ただし、コマンドラインからシミュレーションを呼び出す(スケジュールされたコマンドをコピーして貼り付ける)と、問題なく機能します。

誰かが私がこれを理解するのを手伝ってもらえますか?

より技術的な詳細

シミュレーションは、クライアントファイルシステムにあるPythonスクリプトです。
開始cmdすると、で始まりますH:\>。これが、スクリプトの一部がで始まる理由ですc: &&
。スケジュールされたスクリプトはPythonスクリプトです。正しいPython実行可能ファイルは、Windowsパスの一部です。$PATHcygwinの変数も同様です

私のスケジュールされたスクリプト(関連する部分):

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

4

1 に答える 1

0

問題は、python へのパスがシステム パスにあるにもかかわらず、タスクがスケジュールされている場合、このパスが有効にならないことです。したがって、へのパスをpython.exe明示的に指定する必要があります。したがって、

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"

"c:\\python27\python.exe" "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"

問題を修正します

于 2012-12-20T00:56:17.460 に答える