2012-05-17 2 views
9

Ich habe diese Nachricht - "Textdatei beschäftigt", wenn ich versuche, eine Perl-Datei auszuführen, während diese Datei derzeit von anderen Prozessen verwendet wird.Kann "Textdatei beschäftigt" passieren, wenn zwei Prozesse versuchen, eine Perl-Datei gleichzeitig auszuführen?

Nach diesem /usr/bin/perl: bad interpreter: Text file busy Dieses Problem tritt auf, wenn die Perl-Datei zum Schreiben geöffnet ist, wenn ich versuche, ihn auszuführen.

Die Berechtigung der Datei ist jedoch -r-xr-xr-x. Es bietet keine Schreibberechtigungen.

Kann „Textdatei besetzt“ passieren, wenn zwei Prozesse eine Perl-Datei in der gleichen Zeit auszuführen versuchen?

+0

(dies ist wohl eher eine Systemadministration Frage - es hängt von O -spezifische Semantik und ist in keiner Weise spezifisch für Perl, oder sogar für interpretierte Sprachen - so in der Zukunft könnte Server Fault der geeignetere Veranstaltungsort sein) –

+0

tag perl gelöscht – joewhitedelux

Antwort

10

Nein, das wird nicht einfach passieren, weil zwei Perl-Skripte zur gleichen Zeit ausgeführt werden.

Die wahrscheinlichere Erklärung ist, dass das Skript selbst zum Schreiben geöffnet ist, während das Betriebssystem versucht, seine Shebang-Zeile zu lesen, die Interpreter zu bestimmen, zu verwenden.

Dies kann auch passieren, wenn ein externer Prozess das Perl-Interpreter selbst oder einen der gemeinsamen genutzten Bibliotheken zu aktualisieren oder zu ändern versucht, davon abhängt. Beachten Sie, dass Dateiberechtigungen normalerweise nicht für Superuser-Accounts wie root gelten. Daher kann jeder Prozess, der als Superuser ausgeführt wird, dennoch versuchen, den Perl-Interpreter zu ändern, obwohl keine +w Bits gesetzt sind.

(Das heißt, die meisten gutartigen Betriebssystem-Upgrade-Tools auf POSIX-style Betriebssystemen schreiben die aktualisierte Version einer Binärdatei in eine neue Datei auf dem gleichen Dateisystem, schließen Sie diese Datei, wenn Sie fertig sind, und benennen Sie sie über die Original (eine atomare Operation) - so dass der Inode, der an /usr/bin/perl angeschlossen ist, selbst nie zum Schreiben geöffnet ist. Daher ist der Fehler, den Sie sehen, auf einem gut erzogenen System nicht etwas, was in der Praxis jemals auftauchen sollte. .

Sie können den fuser Befehl, um zu sehen, der eine Datei geöffnet hat, entweder für das Skript oder für seine Dolmetscher:

$ sudo fuser /usr/bin/perl -uv 
        USER  PID ACCESS COMMAND 
/usr/bin/perl:  root  16579 f.... (root)python 
+0

Danke für Ihre Expansion, Charles. Diese Perl-Datei wird von root in einer Clearcase-Ansicht ausgeführt. Nach dem Lesen Ihres Beitrags, denke ich, die Clearcase-Ansicht verursacht dieses Problem, die tatsächliche Perl-Datei Dosis nicht bieten Schreibberechtigungen, aber die Datei in Clearcase-Ansicht bietet möglicherweise. – joewhitedelux

2

But the file's permission is -r-xr-xr-x. It does not provide permissions to write.

Die Erlaubnis eingestellt werden kann, nachdem Sie das Skript zum Schreiben öffnen, aber bevor das Skript ausgeführt wird.

Hier ist Codebeispiel, das ein neues Perl-Skript your-script in das aktuelle Verzeichnis schreibt, macht es ausführbar beim Entfernen der Schreibberechtigungen und versucht, das Perl-Skript auszuführen. Die endgültigen Berechtigungen sind -r-xr-xr-x aber die Datei noch zum Schreiben geöffnet, das ist, warum das Skript „Textdatei besetzt“ Fehler generiert:

#!/usr/bin/env python3 
import os 
import stat 
import subprocess 

file = open('./your-script', 'w') # specify full path 
try: 
    file.write("#!/usr/bin/perl\nprint 'unreachable';") 
    file.flush() # make sure the content is sent to OS 
    os.chmod(file.name, 0o555) # make executable 
    print(stat.filemode(os.stat(file.name).st_mode)) # -r-xr-xr-x 
    subprocess.call(file.name) # run it 
except Exception as e: 
    print(e) 
finally: 
    os.remove(file.name) 
Verwandte Themen