Come posso sapere quando un processo ha finito di scrivere su un file?


9

Ho un processo che è stato generato da una shell. È in esecuzione come processo in background ed esporta un DB in un file CSV in /tmp.

Come posso sapere quando il processo in background è stato completato (finito / esci) o se il blocco del file CSV è stato chiuso? Ho intenzione di inviare il file FTP a un altro host dopo averlo scritto, ma ho bisogno del file completo prima di iniziare il trasferimento del file.


Fai in modo che il processo ti informi in qualche modo ...
— Lightness Races in Orbit

Risposte:


7

Su Linux, il file non è bloccato anche quando un programma vi sta scrivendo (diversamente da Windows).

Per verificare se il processo è completato, utilizzare:

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

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

Per verificare se il processo ha il file aperto, è possibile utilizzare

  • lsof <file> elencherà i processi che si sono aperti <file>

  • ls -l /proc/$(pgrep db-process)/fd elenca i descrittori di file aperti dal processo db-process


7

È possibile utilizzare la waitshell integrata per ottenere questo risultato.

L' waitintegrato fa semplicemente mettere in pausa la shell in attesa del completamento dei lavori in background. È possibile passargli un lavoro specifico da attendere o attendere che tutti i lavori.

Per esempio:

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

Che si traduce in:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.