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.