Como posso saber quando um processo terminou de gravar em um arquivo?

9

Eu tenho um processo que foi gerado a partir de um shell. Ele está sendo executado como um processo em segundo plano e exportando um banco de dados para um arquivo CSV em /tmp .

Como posso saber quando o processo em segundo plano foi concluído (concluído / encerrado) ou se o bloqueio do arquivo CSV foi fechado? Eu planejo fazer o FTP do arquivo para outro host, uma vez que está escrito, mas eu preciso do arquivo completo antes de iniciar a transferência de arquivos.

    
por user34210 25.09.2014 / 16:38

2 respostas

7

No Linux, o arquivo não está bloqueado, mesmo quando um programa está gravando nele (ao contrário do Windows).

Para verificar se o processo está concluído, use:

while [[ 1 ]]; do
  pgrep dbprocess &>/dev/null

  if [[ $? -eq 0 ]]; then
    echo still running
  else
    echo finished
    # start ftp transfer
  fi
  sleep 2
done

Para verificar se o processo tem o arquivo aberto, você pode usar

  • lsof <file> listará os processos que abriram <file>

  • ls -l /proc/$(pgrep db-process)/fd lista os descritores de arquivos abertos pelo processo db-process

por 25.09.2014 / 16:42
7

Você pode usar o shell wait incorporado para realizar isso.

O wait incorporado simplesmente faz com que o shell pause enquanto aguarda a conclusão das tarefas em segundo plano. Você pode passar um trabalho específico para esperar ou esperar por todos os trabalhos.

Por exemplo:

echo $(date): starting
sleep 5 &
echo $(date): do something else
wait
echo $(date): background job finished

O que resulta em:

Thu Sep 25 12:06:48 EDT 2014: starting
Thu Sep 25 12:06:48 EDT 2014: do something else
Thu Sep 25 12:06:53 EDT 2014: background job finished
    
por 25.09.2014 / 18:07