GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie stelle ich sicher, dass jeweils nur eine Instanz eines Ruby-Skripts ausgeführt wird?

Ich weiß, das ist alt, aber für alle Interessierten gibt es eine nicht blockierende Konstante, die Sie an flock übergeben können, damit sie zurückkehrt, anstatt zu blockieren.

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

Update für slhck

flock wird true zurückgeben, wenn dies Der Prozess hat die Sperre erhalten, andernfalls false. Um sicherzustellen, dass jeweils nur ein Prozess ausgeführt wird, möchten Sie nur versuchen, die Sperre zu erhalten, und beenden, wenn dies nicht möglich ist. Es ist so einfach wie das Setzen einer exit unless vor der Codezeile habe ich oben:

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

Obwohl dies Ihre Frage nicht direkt beantwortet, würde ich an Ihrer Stelle wahrscheinlich ein Daemon-Skript schreiben (Sie könnten http://daemons.rubyforge.org/ verwenden)

Sie könnten Ihren Indexer (unter der Annahme seiner indexer.rb) durch ein Wrapper-Skript namens script/index laufen lassen, zum Beispiel:

require 'rubygems'
require 'daemons'

Daemons.run('indexer.rb')

Und Ihr Indexer kann fast dasselbe tun, außer dass Sie ein Ruheintervall angeben

loop do
   # code executing your indexing 

   sleep INDEXING_INTERVAL
end

So funktionieren normalerweise Job-Prozessoren zusammen mit einem Queue-Server.


Sie könnten eine temporäre Datei erstellen und löschen und prüfen, ob diese Datei existiert. Bitte überprüfen Sie die Antwort auf diese Frage:ein Instanz-Shell-Skript


Abhängig von Ihren Anforderungen sollte dies problemlos funktionieren und es muss nirgendwo eine weitere Datei erstellt werden.

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. Vier Aufgaben parallel… Wie geht das?

  2. Wie verschiebt man eine Zeile in einer Textdatei um eine Zeile nach oben oder unten?

  3. Wie kann man Bash-Skripte in Vim hervorheben?

  4. Nur verschieben, wenn die Datei in einem Shell-Skript vorhanden ist

  5. Beschränken Sie ein GUI-Programm in Linux auf nur eine Instanz

Linux – Wie finde ich das Erstellungsdatum der Datei?

Wie erstelle ich eine temporäre Datei im Shell-Skript?

Wie kann man sicherstellen, dass nur eine Instanz eines Bash-Skripts ausgeführt wird?

Jedes Mal, wenn ein neuer Kernel installiert wird, ein Skript ausführen?

Skript führt Schleife nur einmal aus?

Wie überprüfe ich die Syntax eines Bash-Skripts, ohne es auszuführen?