2012-05-17 9 views
9

Ho ricevuto questo messaggio - "File di testo occupato" quando provo a eseguire un file Perl mentre questo file è attualmente utilizzato da un altro processo.Il "file di testo occupato" può verificarsi quando due processi cercano di eseguire un file perl nello stesso tempo?

In base a questo /usr/bin/perl: bad interpreter: Text file busy, questo problema si verifica quando il file perl è aperto per la scrittura quando si tenta di eseguirlo.

Ma il permesso del file è -r-xr-xr-x. Non fornisce permessi per scrivere.

È possibile che "File di testo occupato" si verifichi quando due processi tentano di eseguire un file Perl nello stesso momento?

+0

(questo è probabilmente più di una domanda di amministrazione di sistema - dipende OS semantica specifica e non è in alcun modo specifica per Perl, o anche per lingue interpretate - quindi in futuro, Server Fault potrebbe essere la sede più appropriata) –

+0

tag perl cancellato – joewhitedelux

risposta

10

No, questo non succederà semplicemente perché due script Perl sono in esecuzione allo stesso tempo.

La spiegazione più probabile è che lo script stesso sia aperto per la scrittura mentre il sistema operativo sta tentando di leggere la sua riga shebang per determinare l'interprete da utilizzare.

Questo può verificarsi anche se un processo esterno sta tentando di aggiornare o modificare l'interprete Perl stesso o una delle librerie condivise da cui dipende. Nota che i permessi dei file generalmente non si applicano agli account di superutente, come root, quindi qualsiasi processo eseguito come superutente può ancora tentare di modificare l'interprete Perl nonostante non ci sia alcun bit +w impostato.

(Ciò detto, gli strumenti di aggiornamento del sistema operativo più ben educati su sistemi operativi in ​​stile POSIX scriveranno la versione aggiornata di un binario in un nuovo file sullo stesso file system, chiuderà il file una volta terminato e lo rinominerà nel originale (un'operazione atomica) - tale che l'inode collegato a /usr/bin/perl non è mai esso stesso aperto per la scrittura. Pertanto, in un sistema ben funzionante, l'errore che si sta verificando non è qualcosa che dovrebbe mai verificarsi nella pratica) .

È possibile utilizzare il comando fuser per vedere chi ha un file aperto, sia per lo script o per il suo interprete:

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

Grazie per la tua espansione, Charles. Questo file perl viene eseguito da root in una vista clearcase. Dopo aver letto il tuo post, suppongo che la vista clearcase causi questo problema, la dose effettiva del file perl non fornisca permessi di scrittura, ma il file nella vista clearcase potrebbe fornire. – joewhitedelux

2

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

Il permesso può essere impostata dopo aver aperto lo script per la scrittura, ma prima che lo script venga eseguito.

Ecco un esempio di codice che scrive un nuovo script perl your-script nella directory corrente, lo rende eseguibile durante la rimozione delle autorizzazioni di scrittura e tenta di eseguire lo script perl. I permessi finali sono -r-xr-xr-x ma il file è ancora aperto per la scrittura che è il motivo per cui lo script genera "File di testo occupato" errore:

#!/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) 
Problemi correlati