Bonjour,
Je n'ai pas trop utilisé jRuby. Mais si ça fonctionne comme Ruby, tu devrais pouvoir écrire des choses comme :
cat toto.log | ruby -ne 'print if /toto/'
=> Imprime toute les lignes de toto.log qui contiennent la chaine "toto" quelque part. Le "-e" permet d'executer du Ruby en ligne de commande. Le "-n" fait la même chose qu'un "while do end" pour chaque ligne du fichier.
Pour bloquer l'accès (sous UNIX), la méthode simple :
1 2 3 4 5 6
|
File.open("mon_fichier", "w") do |f|
f.flock(File::LOCK_EX)
f.puts "Ecriture dans un fichier verrouillé"
f.flock(File::LOCK_UN)
end |
Pb : Si un processus verrouille le fichier quand tu essayes d'obtenir toi même un verrou, ton script va attendre.
Autre méthode qui gère ce problème (le secret réside dans le FILE::LOCK_NB):
1 2 3 4 5 6 7 8
|
File.open("mon_fichier", "w") do |f|
if f.flock(File::LOCK_EX | File::LOCK_NB)
f.puts "Ecriture dans fichier verrouillé"
f.flock(File::LOCK_UN)
else warn "Le verrou n'a pu être obtenu sur le fichier"
end
end |
Enfin, troisième méthode si tu utilises souvent ce principe d'ouverture : Réouvrir la classe "File" et y créer ta propre méthode "open_locked" au sein d'un block begin...end
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
class File
def File.open_locked(*args)
File.open(args) do |f|
begin
f.flock(File::LOCK_EX)
result = yield f
ensure
f.flock(File::LOCK_UN)
return result
end
end
end
end |
Evite d'écraser la méthode "open" d'origine... Ca pourrait créer des effets de bord ailleurs.
Côme
Partager