Comment savoir quand un processus a fini d'écrire dans un fichier?

9

J'ai un processus qui a été généré à partir d'un shell. Il s'exécute en tant que processus d'arrière-plan et exporte une base de données vers un fichier CSV dans /tmp.

Comment savoir quand le processus d'arrière-plan est terminé (terminé / quitter) ou si le verrouillage du fichier CSV est fermé? J'ai l'intention de transférer le fichier par FTP vers un autre hôte une fois qu'il est écrit, mais j'ai besoin du fichier complet avant de commencer le transfert de fichier.

user34210
la source
Faites en sorte que le processus vous informe d'une manière ou d'une autre ...
Courses de légèreté en orbite

Réponses:

7

Sous Linux, le fichier n'est pas verrouillé même lorsqu'un programme y écrit (contrairement à Windows).

Pour vérifier si le processus est terminé, utilisez:

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

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

Pour vérifier si le processus a ouvert le fichier, vous pouvez utiliser

  • lsof <file> il listera les processus qui ont ouvert <file>

  • ls -l /proc/$(pgrep db-process)/fd répertorie les descripteurs de fichiers ouverts par le processus db-process

Sébastien
la source
7

Vous pouvez utiliser le waitshell intégré pour accomplir cela.

La fonction waitintégrée fait simplement interrompre le shell en attendant la fin des travaux en arrière-plan. Vous pouvez soit lui passer un travail spécifique à attendre, soit le faire attendre pour tous les travaux.

Par exemple:

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

Ce qui se traduit par:

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
la source