Welche Operation erzeugt den Fehler "Textdatei beschäftigt"? Ich kann es nicht genau sagen.
Ich denke, es hängt damit zusammen, dass ich ein temporäres Python-Skript (mit tempfile) erstelle und daraus execl verwende, aber ich denke, dass execl die ausgeführte Datei ändert.
Text file busy
Fehler handelt es sich insbesondere um den Versuch, eine ausführbare Datei während der Ausführung zu ändern. Der "Text" bezieht sich hier auf die Tatsache, dass die zu ändernde Datei das Textsegment für ein laufendes Programm ist. Dies ist ein ganz besonderer Fall und nicht der generische, den Ihre Antwort zu suggerieren scheint. Trotzdem ist Ihre Antwort nicht ganz falsch.Es ist schon eine Weile her, dass ich diese Nachricht gesehen habe, aber sie war vor gut ein paar Jahrzehnten in System V R3 oder so weit verbreitet. Damals bedeutete dies, dass Sie eine ausführbare Programmdatei während der Ausführung nicht ändern konnten.
Zum Beispiel baute ich ein
make
Workalike namensrmk
, und nach einer Weile war es selbsterhaltend. Ich würde die Entwicklungsversion ausführen und eine neue Version erstellen lassen. Um es zum Laufen zu bringen, musste die Problemumgehung verwendet werden:Um Probleme mit der 'Textdatei beschäftigt' zu vermeiden, erstellte der Build eine neue Datei
rmk1
, verschob dann die altermk
inrmk2
(Umbenennen war kein Problem; Verknüpfung aufheben war) und verschob die neu erstelltermk1
inrmk
.Ich habe den Fehler auf einem modernen System schon eine ganze Weile nicht mehr gesehen ... aber ich habe nicht allzu oft Programme, die sich selbst neu erstellen.
quelle
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
. Auf meinem neuen Fedora wurde die Fehlermeldung "cp: Es kann keine reguläre Datei 'a.out': Textdatei beschäftigt" erstellt.unlink
standardmäßig zuerst geschieht .Quelle: http://wiki.wlug.org.nz/ETXTBSY
quelle
Beispiel für eine minimal ausführbare C POSIX-Reproduktion
Ich empfehle, die zugrunde liegende API zu verstehen, um besser sehen zu können, was los ist.
sleep.c
beschäftigt.c
Kompilieren und ausführen:
busy.out
Übergibt die Asserts undperror
gibt Folgendes aus:Daraus schließen wir, dass die Nachricht in glibc selbst fest codiert ist.
Alternative:
macht Bash-Ausgabe:
Für eine komplexere Anwendung können Sie sie auch beobachten mit
strace
:was beinhaltet:
Getestet unter Ubuntu 18.04, Linux Kernel 4.15.0.
Der Fehler tritt nicht auf, wenn Sie
unlink
zuerstnotbusy.c:
Dann kompilieren und analog zu den oben genannten ausführen, und diese Behauptungen bestehen.
Dies erklärt, warum es für bestimmte Programme funktioniert, für andere jedoch nicht. ZB wenn Sie tun:
Das erzeugt keinen Fehler, obwohl der zweite
gcc
Aufruf an schreibtsleep.out
.Eine
strace
kurze Darstellung zeigt, dass GCC vor dem Schreiben zuerst die Verknüpfung aufhebt:enthält:
Der Grund, warum dies nicht fehlschlägt, besteht darin, dass beim
unlink
erneuten Schreiben der Datei ein neuer Inode erstellt wird und ein temporärer baumelnder Inode für die ausgeführte ausführbare Datei beibehalten wird.Wenn Sie jedoch nur
write
ohne sindunlink
, wird versucht, in denselben geschützten Inode wie die laufende ausführbare Datei zu schreiben.POSIX 7
open()
http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html
Mann 2 offen
quelle
unlink
. Liest Linux die Datei nach dem erstenexec
Aufruf mehr als einmal ?In meinem Fall habe ich versucht, eine Shell-Datei (mit der Erweiterung .sh) in einer csh-Umgebung auszuführen, und diese Fehlermeldung wurde angezeigt.
Nur mit Bash zu laufen, hat bei mir funktioniert. Beispielsweise
quelle
#!/bin/bash
Header?#!/usr/bin/csh
oder gleichwertig versuchen .Wenn Sie versuchen,
phpredis
auf einer Linux-Box aufzubauen, müssen Sie ihr möglicherweise Zeit geben, um die Dateiberechtigungen mit einemsleep
Befehl zu ändern, bevor Sie die Datei ausführen:quelle
chmod
würde, bevor die Berechtigungen festgelegt wurden. Dies könnte ein Problem mit dem Dateisystem sein.Ich kenne die Ursache nicht, aber ich kann schnell und einfach Abhilfe schaffen.
Ich habe diese Seltsamkeit unter CentOS 6 gerade erlebt, nachdem "cat> shScript.sh" (Einfügen, ^ Z) und dann die Datei in KWrite bearbeitet wurden. Seltsamerweise war keine Instanz (ps -ef) des ausgeführten Skripts erkennbar.
Meine schnelle Lösung bestand einfach darin, "cp shScript.sh shScript2.sh" zu verwenden, dann konnte ich shScript2.sh ausführen. Dann habe ich beide gelöscht. Getan!
quelle
cat
haben. Verwenden Sie das nächste Mal ^ D, nicht ^ Z.Möglicherweise ist dies bei CIFS / SMB-Netzwerkfreigaben häufiger der Fall. Windows erlaubt nicht, dass eine Datei geschrieben wird, wenn diese Datei in einer anderen Datei geöffnet ist, und selbst wenn der Dienst nicht Windows ist (es kann sich um ein anderes NAS-Produkt handeln), wird wahrscheinlich dasselbe Verhalten reproduziert. Möglicherweise ist dies auch eine Manifestation eines zugrunde liegenden NAS-Problems, das vage mit dem Sperren / Replizieren zusammenhängt.
quelle
Wenn Sie die .sh-Datei über eine SSH-Verbindung mit einem Tool wie MobaXTerm ausführen und dieses Tool über ein Dienstprogramm zum automatischen Speichern zum Bearbeiten der Remote-Datei vom lokalen Computer verfügt, wird die Datei gesperrt.
Das Schließen und erneute Öffnen der SSH-Sitzung löst das Problem.
quelle
Eine meiner Erfahrungen:
Ich ändere immer die Standardtastenkürzel von Chrome durch Reverse Engineering. Nach der Änderung habe ich vergessen, Chrome zu schließen, und Folgendes ausgeführt:
Mit strace finden Sie weitere Details:
quelle
Ich bin in PHP darauf gestoßen, als ich
fopen()
eine Datei verwendet habe und es dann versucht habe,unlink()
bevor ich sie verwendetfclose()
habe.Nicht gut:
Gut:
quelle
quelle