2016-11-08 14 views
0

私のコードを正しく動作させるために壁に頭を打つ。本質的には、私は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() 
+0

どのように失敗しますか?何が起こっている?出力はありますか?詳細を含める必要があります。あなたはあなたの質問を編集することができます。あなたはPerlプログラムを自分で書いていませんでしたか?それは既に存在していたか、またはあなたが使用しているソフトウェアがあればそれと共に来ました。 – simbabque

+0

'check_output'はコマンドの出力を返しますが、すでに出力をファイルに書き込んでいるコマンドにはあまり意味がありません。おそらく 'subprocess.call'を代わりに使うことができます。 – chepner

+0

@simbabque - フィードバックいただきありがとうございます。私はあなたの質問に答えるためのいくつかの追加の詳細を追加しました。 – Brian

答えて

2
concatvar = "/usr/bin/perl -I /opt/voyence/tools/db-utility/common /opt/voyence/tools/db-utility/database-utility.pl" + CallLoad + " >> " + LOGFILE 

この連結プログラムの名前(database-utility.pl)を変数CallLoadの内容で置き換えます - その間にスペースは入れません。したがって、CallLoadの値がスペースで始まらないと、実際にはdatabase-utility.plWhateverIsInCallLoadというプログラムが検索されます。

+0

ええ、私は間隔を占めた。アクションの下には、コールロードの前にスペースがあるため、渡された各引数が指定されています。 – Brian

+0

ええ、私は今それを参照してください。私はこれがあなたの問題の原因ではないことを理解しています。しかし、個々の議論(その存在が謎である)ではなく、上に引用した行(その存在が意味をなされる)にスペースを入れる方が良いのではないでしょうか? –

+1

ええ、私はあなたの思考プロセスに同意するでしょう。あなたの変更は多くの意味があります。私は今それを組み込むと思う。 – Brian

0

テストされていませんが、もっと慣れていないPython。主な変更点は、Perlスクリプトを呼び出すときにシェルを完全にバイパスし、問題のデバッグを助けるためにsubprocess.callで発生する可能性のあるエラーを記録することです。代わりにloggingモジュールを使用することを検討してください。しかし、十分な変更が既にあります。

#! /usr/bin/python 
import sys 
import time 
import os 
import subprocess 

def subprocess_caller(path, call_load, log_obj): 
    subprocess.call(["/usr/bin/perl", 
        "-I", 
        "/opt/voyence/tools/db-utility/common", 
        path, 
        call_load], 
        stdout=log_obj) 

log_header = """\ 
------------------------------------------------------------------------------------------------------ 
Weekly Voyence archival, deletion, and purging of jobs, events, and revisions beginning at %s 
""" %(time.strftime("%H:%M:%S"),) 

if __name__ == "__main__": 

    #declare variables and objects 
    path = "/opt/voyence/tools/db-utility/database-utility.pl" 
    logfile = time.strftime("/var/log/voyence-archive/%Y%m%dvoyence-archive.log") 

    #create new log file 
    with open(logfile, "a+") as log: 
     log.write(hog_header) 
     #job archival, deletion, and purging 
     job_actions = [" archive jobs 90"," delete jobs 90"," purge jobs 275"] 
     #event archival, deletion, and purging 
     event_actions = [" archive events all 90"," delete events all 90"," purge events all 275"] 
     #revision archival, deletion, and purging 
     revision_actions = [" archive revisions 40"," purge revisions 60"," delete revisions '3 months' 40"] 

     actions = job_actions + event_actions + revision_action: 

     for action_type in actions: 
      for item in action_type: 
       try: 
        subprocess_caller(path, item, log) 
       except Exception as exc: 
        log_obj.write(exc + "\n") 
        log_obj.write("Block failed, continuing to next block\n") 
        break 
       log.write("------\n") 

     log.write("Weekly Voyence archival, deletion, and purging of jobs, events, and revisions complete at %s\n" % 
        (time.strftime("%H:%M:%S"),)) 
+0

プロトタイプをありがとう。私はいくつかのエラーを修正するために私の側でいくつかの変更を加えました。私は私のdevの箱の上で実行可能なスクリプトと信じているものを持っていると私はそれが動作する方法を見るために今夜cronの仕事として実行させます。私はそれがどのようになったかをあなたに知らせます。 – Brian

関連する問題