2010-10-21 21 views

Répondre

3

Vous pouvez utiliser un fichier de verrouillage pour cela. Lorsque la tâche est exécutée, essayez de saisir le verrou et exécutez la tâche de rake si vous obtenez le verrou. Si vous n'obtenez pas le verrou, ne courez pas; Vous pourriez également vouloir enregistrer une erreur ou un avertissement quelque part ou vous pouvez vous retrouver avec votre tâche de rake ne rien faire pendant des semaines ou des mois avant que vous le sachiez. Lorsque le rake se termine, déverrouillez le fichier de verrouillage.

Quelque chose comme RAA pourrait aider mais je ne l'ai pas utilisé alors peut-être pas.

Vous pouvez également utiliser un fichier PID. Vous auriez un fichier qui contient l'ID de processus des processus rake. Avant de démarrer rake, vous lisez le PID de ce fichier et voyez si le processus est en cours d'exécution; Si ce n'est pas le cas, lancez rake et écrivez son PID dans le fichier PID. Lorsque rake existe, supprimez le fichier PID. Vous voudriez combiner ceci avec le verrouillage sur le fichier PID si vous voulez être vraiment strict mais cela dépend de votre situation particulière.

+0

merci beaucoup. – www

+2

'flock' vous pouvez essayer:] – gonjay

18

Je vais laisser ça ici parce que je pense qu'il est utile:

task :my_task do 
    pid_file = '/tmp/my_task.pid' 
    raise 'pid file exists!' if File.exists? pid_file 
    File.open(pid_file, 'w'){|f| f.puts Process.pid} 
    begin 
     # execute code here 
    ensure 
     File.delete pid_file 
    end 
end 
+0

devrait essayer d'utiliser flock ... – Stephen

1

Tout ce que vous avez besoin est un petit bijou nommé pidfile.

Ajouter ceci à votre Gemfile:

gem 'pidfile', '>= 0.3.0' 

Et la tâche pourrait être:

desc "my task" 
task :my_task do |t| 
    PidFile.new(piddir: "/var/lock", pidfile: "#{t.name}.pid") 
    # do something 
end