Prima di esplorare le tecniche/approcci per bloccare un file di testo in un ambiente del sistema operativo Linux, dovremmo prima comprendere la logica alla base del meccanismo di blocco dei file di Linux.
Il meccanismo di blocco dei file di Linux limita/controlla l'accesso ai file tra più processi. Quando un file di testo viene bloccato correttamente, solo un processo può accedervi in base a una pianificazione temporale specifica.
Prima di procedere con questo articolo, tieni presente che il blocco dei file è molto diverso dalla crittografia dei file o dal controllo dell'accesso ai file in cui è necessaria una passphrase o una password per controllare l'accesso degli utenti ai tuoi file.
Quando un file è bloccato in un ambiente del sistema operativo Linux, viene creato un evento di mutua esclusione a cui solo un singolo processo può accedervi alla volta.
Dichiarazione del problema
Il sistema operativo Linux bloccherà automaticamente qualsiasi tentativo di azione di scrittura diretto a un file aperto su cui viene scritto da un altro processo. Tuttavia, cosa succede se si desidera revocare i permessi di lettura e/o scrittura già invocati dal primo processo che ha il file aperto e in modalità di scrittura? C'è una soluzione a questo problema?
Inoltre, potremmo anche voler bloccare il nostro file in modo che nessun altro processo interferisca o tenti di interrompere lo stato della modalità di scrittura già avviato. Questo articolo ci guiderà attraverso una soluzione praticabile per bloccare un file di testo in Linux.
File di riferimento di esempio
Affinché questo tutorial sia più coinvolgente e utile, dovremmo avere alcuni file di testo di riferimento. Ci concentreremo sui file di testo all'interno della seguente directory:
Ad esempio, apriamo il file output.txt e inizia a scriverci sopra.
$ sudo nano output.txt
Mentre questo file è ancora aperto, proviamo ad aprirlo da un'altra scheda della riga di comando.
$ sudo nano output.txt
Riceverai la seguente risposta:
L'acquisizione dello schermo precedente trasmette il PID (133110 ) del processo di lavoro sul file di testo con la possibilità di aprire il file mentre è ancora in modalità di scrittura di quel processo.
Digitando Y
dalla nostra tastiera, avremo aperto questo file di testo e lo avremo consegnato a un processo diverso con accesso esclusivo alla modalità di scrittura.
Pertanto, una modifica del file da parte dell'utente 1 porterà alla seguente richiesta sull'utente 2 durante il tentativo di salvare il file.
Questa istanza è una rappresentazione perfetta di due diversi utenti sulla rete che lavorano su un singolo file.
Blocca un file di testo usando l'utility flock di Linux
Per risolvere questo problema, abbiamo bisogno dell'aiuto del gregge di Linux utilità. Dal momento che util-linux il pacchetto ospita gregge comando, dovrebbe essere disponibile in quasi tutte le distribuzioni del sistema operativo Linux. Questo comando gestisce specifici blocchi di file/directory tramite l'ambiente della riga di comando di Linux.
Per bloccare un file di testo in Linux, faremo riferimento alla seguente sintassi:
$ flock -x PATH_TO_FILE_TO_LOCK -c COMMAND
Il -x
l'opzione è per ottenere un blocco di scrittura sul file di destinazione. Proviamo a bloccare l'esempio output.txt file di testo. Il -c
l'opzione ci consentirà di passare un singolo comando supportato da Linux, ad es. comando cat .
$ flock -x /home/dnyce/LinuxShellTips_Files/output.txt -c cat
L'istanza del terminale sopra rimarrà attiva per indicare che il file di testo è stato bloccato.
Se apriamo un altro terminale (mentre questa istanza di terminale è ancora in esecuzione) ed eseguiamo un altro flock comando su questo stesso file, ci dovrebbe essere negato l'accesso.
$ flock -w .007 /home/dnyce/LinuxShellTips_Files/output.txt -c echo; /bin/echo $? 1
Il -w
l'opzione viene utilizzata per trasmettere il tempo di attesa di .007 secondi prima che venga posizionato un blocco sul file di testo. Quindi eseguiamo echo $?
per emettere lo stato di uscita di questo comando.
Uno stato di uscita di 0 implica che il comando è stato eseguito correttamente e uno stato di uscita di 1 implica che il comando non può essere eseguito a causa di un errore. In questo caso, il file di testo è bloccato da un altro processo.
Per confermare ulteriormente che il file di testo è bloccato, possiamo utilizzare lslocks comandi per elencare tutti i blocchi di sistema locali attivi.
$ lslocks
Come puoi vedere, il nostro file è presente.
Sbloccare un file di testo in Linux
Annullamento del gregge iniziale comando (Ctrl+c)
oppure la chiusura del file di testo dovrebbe rilasciare il blocco consentendo di eseguire correttamente il seguente comando sul terminale secondario.
$ flock -w .007 /home/dnyce/LinuxShellTips_Files/output.txt -c echo; /bin/echo $?
Lo stato di uscita di 0 implica che il blocco non è più applicabile al file di testo.
Abbiamo imparato come bloccare un file di testo in Linux in modo che solo un processo possa usarlo (modalità di scrittura) alla volta. L'implementazione di questo articolo è particolarmente utile quando diversi utenti su una rete accedono a un singolo file.
Altro su gregge comando può essere trovato nella sua pagina man.
$ man flock