私はPopenの仕組みについて少し混乱しています。私はこれが何かばかげていると思っています。複数のプロセスを実行し、完了を調整する
これは、これを行うために提供されたユーティリティ(CSSBACKUP)を使用して、3つ組のスキーマ(テーブルスペース)をバックアップしています。
for i in range(len(schematype)):
schema_base = schemaname + '_' + schematype[i] # we need this without the trailing space.
outputstring = base_folder + '\\' + schemaname + '\\' + schema_base + '_' + timestr + '_cssbackup '
rc = os.unlink(outputstring) # wont run if there is a backup already
logstring = base_folder + '\\' + schemaname + '\\' + schema_base + '_' + timestr + '.log'
exString = "cssbackup " + phys_string + '-schema '+ schema_base + ' ' + '-file ' + outputstring + '-log '+ logstring
logging.debug(exString)
processlist.append(subprocess.Popen(exString)) # start a seperate thread for each one, but we don't want to proceed until processlist[].poll == None (thread is complete)
procdone[i] = False
今、私はすべてのプロセスが出現していることを、私はこれを実行すると、私は期待していものを得ることはありません
while finishit < len(schematype):
time.sleep(CSTU_CFG.get(hostname).get("logintv")) # need a delay to keep this program from thrashing
for i in range(len(schematype)): # check each of the procs
if procdone[i] is not True: # if it completed, skip it
if processlist[i].poll is not None: # if it returns something other than "none" it's still running
logging.debug(' Running '+ schematype[i] + ' ' + str(processlist[i])+ ' '+ str(time.time() - start_time))
procdone[i] = False
else:
procdone[i] = True # None was returned so it's finished
logging.debug(' Ended '+ schematype[i]) # log it
finishit = finishit + 1 # update the count
processlist[i].kill # kill the process that was running (Saves memory)
logging.debug('Dump functions complete')
をそれらを同期する必要があります。私は帰りにpidを期待していたが、私はそれを見ない。ですから、.pollコマンドには役に立ちません。
したがって、プログラムは、それが生成したシェルがなくなっても永遠に実行されます。
何か基本的なものがありません。
おかげ
11:26:26133ルート、DEBUG実行ローカル30.014784812927246 11:26:26133ルート、DEBUG実行MNGT 30.014784812927246 11:56148:26 26:中央30.014784812927246 11を実行26133根、DEBUG 26:56148ルート、中央60.02956962585449 11実行DEBUG:26:56148ルート、DEBUG実行MNGT 60.02956962585449 11:27:26162ルート、ローカル90.04435467720032 11実行DEBUG:27:26162ルートを、11 60.02956962585449ローカルランニングルート、DEBUG DEBUGランニングセントラル90.04435467720032 11:27:26,162ルート、DEBUGランニ27::56177ルート、中央120.05913925170898 11実行DEBUG:27:56177ルート、DEBUG実行MNGT 120.05913925170898 11:28:26192ルート、ローカル実行DEBUGをNG MNGT 90.04435467720032 11:27:11 120.05913925170898ローカル実行56177根、DEBUG 150.07392406463623
これは頭を叩く瞬間でしたが、今や新たな問題が発生しました。私がそれを走らせると、プロセスは稼働し続けましたが、プロセスチェッカーは続けました。だから私は、作成の直後に.poll()を追加し、それらはNoneで作成されたようです。だから、これは私を近づけますが、そこにはありません。だからおそらく私の問題はpopen(exString)ですか? – WDickens
ここには複数の詳細があります。例えば、 'subprocess.Popen'は引数のリストか' shell = True'引数を必要とします。 'poll()'は、実行中はNoneを返し、終了時にはリターンコードを返します。私はまた、プロセスが終了した後でプロセスを終了する必要はないと考えています。一般的には、最小限に抑えてhttps://stackoverflow.com/help/mcveという例があれば、デバッグが簡単になります。 – user1620443
正直言って、それは逆の方法だと思っていましたが、逆さまのチェックを無くしても問題はありませんでした。私はその殺害を取り除くだろう。ありがとうございました – WDickens