私のコードを正しく動作させるために壁に頭を打つ。本質的には、私はcronによって呼び出されるpythonスクリプトを書いています。このスクリプトは、1週間に1回実行してデータベースのメンテナンスを実行します。私のpythonスクリプトは、実際のメンテナンスを実行するperlスクリプトを呼び出します。 Perlスクリプトは合計9回実行されるため、この方法でビルドしなければなりませんでした。 DBアイテムには3つの異なるカテゴリがあり、各カテゴリにはperlスクリプトとは3つの異なるアクションが必要です。いずれかのカテゴリの1つのアクションが失敗した場合、スクリプトはそのカテゴリから切り離して次のアクションに移動します(各アクションは前のアクションに依存します)。パイプサブプロセスをLinuxのファイルに変換する
スクリプトが正常に実行されず、理由がわかりません。私はそれをトラブルシューティングしようとしているが、私のロギングロジックが正しく動作していない。ログファイルに出力される唯一の出力は、表記と書式設定のためにスクリプトに書き込んだシンプルな「印刷」コマンドです。
私はperlスクリプトをCLIから直接実行することはできますが、Pythonスクリプトから呼び出されたときに正しく実行されません。誰でも私に正しい方向に向けることができますか?
EDIT: 質問に答えて、私はperlスクリプトがどのように失敗しているかの良い説明はありません。私はstdoutまたはstderrをperlスクリプトから自分のログファイルに取得していないので、なぜそれが失敗しているのかまだ分かりません。 私は、管理しているソフトウェアスイートと共に提供されたperlスクリプトを作成しませんでした。ここで
は、ログファイルの出力です:ここで
------------------------------------------------------------------------------------------------------
Weekly Voyence archival, deletion, and purging of jobs, events, and revisions beginning at 14:46:11
Block failed, continuing to next block
------
Block failed, continuing to next block
------
Block failed, continuing to next block
------
Weekly Voyence archival, deletion, and purging of jobs, events, and revisions complete at 14:46:11
は、(エラーなし)CLIからperlスクリプトを実行しているから出力されます。ここでは
Script started at Mon Nov 7 14:59:53 2016
Archving/Pruning 0 Parent jobs older than 90 days...
Archving/Pruning 0 Child Jobs older than 90 days...
No Records avaialble for archive..jobs Exiting
Script Completed.
The database utility console log can be found at /opt/voyence/tools/db- utility/logs/dbutil_console.log
Script exited at Mon Nov 7 14:59:58 2016
はPythonスクリプトです:
#! /usr/bin/python
import sys
import time
import os
import subprocess
def SubProcessCaller(PATH,CallLoad,LogObj,LOGFILE):
try:
# subprocess.Popen(["/usr/bin/perl", "-i", "/opt/voyence/tools/db- utility/database-utility.pl", CallLoad], stderr=LogObj.write, stdout=LogObj.write, shell=true)
concatvar = "/usr/bin/perl -I /opt/voyence/tools/db-utility/common /opt/voyence/tools/db-utility/database-utility.pl" + CallLoad + " >> " + LOGFILE
subprocess.check_output(concatvar.split(), shell=True)
return True
except:
LogObj.write("Block failed, continuing to next block" "\n")
return False
if __name__ == "__main__":
#DECLARE VARIABLES AND OBJECTS
TIME = time.strftime("%H:%M:%S")
PATH = "/opt/voyence/tools/db-utility/database-utility.pl"
DATE = time.strftime("%Y%m%d")
LOGFILE = "/var/log/voyence-archive/" + DATE + "voyence-archive.log"
LOG = open(LOGFILE, "a+")
#CREATE NEW LOG FILE
LOG.write("------------------------------------------------------------------------------------------------------\n")
LOG.write("Weekly Voyence archival, deletion, and purging of jobs, events, and revisions beginning at " + TIME + "\n")
#JOB ARCHIVAL, DELETION, AND PURGING
JobActionsDict = [" archive jobs 90"," delete jobs 90"," purge jobs 275"]
#EVENT ARCHIVAL, DELETION, AND PURGING
EventActionsDict = [" archive events all 90"," delete events all 90"," purge events all 275"]
#REVISION ARCHIVAL, DELETION, AND PURGING
RevisionActionsDict = [" archive revisions 40"," purge revisions 60"," delete revisions '3 months' 40"]
ActionsTuple = (JobActionsDict, EventActionsDict, RevisionActionsDict)
for dict in ActionsTuple:
for item in dict:
SPCBool = SubProcessCaller(PATH,item,LOG,LOGFILE)
if SPCBool == False:
break
LOG.write("------\n")
#CLOSE AFTER ALL LOGS HAVE BEEN WRITTEN
LOG.write("Weekly Voyence archival, deletion, and purging of jobs, events, and revisions complete at " + TIME + "\n")
LOG.close()
どのように失敗しますか?何が起こっている?出力はありますか?詳細を含める必要があります。あなたはあなたの質問を編集することができます。あなたはPerlプログラムを自分で書いていませんでしたか?それは既に存在していたか、またはあなたが使用しているソフトウェアがあればそれと共に来ました。 – simbabque
'check_output'はコマンドの出力を返しますが、すでに出力をファイルに書き込んでいるコマンドにはあまり意味がありません。おそらく 'subprocess.call'を代わりに使うことができます。 – chepner
@simbabque - フィードバックいただきありがとうございます。私はあなたの質問に答えるためのいくつかの追加の詳細を追加しました。 – Brian