USBバーコードリーダーの入力をリッスンするために優れた「evdev」ライブラリを使用しています。デバイスが突然取り外されたり応答しなくなったりするかどうかを検出する必要があります。そうしないと、ループを読み取るpythonスクリプトが単一のスレッドで100%のCPU使用率になり、利用可能なすべてのメモリをゆっくりと消費し始め、しばらくするとシステム全体がクラッシュします。
アイデアは、デバイスのプラグが抜かれたことを検出し、現在のスクリプトを強制終了して、デバイスが再び差し込まれるか応答するまでスーパーバイザがスクリプトを再起動しようとすることです。
入力を読み取るために使用しているコードは次のとおりです。
devices = map(InputDevice, list_devices())
keys = {
2: 1,
3: 2,
4: 3,
5: 4,
6: 5,
7: 6,
8: 7,
9: 8,
10: 9,
11: 0,
}
dev = None
for d in devices:
if d.name == 'Symbol Technologies, Inc, 2008 Symbol Bar Code Scanner':
print('%-20s %-32s %s' % (d.fn, d.name, d.phys))
dev = InputDevice(d.fn)
break
if dev is not None:
code = []
for event in dev.read_loop():
if event.type == ecodes.EV_KEY:
if event.value == 00:
if event.code != 96:
try:
code.append(keys[event.code])
except:
code.append('-')
else:
card = "".join(map(str, code))
print card
code = []
card = ""
では、これを適切な方法で行うにはどうすればよいでしょうか。
私がそれがうまくいくかもしれないと思った方法は、1〜5分ごとにcronから実行され、デバイスがまだ利用可能かどうかを確認する2番目のスクリプトです。現在であれば、ファイルからプロセスIDを取得してプロセスを強制終了しますが、この方法では、デバイスがプラグを抜いてからチェックの間に再び差し込むと、メイン スクリプトがゆっくりとクラッシュしている間、「チェッカー」スクリプトはすべて問題ないと判断します。