Grep, maç bulduktan sonra çıkmak için yavaş mı?


20

Aygıt bağlantıları için btmon sorgulayan bir bash betiği yazmaya çalışıyorum. Çalışan bir çözümüm var, ama saçma derecede yavaş ve sorun bir maç bulduktan sonra çıkmak için çok yavaş olması gibi görünüyor (yaklaşık 25 saniye). Hızlandırmak grepveya tamamen kullanmaktan kaçınmak için ne yapabilirim ?

#!/bin/bash
COUNTER=0
while :
  do
    until btmon | grep -m 1 '@ Device Connected'
      do :
    done
    let COUNTER=COUNTER+1
    echo on 0 | cec-client RPI -s -d 1
    sleep 5
    echo as | cec-client RPI -s -d 1
    until btmon | grep -m 1 '@ Device Disconnected'
      do :
    done
    let COUNTER=COUNTER-1
    if [ $COUNTER -eq 0 ];
      then echo standby 0 | cec-client RPI -s -d 1;
    fi
done

edit: btmonAçıklığa kavuşturmak ve Bluez paketinin bir parçası olan bir bluetooth izleme aracıdır ve cec-client (diğer şeylerin yanı sıra) HDMI-CEC seri veri yolu üzerinden komutlar vermek için libCEC ile paketlenmiş bir yardımcı programdır.


2
Ne kadar "malzeme" btmonçıktı? sadece tamponlama meselesi olmadığından emin misin?
steeldriver

@steeldriver İkincisi. Borudaki tamponlamayı devre dışı bırakmayı denediniz mi?
l0b0

btmon saniyede yaklaşık 250 karakter çıkarır.
Rob

@ l0b0 Arabelleğe alma komutunu arabelleğe almayı devre dışı bırakmayı denedim, ancak bu grep'in çıkmasını engelliyor gibi görünüyor mu? Ayrıca grep'i --line-buffer moduna zorlamaya çalıştım, ancak bu yardımcı olmadı.
Rob

O olabilir btmonEğer şans bitti bu durumda kendini tamponlama uygular.
l0b0

Yanıtlar:


28

İçinde:

cmd1 | cmd2

En kabukları (Bourne kabuğu, (t), CSH, hem de yash ve önemli istisnalar olmak bazı koşullarda, AT & T ksh bazı versiyonları) her ikisi için de bekleme cmd1ve cmd2.

İçinde bash,

sleep 1 | uname

bir saniye sonra döner.

İçinde:

btmon | grep -m 1 '@ Device Disconnected'

grepkalıbın bir örneğini bulur bulmaz bashçıkacaktır , ancak yine de bekleyecektir btmon.

btmontipik olarak grepgeri döndükten sonra boruya bir sonraki yazışında SIGPIPE'den ölecektir , ancak bir daha asla bir şey yazmazsa bu sinyali asla alamaz.

Bu #! /bin/bashile #! /bin/ksh93uyumlu bir kabuk bashve sadece bir boru hattının son bileşenini bekleyen bir kabuk ile değiştirebilirsiniz . Daha sonra

btmon | grep -m 1 '@ Device Disconnected'

grepdönüşten sonra , btmonarka planda çalışmaya bırakılır ve kabuk, komut dosyasının geri kalanıyla devam eder.

Eğer btmonen kısa sürede grepgeri dönmek istiyorsanız, POSIXly, şöyle bir şey yapabilirsiniz:

sh -c 'echo "$$"; exec btmon' | (
   read pid
   grep -m1 '@ Device Disconnected' || exit
   kill "$pid" 2> /dev/null
   true)

3
Bunun neden böyle davrandığını açıkladığınız için teşekkür ederiz. Bana bash btmon'un çıkmasını beklemiyordu. Ksh93 ile değiştirmek güzel çalışıyor!
Rob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.