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. Está sendo executado como um processo em segundo plano e exportando um banco de dados para um arquivo CSV no Windows /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? Pretendo enviar o arquivo por FTP para outro host, uma vez gravado, mas preciso do arquivo completo antes de iniciar a transferência.

user34210
fonte
Tornar o processo de informá-lo de alguma forma ...
Leveza raças em órbita

Respostas:

7

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

Para verificar se o processo foi 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 foram abertos <file>

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

Sebastian
fonte
7

Você pode usar o waitshell interno para fazer isso.

O waitbuiltin simplesmente faz com que o shell pause, aguardando a conclusão dos trabalhos em segundo plano. Você pode aprovar um trabalho específico para aguardar ou esperar 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
Patrick
fonte