Operasi apa yang menghasilkan kesalahan "file teks sibuk"? Saya tidak bisa mengatakan dengan tepat.
Saya pikir ini terkait dengan fakta bahwa saya membuat skrip python sementara (menggunakan tempfile) dan menggunakan execl dari itu, tapi saya pikir execl mengubah file yang sedang dijalankan.
Text file busy
kesalahan dalam spesifik tentang mencoba untuk memodifikasi executable ketika sedang mengeksekusi. "Teks" di sini merujuk pada fakta bahwa file yang sedang dimodifikasi adalah segmen teks untuk program yang sedang berjalan. Ini adalah kasus yang sangat istimewa, dan bukan yang umum yang tampaknya disarankan oleh jawaban Anda. Meski begitu, jawaban Anda tidak sepenuhnya salah.Sudah lama sejak saya melihat pesan itu, tetapi dulu lazim di System V R3 atau sekitar beberapa dekade yang lalu. Saat itu, itu berarti Anda tidak dapat mengubah program yang dapat dieksekusi saat sedang berjalan.
Sebagai contoh, saya sedang membangun sebuah
make
workalike yang disebutrmk
, dan setelah beberapa saat itu swalayan. Saya akan menjalankan versi pengembangan dan membuatnya membangun versi baru. Untuk membuatnya bekerja, perlu untuk menggunakan solusi:Jadi, untuk menghindari masalah dengan 'file teks sibuk', build membuat file baru
rmk1
, lalu memindahkan yang lamarmk
kermk2
(mengganti nama bukan masalah; membatalkan tautan dulu), lalu memindahkan yang baru dibangunrmk1
kermk
.Saya belum melihat kesalahan pada sistem modern dalam waktu yang cukup lama ... tapi saya tidak semua yang sering memiliki program membangun kembali diri mereka sendiri.
sumber
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
. Menghasilkan pesan kesalahan "cp: tidak dapat membuat file biasa 'a.out': File teks sibuk" di Fedora saya yang baru.unlink
default.Sumber: http://wiki.wlug.org.nz/ETXTBSY
sumber
Contoh reproduksi C POSIX runnable minimal
Saya merekomendasikan untuk memahami API yang mendasarinya untuk melihat dengan lebih baik apa yang sedang terjadi.
sleep.c
busy.c
Kompilasi dan jalankan:
busy.out
melewati pernyataan, danperror
keluaran:jadi kami menyimpulkan bahwa pesan tersebut di-hardcode dalam glibc itu sendiri.
Kalau tidak:
membuat output Bash:
Untuk aplikasi yang lebih kompleks, Anda juga dapat mengamatinya dengan
strace
:yang mengandung:
Diuji pada Ubuntu 18.04, kernel Linux 4.15.0.
Kesalahan tidak terjadi jika Anda
unlink
terlebih dahulunotbusy.c:
Kemudian kompilasi dan jalankan secara analog dengan yang di atas, dan mereka menegaskan lulus.
Ini menjelaskan mengapa ini bekerja untuk program tertentu tetapi tidak untuk yang lain. Misal jika Anda melakukannya:
itu tidak menghasilkan kesalahan, meskipun
gcc
panggilan kedua menulissleep.out
.Quick
strace
menunjukkan bahwa GCC memutuskan tautan terlebih dahulu sebelum menulis:mengandung:
Alasannya tidak gagal adalah bahwa ketika Anda
unlink
dan menulis ulang file, itu menciptakan inode baru, dan membuat inode menggantung sementara untuk menjalankan file yang dapat dieksekusi.Tetapi jika Anda hanya
write
tanpaunlink
, maka itu mencoba untuk menulis ke inode yang dilindungi yang sama dengan menjalankan executable.POSIX 7
open()
http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html
man 2 terbuka
sumber
unlink
. Apakah Linux pernah membaca file lebih dari sekali setelahexec
panggilan pertama ?Dalam kasus saya, saya mencoba mengeksekusi file shell (dengan ekstensi .sh) di lingkungan csh, dan saya mendapatkan pesan kesalahan itu.
hanya berlari dengan bash itu berhasil bagiku. Sebagai contoh
sumber
#!/bin/bash
tajuk?#!/usr/bin/csh
atau setara.Jika mencoba membangun
phpredis
di kotak Linux Anda mungkin perlu memberi waktu untuk menyelesaikan memodifikasi izin file, dengansleep
perintah, sebelum menjalankan file:sumber
chmod
akan kembali sebelum izin ditetapkan. Itu mungkin masalah sistem file.Tidak tahu penyebabnya, tetapi saya dapat berkontribusi untuk penyelesaian yang cepat dan mudah.
Saya baru saja mengalami keanehan ini pada CentOS 6 setelah "cat> shScript.sh" (paste, ^ Z) kemudian mengedit file dalam KWrite. Anehnya tidak ada instance yang dapat dilihat (ps -ef) dari eksekusi skrip.
Pekerjaan cepat saya di sekitar adalah hanya untuk "cp shScript.sh shScript2.sh" maka saya dapat menjalankan shScript2.sh. Lalu saya menghapus keduanya. Selesai!
sumber
cat
proses. Lain kali gunakan ^ D, bukan ^ Z.Anda mungkin menemukan ini lebih umum di CIFS / jaringan SMB. Windows tidak mengizinkan file untuk ditulis ketika ada sesuatu yang membuka file itu, dan bahkan jika layanan ini bukan Windows (mungkin beberapa produk NAS lainnya), kemungkinan akan mereproduksi perilaku yang sama. Secara potensial, ini mungkin juga merupakan manifestasi dari beberapa masalah NAS mendasar yang secara samar terkait dengan penguncian / replikasi.
sumber
Jika Anda menjalankan .sh dari koneksi ssh dengan alat seperti MobaXTerm, dan jika alat tersebut memiliki utilitas autosave untuk mengedit file jarak jauh dari mesin lokal, itu akan mengunci file.
Menutup dan membuka kembali sesi SSH menyelesaikannya.
sumber
Salah satu pengalaman saya:
Saya selalu mengubah pintasan keyboard default Chrome melalui reverse engineering. Setelah modifikasi, saya lupa menutup Chrome dan menjalankan yang berikut:
Menggunakan strace, Anda dapat menemukan detail lebih lanjut:
sumber
Saya menemukan ini di PHP ketika menggunakan
fopen()
pada file dan kemudian mencobaunlink()
sebelum menggunakannyafclose()
.Tidak baik:
Baik:
sumber
sumber