2011-07-11 21 views
2

次のPythonコードを使用して、Linuxマシンでlvmスナップショットを作成しました。ファイル記述子メッセージが開いたときにPythonロギングが失敗する

#!/usr/bin/env python3.1 

import subprocess 
import logging 
logging.basicConfig(filename='/var/log/lvsnap.log', filemode='w', level=logging.DEBUG) 

lvm_vg = 'vg00-crunchbang' 
lvm_name = 'root' 
lvm_snapshot_size = '100' 

def lvmCreateSnapshot(lvm_vg, lvm_name, lvm_snapshot_size): 
    return subprocess.check_call(['lvcreate', '-s', '-l', '+' + lvm_snapshot_size + '%FREE', '-n', lvm_name + '-snapshot', lvm_vg + '/' + lvm_name]) 

logging.debug('logging is working before lvm snapshot') 

''' create lvm snapshot ''' 
lvm_create_snapshot = lvmCreateSnapshot(lvm_vg, lvm_name, lvm_snapshot_size) 
if lvm_create_snapshot: 
    logging.debug('create lvm snapshot of %s/%s exited with status %s', lvm_vg, lvm_name, lvm_create_snapshot) 

logging.debug('logging is working after lvm snapshot') 

lvmCreateSnapshotが正常に動作して、if文でlogging.debugラインを実行する必要があります0これで終了します。 しかし、これは発生しません、代わりに私は、スクリプトから次の出力を受け取っ:

> /tmp/lvmsnap.py 
File descriptor 3 (/var/log/lvsnap.log) leaked on lvcreate invocation. Parent PID 7860: python3.1 
Logical volume "root-snapshot" created 
> 

ログの出力は次のとおりです。

LVMのlogging.debugを持っているあなたが見ることができるよう、
> cat /var/log/lvsnap.log 
DEBUG:root:logging is working before lvm snapshot 
DEBUG:root:logging is working after lvm snapshot 
> 

メッセージがありません(作成した2つのテストログメッセージの間に表示されます)。

なぜこのようなことが起こり、どうすれば解決できますか?

答えて

3

lvmCreateSnapshotがゼロを返すため、「不足している」logging.debugが呼び出されていないため、ifの条件は決して満たされません。試してみてください

if lvm_create_snapshot: 
    logging.debug('Error creating lvm snapshot of %s/%s, exited with status %s', lvm_vg, lvm_name, lvm_create_snapshot) 
else: 
    logging.debug('created lvm snapshot of %s/%s, lvm_vg, lvm_name) 

のでelseが成功subprocessコールでexectudedされ、subprocessがエラーを返した場合if条件がそうでなければ出力のみにデバッグメッセージを

if not lvm_create_snapshot: 
    logging.debug('...debugging text...') 

をexectuded、またはされていること。

編集:私はちょうどsubprocess.check_call()のドキュメントを見てきました

http://docs.python.org/library/subprocess.htmlを参照して、サブプロセスの呼び出しが成功した場合subprocess.check_callリターンがゼロと述べているし、そうでない場合CalledProcessError例外が発生します。したがって、通常のtry/exceptブロックでこの例外をキャッチする必要があります。次のようなもので十分です。

try: 
    lvmCreateSnapshot(lvm_vg, lvm_name, lvm_snapshot_size) 
    logging.debug('created lvm snapshot of %s/%s', lvm_vg, lvm_name) 
except CalledProcessError as e: 
    logging.debug('Error creating lvm snapshot of {0}/{1}. Return code was {2}'.format(lvm_vg, 
     lvm_name, e.returncode)) 
    raise 

最終的にはトレースバックが印刷されます。もちろん、代わりにreturn 1のようなものを使用できます。

+0

クリスお礼ありがとうございました。「そうでない場合」を使用すると正しい結果が得られます。私はbashスクリプトを書くことから来て、これは直感的ではないように思われたので混乱しました。 「lvm_create_snapshotが失敗ではない場合は失敗し、それ以外の場合はCalledProcessError例外を送出する」という別の方法がありますか? – jelloir

+0

問題ありません。 'lvm_create_snapshot'が失敗した場合、自動的に' CalledProcessError'例外が発生します。これを行う必要はありませんが、この例外が発生した場合にこの例外を処理するコードを記述する必要があります(必要な場合)。私はあなたが私の元の答えをすることができるものの例を加えました。 – Chris

関連する問題