C’était bien mon objectif, mais je préfère tester avant.
Voici l’idée :
[code]#!/bin.bash
#SBATCH options
[un peu de code]
(
flock -x 200
sed -i “/$jobid:running/c\:w
$jobid:completed” output.file
) 200>/var/lock/mylockfile[/code]
(Voir man flock pour plus de détails.)
Je suis en cours de test de cette machine. Je reviens plus tard pour corriger les erreurs que j’ai certainement faites.
EDIT : Effectivement, il restait des erreurs. Le descripteur de fichier n°200 semble ne pas être disponible. J’ai donc suivi les instructions du manuel de flock, et j’utilise le descripteur n°9. (Pas sûr de cette explication. Si quelqu’un est plus compétent que moi dans ce domaine et lit ça, qu’il me corrige.)
/var/lock est en permissions 775 sur certains systèmes. J’ai donc déplacé le fichier de lock à /tmp
Voici le nouveau script :
[code]#!/bin/sh
(
flock -x 9
sleep 120
) 9>/tmp/mylock.lock[/code]
Une petite explication du fonctionnement (il est encore possible que je fasse des erreurs) :
La partie entre parenthèses s’exécute dans un sub-shell. En créant le sub-shell, le shell parent ouvre un descripteur de fichier (n°9, donc), et le rattache au sub-shell. Ce descripteur 9 redirige vers le fichier /tmp/mylock.lock. Ce fichier est créé s’il n’existe pas, d’où la nécessité d’avoir les droits d’écriture dans le dossier. Il y a moyen aussi de n’utiliser que les droits de lecture via un 9</tmp/mylock.lock, mais le fichier doit déjà existé auparavant.
Dans le sub-shell, flock verrouille l’accès exclusif en écriture au descripteur de fichier 9. Si le verrouillage n’est pas disponible, flock attend. (Possibilité de régler un timeout). Une fois l’accès verrouillé, on passe à la suite. Remplacer sleep 120 par des choses intéressantes.
Une fois la dernière commande du sub-shell terminée, le descripteur 9 est fermé, et son accès exclusif révoqué. Un autre process peut maintenant demander le verrouillage de ce fichier.
Ce système est assez tricky, mais tellement joli !
EDIT 2 : Pour avoir un fonctionnement propre façon lock file, il ne faut pas oublier de supprimer le fichier une fois qu’il n’est plus utilisé. Un simple rm en-dehors du sub-shell suffit. Si le fichier est nécessaire pour un autre processus, il sera re-créer. Si un autre processus a déjà ouvert un accès exclusif, rm échouera.
EDIT 3 : Pour avoir un accès exclusif à un fichier comme dans mon cas présenté tout en haut, inutile de passer par un fichier .lock. Il suffit de verrouiller l’accès à ce fichier de résultats communs :
[code]#!/bin.bash
#SBATCH options
[un peu de code]
(
flock -x 9
sed -i “/$jobid:running/c\$jobid:completed” <&9
) 9<>output.file[/code]
Raah, c’est bô !
EDIT 4 : Bon, en fait, çá marche presque. Avec sed -e, le résultat est parfait. Par contre, si on souhaite de la modification sur place (option -i de sed), on récupère une erreur :
Bizarrement, j’aurais plutôt pensé qu’il manquait un output file, du coup j’ai tenté :
$ cat file
foo
$ ( sed -i "s/foo/bar/" <>&9) 9<> file
bash: syntax error near unexpected token `&'
$ ( sed -i "s/foo/bar/" <&9 >&9) 9<> file
sed: no input files
Je ne sais pas trop comment faire, là. Mais on sort du sujet, là. C’est du descripteur de fichier, plus des sémaphores.