Quoi qu'il en soit pour échouer / retarder un process cp?

C'est un scénario hypothétique. Disons que j'ai un dossier particulier qui est synchronisé par un process qui reçoit des files / dossiers via Internet. Maintenant, pendant que cette opération est en cours, pour le synchroniseur, il ne devrait pas y avoir d'opérations cp dans son directory. De toute façon cela peut être réalisé?

Votre synchroniseur écrit dans le directory plutôt que de lire, non? Donc, prendre un instantané du système de files ou définir le bit immuable est désactivé.

Si vous exécutez le synchroniseur en tant que root, vous pouvez changer la propriété du directory en racine et les permissions sur 700 (rwx ——; seul le propriétaire peut faire n'importe quoi). Cela empêchera tout nouveau process de ne pas s'exécuter en tant que root, mais tout process ayant déjà un file ou un sous-directory ouvert pourra toujours apporter des modifications.

Sous Linux, si vous voulez find tous les process qui ont actuellement des files ouverts dans votre arborescence, vous pouvez faire lsof +D my_directory . Ce que vous faites avec cette connaissance, cependant, dépend de la situation.

Il y a au less deux solutions possibles:

  1. Créez un script d'encapsuleur pour cp qui vérifie si la synchronisation est en cours d'exécution, soit en vérifiant si le process est en cours d'exécution ou en testant un file de locking, et en interrompant ou en retardant l'opération.
  2. Utilisez LD_PRELOAD pour connecter des appels en write et autres.

Le problème avec la première solution est que vous devez envelopper toutes les commands utilisées pour écrire dans le dossier, par exemple mv , cp , rsync , rm , ln , cat … D'un autre côté c'est assez simple mais cela fonctionnera aussi pour votre user actuel.

Pour la deuxième solution, vous devez écrire une bibliothèque partagée avec tous les appels système utilisés pour modifier / modifier le directory, par exemple write , unlink , rename . Mais cette solution fonctionnerait avec tous les exécutables liés dynamicment – donc pas besoin d'ajuster tous les autres programmes.

Si vous savez que le process de synchronisation s'exécute et que la seule opération possible est cp , vous pouvez envoyer SIGSTOP à tous les process pour suspendre l'exécution. Une fois la synchronisation terminée, vous envoyez SIGCONT à tous les process pour continuer.

Pour cela, vous pouvez utiliser kill -s SIGSTOP $(pidof cp) ou killall -s SIGSTOP cp . Dans un terminal, vous pouvez utiliser Ctrl + Z pour mettre en arrière une tâche ("pause"). Pour continuer l'exécution, utilisez la command fg ("foreground", voir help fg ).