J'ai deux répertoires distincts. L'utilisateur charge un fichier dans le premier. Il y a un cronjob en arrière-plan qui copie les fichiers toutes les 5 minutes dans le deuxième répertoire.
Que se passe-t-il si l'utilisateur n'a pas terminé son téléchargement et que le cronjob copie les fichiers? Notez que les deux répertoires appartiennent à des utilisateurs différents, le cronjob est effectué en tant que root.
cp
N'attendra pas le téléchargement complet du fichier. Comme nous nous attendons à ce que le taux de transfert réseau soit inférieur à la simple copie du fichier d'un emplacement à un autre à l'intérieur du même hôte, ilcp
atteindra à un moment donné la fin du fichier actuel et arrêtera la copie. La solution à votre problème peut être simple: tout d'abord, l'utilisateur télécharge le fichier avec un nom de fichier spécialement modifié (par exemple précédé de.
(caractère point). Lorsque le transfert est terminé, l'utilisateur le renomme avec le nom d'origine. Ensuite, le travail cron ne regarde que pour les fichiers qui ne commencent pas.
.Réponses:
cp
ne connaît pas les fichiers ouverts. Donc, si le premier utilisateur télécharge un gros fichier et que cronjob (ou tout autre processus) commence à copier ce fichier, il ne copiera que ce qui a déjà été écrit. Vous pouvez penser à cela de cette façon -cp
fait une copie de ce qui est actuellement sur le disque, peu importe si le fichier est complet. Sinon, vous ne pourriez pas copier les fichiers journaux par exemple.la source
fuser
+cp
. Une telle copie serait vraiment très peu fiable. Elle ne copiera aucun fichier ouvert dans l'éditeur de texte par exemple.lsof
? Le résultat est censé être facile à traiter. Vous pouvez filtrer les fichiers ouverts (par exemple, par une instance decp
) pour l'écriture.fuser
bien sûr) car cet outil peut ne pas afficher tous les fichiers.cp
ne sait pas quels autres programmes peuvent avoir les fichiers ouverts. Il n'y a pas de magiecp
. La conception d'Unix évite délibérément de mettre tout type de verrous sur les fichiers à moins qu'il n'y ait une raison impérieuse (ce qui signifie convaincant que le noyau en a besoin). Sur cette rubrique, voir La redirection de la sortie vers un fichier applique-t-elle un verrou sur le fichier?De telles situations, où un fichier est produit par un producteur et, une fois terminé, consommé par un consommateur, sont courantes. La façon habituelle de gérer cela est de demander au producteur d'écrire un fichier temporaire que le consommateur ne recherchera pas, puis une fois que le producteur a terminé, déplacez le fichier dans un endroit où le consommateur le trouvera. Déplacer un fichier (sur le même système de fichiers) est une opération atomique: à un moment donné, pour le consommateur, le fichier passe de ne plus être là à être là.
Arrangez-vous donc pour que votre travail de téléchargement déplace les fichiers vers un répertoire différent une fois le téléchargement terminé. Pointez le travail cron vers ce répertoire différent.
la source
Il semble que vous souhaitiez effectuer un travail de synchronisation de dir.
Parce que le option -u, --update de
cp
Vous pouvez donc ajouter un cronjob tel que
cp -auv SOURCEDIR/* DESTDIR
qui copiera les fichiers dont l'heure de modification a changé. Cela signifie que vousDESTDIR
obtiendrez éventuellement la copie complète une fois le téléchargement terminé.rsync
peut faire le même travail. par exemplersync -av SOURCEDIR/ DESTDIR
.Bien que l'option -a soit appliquée, certains attributs spécifiés (par exemple, la propriété) ne peuvent être conservés que par le super-utilisateur.
Voir
man cp
,man rsync
pour plus de détails.la source