Si j'ai une commande
$ ./script >> file.log
qui est appelé deux fois, le deuxième appel ayant lieu avant la fin du premier, que se passe-t-il?
Le premier appel obtient-il un verrou exclusif sur le fichier de sortie? Si tel est le cas, le deuxième script échoue-t-il lors de la tentative d'écriture ou le shell accepte-t-il la sortie (permettant au script de se terminer) et renvoie-t-il une erreur?
Ou le fichier journal est-il écrit deux fois?
Réponses:
Puisque vous utilisez
>>
, ce qui signifie ajouter, chaque ligne de sortie de chaque instance sera ajoutée dans l'ordre où elle s'est produite.Si vos impressions de sortie de script
1\n
par5\n
un délai d' une seconde entre chaque et deux par exemple est démarré 2,5 secondes plus tard , vous obtiendrez ceci:Donc, pour répondre à votre question: Non.
la source
Les systèmes Unix évitent généralement les verrous obligatoires. Il y a quelques cas où le noyau verrouille un fichier contre les modifications des programmes utilisateur, mais pas s'il est simplement écrit par un autre programme. Aucun système Unix ne verrouillera un fichier car un programme y écrit.
Si vous voulez que les instances simultanées de votre script ne marchent pas les unes sur les autres, vous devez utiliser un mécanisme de verrouillage explicite tel que .
flock
lockfile
Lorsque vous ouvrez un fichier à ajouter, ce qui est le
>>
cas, chaque programme est garanti de toujours écrire à la fin du fichier. Ainsi, la sortie des instances multiples ne se remplacera jamais et si elles écrivent à tour de rôle, leur sortie sera dans le même ordre que les écritures.La mauvaise chose qui pourrait arriver, c'est si l'une des instances écrit plusieurs morceaux de sortie et s'attend à ce qu'ils sortent ensemble. Entre les écritures consécutives d'une instance, d'autres instances peuvent effectuer leurs propres écritures. Par exemple, si l'instance 1 écrit
foo
, puis l'instance 2 écrithello
et seulement alors l'instance 2 écritbar
, le fichier contientfoohellobar
.Un processus écrit efficacement dans le fichier lorsqu'il appelle l'
write
appel système. Un appel àwrite
est atomique: chaque appel àwrite
écrit une séquence d'octets qui ne sera pas interrompue par d'autres programmes. Il y a souvent une limite à la quantité de données qu'un seul appelwrite
va écrire efficacement: pour les tailles plus grandes, seul le début des données est écrit et l'application doit rappelerwrite
. En outre, de nombreux programmes effectuent la mise en mémoire tampon: ils accumulent des données dans une zone mémoire, puis écrivent ces données en un seul morceau. Certains programmes vident le tampon de sortie après une ligne complète ou une autre séparation significative. Avec de tels programmes, vous pouvez vous attendre à ce que des lignes entières soient ininterrompues, tant qu'elles ne sont pas trop longues (jusqu'à quelques kilo-octets; cela dépend du système d'exploitation). Si le programme ne vide pas à des endroits significatifs, mais uniquement en fonction de la taille du tampon, vous pouvez voir quelque chose comme 4 Ko d'une instance, puis 4 Ko d'une autre instance, puis à nouveau 4 Ko de la première instance, etc.la source