Saya memiliki program yang menyimpan pengaturannya di ~/.config/myprogram
yang saya gunakan baik secara interaktif dan dengan sistem antrian batch. Saat berjalan secara interaktif, saya ingin program ini menggunakan file konfigurasi saya (dan memang demikian). Tetapi ketika menjalankan dalam mode batch, file konfigurasi tidak diperlukan karena saya menentukan opsi baris perintah yang menimpa semua pengaturan yang relevan. Selanjutnya, mengakses file konfigurasi melalui jaringan meningkatkan waktu startup program beberapa detik; jika file tidak ada, program diluncurkan lebih cepat (karena setiap pekerjaan hanya membutuhkan waktu sekitar satu menit, ini memiliki dampak signifikan pada throughput pekerjaan batch). Tetapi karena saya juga menggunakan program ini secara interaktif, saya tidak ingin memindahkan / menghapus file konfigurasi saya sepanjang waktu. Bergantung pada kapan pekerjaan batch saya dijadwalkan pada cluster (berdasarkan penggunaan pengguna lain),
(Selain itu: kinerja file jaringan sangat lambat mungkin adalah bug, tapi saya hanya pengguna cluster, jadi saya hanya bisa mengatasinya, tidak memperbaikinya.)
Saya bisa membuat versi program yang tidak membaca file konfigurasi (atau memiliki opsi baris perintah untuk tidak) untuk penggunaan batch, tetapi lingkungan build program ini tidak dirancang dengan baik dan sulit diatur. Saya lebih suka menggunakan binari yang diinstal melalui manajer paket sistem saya.
Bagaimana saya bisa mengelabui contoh tertentu dari program ini untuk berpura-pura file konfigurasi saya tidak ada (tanpa memodifikasi program)? Saya berharap untuk pembungkus formulir pretendfiledoesntexist ~/.config/myprogram -- myprogram --various-options...
, tetapi saya terbuka untuk solusi lain.
LD_PRELOAD
pengait. Itu lebih mudah (Anda dapat mengimplementasikannya dalam satu atau dua jam, jika Anda tahu C) daripada alternatifnya, yaituptrace
. Anda juga mungkin bisa menggunakan fakechroot untuk melakukan ini (saya yakin, itu adalah LD_PRELOAD).Jawaban:
Program itu mungkin menyelesaikan jalur dari file itu
$HOME/.config/myprogram
. Jadi Anda bisa tahu direktori home Anda ada di tempat lain, seperti:Sekarang, mungkin program Anda membutuhkan sumber daya lain di direktori home Anda. Jika Anda tahu yang mana, Anda dapat menyiapkan rumah palsu untuk program Anda dengan tautan ke sumber yang dibutuhkan di sana.
sumber
Jika semuanya gagal, tulis pustaka pembungkus yang akan Anda gunakan menggunakan injeksi
LD_PRELOAD
sehingga panggilan untukopen("/home/you/my-program/config.interactive")
dicegat tetapi yang lain akan melewati. Ini berfungsi untuk semua jenis program, bahkan skrip shell, karena akan menyaring panggilan sistem.Catatan: Saya belum menguji kode ini, dan saya tidak 100% yakin bahwa
errno
bagian itu berfungsi.Lihatlah bagaimana
fakeroot
rasanya untuk panggilangetuid(2)
danstat(2)
.Pada dasarnya, penghubung akan menautkan aplikasi itu ke perpustakaan Anda, yang mengabaikan
open
simbol. Karena Anda tidak dapat menggunakan dua fungsi berbeda yang disebutopen
di perpustakaan Anda sendiri, Anda harus memisahkannya di bagian kedua (misalnyaget_real_open
) yang pada gilirannya akan menghubungkan keopen
panggilan asli .Asli:
./Application
Dicegat:
LD_PRELOAD=yourlib_wrap.so ./Application
Sunting: Rupanya ada
ld
bendera yang dapat Anda aktifkan (--wrap <symbol>
) yang memungkinkan Anda menulis pembungkus tanpa harus menggunakan tautan ganda:sumber
Pindahkan file konfigurasi Anda, dan tulis pembungkus skrip shell untuk kasus penggunaan interaktif yang menyalin file ke tujuan normalnya, menjalankan program, dan menghapusnya saat keluar.
sumber
Ini harus dimungkinkan dengan unionfs / aufs. Anda menciptakan
chroot
lingkungan untuk proses tersebut. Anda menggunakan direktori nyata sebagai lapisan read-only dan meletakkan yang kosong di atasnya. Kemudian Anda memasang volume unionfs ke direktori masing-masing dichroot
lingkungan dan menghapus file di sana. Proses tidak akan melihatnya tetapi semua orang lain melakukannya.sumber
Ubah nama file config menjadi eg
config.interactive
. Buat file kosong lain bernama egconfig.script
.Sekarang, buat tautan lunak yang disebut
config
(atau apa pun yang diharapkan aplikasi sebagai file konfigurasi) ke konfigurasi mana pun yang Anda perlukan dan jalankan aplikasi Anda.Ingatlah untuk merapikan tautan Anda sesudahnya.
sumber
Jika Anda benar-benar menandai bagaimana program Anda menggunakan file konfigurasi, saya telah mengabaikannya. Banyak program (seperti
bash
danvi
) akan memeriksa file konfigurasi segera setelah mulai; jika file ada, baca dan tutup. Program-program ini tidak pernah mengakses file inisialisasi ini lagi. Jika program Anda seperti itu, baca terus.Saya tahu Anda telah menolak jawaban yang membuat file konfigurasi benar-benar tidak ada (dengan menamai ulangnya), tetapi saya memiliki kerutan yang belum pernah saya lihat diusulkan oleh orang lain. Lakukan ini ketika Anda menjalankan program dalam mode batch:
Ini memindahkan file konfigurasi keluar dari jalan, tetapi kemudian memindahkannya kembali satu detik kemudian, bahkan jika
myprogram
masih berjalan. Ini menciptakan jendela waktu yang sangat singkat di mana file tidak tersedia - berapakah probabilitas Anda akan menjalankan program secara interaktif selama jendela ini? (Bahkan jika Anda melakukannya, Anda dapat keluar dan memulai kembali, dan file konfigurasi mungkin akan kembali pada tempatnya.)Ini memang menciptakan kondisi balapan; jika program membutuhkan waktu terlalu lama untuk membuka file, itu mungkin mendapatkan file yang sebenarnya. Jika ini terjadi cukup sering sehingga menjadi masalah, cukup tambahkan nilai DELAY_TIME.
sumber
Saya suka jawaban Stephane, tetapi ini akan menipu program mana pun untuk meyakini bahwa file apa pun kosong - (karena dentry-nya sementara menunjuk ke file yang benar-benar kosong) :
Anda juga bisa:
Jika kamu mau.
sumber
mv
file - yang mungkin memiliki konsekuensi lain selain mempengaruhi dentry-nya seperti benar-benar memotong file atau yang lainnya dan lain-lain - padahal ini hanya beroperasi pada apa-apa selain. Namun, saya harusunshare
itumount
saya kira ...