Interromper trabalho em lote entre arquivos

Interromper trabalho em lote entre arquivos

Preciso configurar meu trabalho em lote bash (compactando arquivos de 5,1k no local) para que, se eu precisar parar/retomar o trabalho, ele espere até que esteja "entre" os arquivos (acabe de terminar um e não tenha iniciado outro).

Minha compactação seria como pigz -9 -- rsnc*se tudo fosse executado ao mesmo tempo, e eu estava pensando em algo como:

ls rsnc* | while read file 
  do pigz -9 -- $file
  if [ -f .intr ]
    then break
  fi
done

Este é um meio confiável de atingir meu objetivo? Existe uma maneira melhor?

Responder1

Você pode trap [1],[2] o sinal Ctrl+ C, o INT, e waitpara o final de cada processo.

#!/bin/bash

trap ctrl_c INT

function ctrl_c() {
        wait   # wait for the end of all child processes    
        exit   # <<--- put here your exit code exit 1, ... 
}

shopt -s nullglob
for f in rsnc*
do
    pigz -9 -- $file &   # Execute in background
    wait  $!             # Wait for the end of the last command 
done

Observação
Existem muitas maneiras de percorrer todos os arquivos em um diretório [3] , mas é sempreé melhor evitar analisar a saída dels [4] .

Referências

informação relacionada