Как я могу узнать, когда процесс завершил запись в файл?

9

У меня есть процесс, который был порожден из оболочки. Он работает как фоновый процесс и экспортирует БД в файл CSV в /tmp.

Как узнать, когда фоновый процесс завершен (завершен / завершен) или закрыта ли блокировка файла CSV? Я планирую отправить файл по FTP на другой хост, как только он будет записан, но мне нужен полный файл, прежде чем я начну передачу файла.

user34210
источник
Сделайте так, чтобы процесс как-то проинформировал вас ...
Гонки легкости на орбите

Ответы:

7

В Linux файл не блокируется даже во время записи в него программы (в отличие от Windows).

Чтобы проверить, завершен ли процесс, используйте:

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

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

Чтобы проверить, открыт ли файл в процессе, вы можете использовать

  • lsof <file> в нем будут перечислены процессы, которые открылись <file>

  • ls -l /proc/$(pgrep db-process)/fd перечисляет файловые дескрипторы, открытые процессом db-process

Себастьян
источник
7

Вы можете использовать waitвстроенную оболочку для этого.

waitВстроенный просто заставляет оболочку , чтобы сделать паузу в ожидании фоновых заданий до завершения. Вы можете либо передать ему конкретное задание, либо дождаться его выполнения.

Например:

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

Что приводит к:

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
Патрик
источник