limit czasu, łamanie rur i wc


20

Miałem pomysł, aby szybko przeprowadzić testy porównawcze niektórych programów dekompresyjnych. Np. Dla gz uruchomiłbym polecenie:

timeout 10 zcat foo.gz | wc -c

Który mierzyłby ilość danych, które dekompresor mógłby wyodrębnić w ciągu 10 sekund.

Jedynym problemem jest to, że nie działa: ponieważ Zcat jest zabijany, wc również jest zabijany, więc nie otrzymuję liczby bajtów, tylko Terminatedwiadomość.

Pytanie brzmi zatem: czy istnieje sposób, aby uzyskać licznik z wc , albo blokując sygnał, albo użyj alternatywy zamiast wc, która wyświetla wynik, nawet gdy otrzyma sygnał terminu.


Oczywiście istnieją alternatywy:

  1. Zapis do pliku tymczasowego:
    timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x Problem polega na tym, że zużywa dużo pamięci, a także może mieć negatywny wpływ na wydajność.

  2. Zamiast tego używa się ulimit:
    ulimit -t 10; zcat foo.gz | wc -c
    Działa to również, ale mierzy tylko czas procesora, więc spowolnienie z powodu operacji we / wy (np. Ponieważ kompresja jest gorsza i więcej bajtów musi zostać odczytanych z dysku) nie jest mierzone.

  3. Tworzenie mniejszych plików testowych:
    Cóż, to może oczywiście działać i może być najmilszym rozwiązaniem. Tworzy to jednak wiele plików tymczasowych.


6
Kiedy czytałem „łamanie rur i wc”, pomyślałem na początku, że masz problemy z hydrauliką!
dr01

Odpowiedzi:


21

Możesz umieścić polecenie limitu czasu w podpowłoce i sprawić, by się powiodło:

( timeout 10 <command> || true ) | wc -c

3
Udane wykonanie nieudanego polecenia? Och, to wygląda tak źle: D
Erathiel

17
@Erathiel Chcesz się uśmiechać będąc złym? Spróbuj tego (odpowiada to powyższemu):(timeout 10 <command> || :) | wc -c
Marco

1
Próbowałem użyć podpowłoki, ale nie zastanawiałem się, czy to się uda. Doskonały!
P.Péter,

2

Zaraz po opublikowaniu pomyślałem o użyciu nazwanych potoków w tym procesie:

mkfifo /tmp/x; wc -c /tmp/x & timeout 10 zcat foo.gz > /tmp/x &

To wydaje się działać.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.