2

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 は正常に実行され、0 で終了します。これにより、if ステートメントで logging.debug 行が実行されます。ただし、これは発生せず、代わりにスクリプトから次の出力を受け取りました。

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

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

> cat /var/log/lvsnap.log 
DEBUG:root:logging is working before lvm snapshot
DEBUG:root:logging is working after lvm snapshot
>

ご覧のとおり、lvm logging.debug メッセージがありません (作成した 2 つのテスト ログ メッセージの間に表示されるはずです)。

なぜこれが起こっているのですか、どうすれば修正できますか?

4

1 に答える 1

3

ゼロを返すlogging.debugため、「欠落」を呼び出していないため、条件が満たされることはありません。試すlvmCreateSnapshotif

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が成功するとが実行され、それ以外の場合は条件が実行されるようにします。subprocessif

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

subprocessエラーを返した場合にのみデバッグメッセージを出力します。

編集:

のドキュメントを見たところです。http://docs.python.org/library/subprocess.htmlsubprocess.check_call()を参照してください。これは、サブプロセス呼び出しが成功した場合はゼロを返し、そうでない場合は例外を発生させると述べています。したがって、通常のtry/exceptブロックでこの例外をキャッチする必要があります。次のようなもので十分です。subprocess.check_callCalledProcessError

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

于 2011-07-11T08:16:56.547 に答える