Bagaimana saya bisa tahu ketika suatu proses telah selesai menulis ke file?

9

Saya memiliki proses yang telah melahirkan dari shell. Ini berjalan sebagai proses latar belakang dan mengekspor DB ke file CSV di /tmp.

Bagaimana saya bisa tahu ketika proses latar belakang telah selesai (selesai / keluar) atau jika kunci file CSV telah ditutup? Saya berencana untuk FTP file ke host lain setelah ditulis, tetapi saya perlu file lengkap sebelum saya memulai transfer file.

pengguna34210
sumber
Jadikan proses memberitahu Anda entah bagaimana ...
Lightness Races di Orbit

Jawaban:

7

Di Linux, file tidak terkunci bahkan ketika sebuah program menulis ke sana (tidak seperti windows).

Untuk memeriksa apakah prosesnya selesai, gunakan:

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

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

Untuk memeriksa apakah proses membuka file, Anda dapat menggunakan

  • lsof <file> itu akan mencantumkan proses yang dibuka <file>

  • ls -l /proc/$(pgrep db-process)/fd daftar deskriptor file yang terbuka oleh proses db-process

Sebastian
sumber
7

Anda dapat menggunakan waitshell bawaan untuk melakukannya.

The waitbuiltin hanya menyebabkan shell untuk berhenti sejenak menunggu pekerjaan latar belakang lengkap. Anda bisa memberikannya pekerjaan tertentu untuk ditunggu, atau minta menunggu semua pekerjaan.

Sebagai contoh:

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

Yang mengakibatkan:

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
sumber