timeout, rottura tubi e wc


20

Ho avuto l'idea di confrontare rapidamente alcuni programmi di decompressione. Ad esempio per gz, eseguirò il comando:

timeout 10 zcat foo.gz | wc -c

Il che misurerebbe la quantità di dati che il decompressore potrebbe estrarre in 10 secondi.

L'unico problema è che non funziona: poiché zcat viene ucciso, anche wc viene ucciso, quindi non ottengo il conteggio dei byte, ma solo un Terminatedmessaggio.

Quindi, la domanda è: c'è un modo per ottenere il conteggio da wc , bloccando il segnale in qualche modo, o usare un'alternativa invece di wc che stampa un risultato anche quando riceve un segnale di termine.


Certo, ci sono alternative:

  1. Scrivere in un file temporaneo:
    timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x il problema è che utilizza molta memoria e potrebbe anche avere delle penalità per le prestazioni.

  2. Usando invece ulimit:
    ulimit -t 10; zcat foo.gz | wc -c
    funziona anche questo, ma misura solo il tempo della CPU, quindi il rallentamento dovuto all'I / O (ad es. Perché la compressione è peggiore e più byte devono essere letti dal disco) non viene misurato.

  3. Creazione di file di test più piccoli:
    Beh, questo può ovviamente funzionare e potrebbe essere la soluzione migliore. Tuttavia, questo crea molti file temporanei.


6
Mentre leggevo "Rottura di tubi e wc", all'inizio pensai che avessi problemi con il tuo impianto idraulico!
dr01,

Risposte:


21

È possibile posizionare il comando timeout in una subshell e farlo funzionare correttamente:

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

3
Far funzionare un comando fallito? Oh, sembra così malvagio: D
Erathiel,

17
@Erathiel Vuoi sorridere pur essendo malvagio? Prova questo (è equivalente a quanto sopra):(timeout 10 <command> || :) | wc -c
Marco

1
Ho provato a usare una subshell, ma non ho pensato di farcela. Eccellente!
P.Péter,

2

Subito dopo la pubblicazione, ho pensato di utilizzare le pipe denominate per il processo:

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

Questo sembra funzionare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.