GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je m'assurer qu'une seule instance d'un script Ruby s'exécute à la fois ?

Je sais que c'est ancien, mais pour toute personne intéressée, il existe une constante non bloquante que vous pouvez transmettre à flock afin qu'elle revienne au lieu de bloquer.

File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )

Mise à jour pour slhck

flock renverra true si ceci processus a reçu le verrou, false sinon. Donc, pour vous assurer qu'un seul processus est en cours d'exécution à la fois, vous voulez juste essayer d'obtenir le verrou et quitter si vous n'y parvenez pas. C'est aussi simple que de mettre un exit unless devant la ligne de code que j'ai ci-dessus :

exit unless File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )

Bien que cela ne réponde pas directement à votre question, si j'étais vous, j'écrirais probablement un script démon (vous pouvez utiliser http://daemons.rubyforge.org/)

Vous pourriez avoir votre indexeur (en supposant que son indexer.rb) soit exécuté via un script wrapper nommé script/index par exemple :

require 'rubygems'
require 'daemons'

Daemons.run('indexer.rb')

Et votre indexeur peut faire presque la même chose, sauf que vous spécifiez un intervalle de sommeil

loop do
   # code executing your indexing 

   sleep INDEXING_INTERVAL
end

C'est ainsi que fonctionnent généralement les processeurs de travaux en tandem avec un serveur de file d'attente.


Vous pouvez créer et supprimer un fichier temporaire et vérifier l'existence de ce fichier.Veuillez vérifier la réponse à cette question :un script shell d'instance


Selon vos besoins, cela devrait fonctionner correctement et ne nécessite pas la création d'un autre fichier n'importe où.

exit unless DATA.flock(File::LOCK_NB | File::LOCK_EX)

# your script here

__END__
DO NOT REMOVE: required for the DATA object above.

Linux
  1. Linux – Comment trouver la date de création du fichier ?

  2. Comment s'assurer qu'une seule instance d'un script Bash s'exécute ?

  3. Comment inclure un fichier dans un script shell bash

  4. déplacer uniquement si le fichier existe dans un script shell

  5. Limiter un programme graphique sous Linux à une seule instance

Comment déplacer une ligne vers le haut ou vers le bas d'une ligne dans un fichier texte ?

Comment créer un fichier temporaire en script shell ?

Comment rediriger uniquement Stderr ?

Comment vérifier la progression de l'exécution de Cp ?

Exécuter un script à chaque fois qu'un nouveau noyau est installé ?

Comment vérifier la syntaxe d'un script Bash sans l'exécuter ?