Quelle opération génère l'erreur "fichier texte occupé"? Je suis incapable de dire exactement.
Je pense que cela est lié au fait que je crée un script python temporaire (en utilisant tempfile) et en utilise execl, mais je pense que execl change le fichier en cours d'exécution.
Text file busy
erreur spécifique consiste à essayer de modifier un exécutable pendant son exécution. Le "Texte" fait ici référence au fait que le fichier en cours de modification est le segment de texte d'un programme en cours d'exécution. Il s'agit d'un cas très particulier, et non du cas générique que semble suggérer votre réponse. Même ainsi, votre réponse n'est pas entièrement incorrecte.Cela fait un moment que je n'ai pas vu ce message, mais il était répandu dans System V R3 ou à peu près il y a une bonne vingtaine d'années. À l'époque, cela signifiait que vous ne pouviez pas modifier un exécutable de programme pendant son exécution.
Par exemple, je construisais un
make
workalike appelérmk
, et après un certain temps, il s'est auto-entretenu. Je lancerais la version de développement et lui ferais construire une nouvelle version. Pour le faire fonctionner, il était nécessaire d'utiliser la solution de contournement:Ainsi, pour éviter les problèmes avec le 'fichier texte occupé', la construction a créé un nouveau fichier
rmk1
, puis déplacé l'ancienrmk
versrmk2
(renommer n'était pas un problème; dissocier l'était), puis déplacé le nouveau fichierrmk1
versrmk
.Je n'ai pas vu l'erreur sur un système moderne depuis un bon moment ... mais je n'ai pas souvent des programmes qui se reconstruisent.
la source
echo -e '#include <unistd.h>\nint main(void){sleep (5);return 0;}' > slowprog.c && cc slowprog.c && cp a.out b.out && (./a.out &) ; sleep 1 && cp b.out a.out
. Produit le message d'erreur "cp: impossible de créer le fichier régulier 'a.out': Fichier texte occupé" sur mon nouveau Fedora.unlink
par défaut.Source: http://wiki.wlug.org.nz/ETXTBSY
la source
Exemple de reproduction minimale C POSIX exécutable
Je recommande de comprendre l'API sous-jacente pour mieux voir ce qui se passe.
sommeil.c
occupé.c
Compilez et exécutez:
busy.out
transmet les assertions et lesperror
sorties:nous en déduisons donc que le message est codé en dur dans la glibc elle-même.
Alternativement:
rend la sortie Bash:
Pour une application plus complexe, vous pouvez également l'observer avec
strace
:qui contient:
Testé sur Ubuntu 18.04, noyau Linux 4.15.0.
L'erreur ne se produit pas si vous d'
unlink
abordnotbusy.c:
Ensuite, compilez et exécutez de manière analogue à ce qui précède, et ces affirmations sont acceptées.
Cela explique pourquoi cela fonctionne pour certains programmes mais pas pour d'autres. Par exemple, si vous faites:
cela ne génère pas d'erreur, même si le deuxième
gcc
appel est en cours d'écrituresleep.out
.Un rapide
strace
montre que GCC dissocie d'abord avant d'écrire:contient:
La raison pour laquelle il n'échoue pas est que lorsque vous
unlink
réécrivez le fichier, il crée un nouvel inode et conserve un inode suspendu temporaire pour le fichier exécutable en cours d'exécution.Mais si vous ne le faites
write
pasunlink
, alors il essaie d'écrire dans le même inode protégé que l'exécutable en cours d'exécution.POSIX 7
open()
http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html
homme 2 ouvert
la source
unlink
. Linux a-t-il déjà lu le fichier plus d'une fois après le premierexec
appel?Dans mon cas, j'essayais d'exécuter un fichier shell (avec une extension .sh) dans un environnement csh, et je recevais ce message d'erreur.
courir avec bash ça a marché pour moi. Par exemple
la source
#!/bin/bash
tête?#!/usr/bin/csh
ou équivalent.Si vous essayez de construire
phpredis
sur une machine Linux, vous devrez peut-être lui laisser le temps de terminer la modification des autorisations de fichier, avec unesleep
commande, avant d'exécuter le fichier:la source
chmod
je reviendrais avant que les autorisations ne soient définies. Cela pourrait être un problème de système de fichiers.Je ne connais pas la cause mais je peux contribuer à un travail rapide et facile.
Je viens de faire l'expérience de cette bizarrerie sur CentOS 6 après "cat> shScript.sh" (coller, ^ Z) puis en éditant le fichier dans KWrite. Curieusement, il n'y avait aucune instance discernable (ps -ef) du script en cours d'exécution.
Mon travail rapide était simplement de "cp shScript.sh shScript2.sh" puis j'ai pu exécuter shScript2.sh. Ensuite, j'ai supprimé les deux. Terminé!
la source
cat
processus. La prochaine fois, utilisez ^ D, pas ^ Z.Cela peut être plus courant sur les partages réseau CIFS / SMB. Windows ne permet pas d'écrire un fichier lorsqu'un autre fichier est ouvert, et même si le service n'est pas Windows (il peut s'agir d'un autre produit NAS), il reproduira probablement le même comportement. Potentiellement, cela pourrait également être une manifestation d'un problème NAS sous-jacent vaguement lié au verrouillage / réplication.
la source
Si vous exécutez le .sh à partir d'une connexion ssh avec un outil comme MobaXTerm, et si ledit outil a un utilitaire d'enregistrement automatique pour éditer le fichier distant à partir de la machine locale, cela verrouille le fichier.
La fermeture et la réouverture de la session SSH le résout.
la source
Une de mes expériences:
Je modifie toujours le raccourci clavier par défaut de Chrome via l'ingénierie inverse. Après modification, j'ai oublié de fermer Chrome et j'ai exécuté ce qui suit:
En utilisant strace, vous pouvez trouver plus de détails:
la source
Je suis tombé sur cela en PHP lors de l'utilisation
fopen()
sur un fichier, puis en essayantunlink()
avant de l'utiliserfclose()
.Pas bien:
Bien:
la source
la source