次の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つのテストログメッセージの間に表示されます)。
なぜこのようなことが起こり、どうすれば解決できますか?
クリスお礼ありがとうございました。「そうでない場合」を使用すると正しい結果が得られます。私はbashスクリプトを書くことから来て、これは直感的ではないように思われたので混乱しました。 「lvm_create_snapshotが失敗ではない場合は失敗し、それ以外の場合はCalledProcessError例外を送出する」という別の方法がありますか? – jelloir
問題ありません。 'lvm_create_snapshot'が失敗した場合、自動的に' CalledProcessError'例外が発生します。これを行う必要はありませんが、この例外が発生した場合にこの例外を処理するコードを記述する必要があります(必要な場合)。私はあなたが私の元の答えをすることができるものの例を加えました。 – Chris