Di linux, apa yang akan terjadi pada program yang sedang berjalan ketika file yang dapat dieksekusi telah dimodifikasi atau dihapus?


12

Katakanlah /usr/local/bin/rubysedang berjalan di latar belakang, dan kemudian kita menimpa rubydengan versi yang berbeda, atau bahkan menghapus ruby.

Apa yang akan terjadi pada mereka yang menjalankan proses ruby?

Jawaban:


10

Itu tergantung pada bagaimana eksekusi dieksekusi. Jika file yang sama dibuka dan bagian-bagiannya diubah, hal-hal buruk akan terjadi. Jika dihapus, file dihapus dari struktur direktori sistem file, tetapi tidak benar-benar dihapus tautannya (yaitu, dihapus) sampai proses terakhir yang terbuka telah dieksekusi keluar. Jadi jika executable dihapus dan yang baru dengan nama yang sama tertulis di tempatnya, yang lama harus terus bekerja ok.


"Jika file yang sama dibuka dan bagian-bagiannya diubah" tidak sama dengan "jika executable dihapus dan yang baru dengan nama yang sama tertulis di tempatnya" ?? Apakah maksud Anda mv file baru ke file lama buruk tetapi file lama rm kemudian file baru ke lokasi file lama ok?
jean

4

Mereka akan terus berjalan. Mungkin crash mengerikan jika mereka mencoba dan mengakses diri mereka sendiri dan menerima sesuatu yang sama sekali salah. Saya tidak akan melakukannya kecuali saya harus :)


Ya. Saya memperbarui perangkat lunak secara manual sepanjang waktu saat skrip berjalan.
John T

1
Untuk skrip, penting untuk memiliki penginterpretasi terkini aktual yang bekerja dengan deskriptor file yang awalnya dibuka. Dalam hal ini tidak masalah selama Anda mengganti file dan tidak mengubahnya. Untuk binari biasanya mereka bekerja pada FD yang dipetakan pada awalnya sehingga tidak ada masalah (kecuali jika Anda memodifikasi file). Tetapi mungkin ada aplikasi yang membuka nama file untuk diperiksa dan itu mungkin berisiko (saya tidak bisa memberikan contoh negatif). Kebanyakan manajer distribusi / paket linux bekerja dengan asumsi bahwa mengganti binari dan perpustakaan (untuk waktu terbatas) tidak apa-apa.
eckes

1

Apa yang akan terjadi pada mereka yang menjalankan proses ruby?

  1. membuat salinan / usr / local / bin / ruby
  2. [jika tidak berjalan, jalankan / usr / local / bin / ruby]
  3. coba: rm / usr / local / bin / ruby
  4. dan lihat sendiri :)

1

Ini adalah pemahaman saya bahwa kernel Linux memiliki komponen yang disebut loader yang membuka file yang dapat dieksekusi itu sendiri, berisi gambar, selama proses pemuatan / penautan, dan setelah selesai dengan menghubungkan ke perpustakaan, dll., Loader menutup file. Dengan demikian, proses ini terjadi dan selesai pada saat kernel benar-benar meluncurkan proses.

Saya tidak yakin apakah executable asli pada disk perlu direferensikan jika executable nanti mencoba mengimpor pustaka eksternal.

Saya akan mengatakan, dan sudah pengalaman saya bahwa, jika Anda menghapus executable pada disk, executable yang dimuat dalam memori tidak terpengaruh. Demikian juga, jika file yang dapat dieksekusi diganti dengan versi yang lebih baru, yang saat ini mengeksekusi tidak "secara otomatis" diperbarui kecuali mereka dihentikan dan diluncurkan kembali.

Saya memiliki masalah dengan pengontrol RAID yang menyebabkan seluruh disk tempat direktori root dan partisi lainnya dipasang untuk tiba-tiba bertindak seolah-olah terputus. Tidak dapat memuat program baru, tetapi yang ada di memori berfungsi dengan baik, sampai mereka membutuhkan file dari disk.


Kedengarannya tidak efisien. Saya pikir Windows akan memetakan-memori saja, jadi halaman dimuat sesuai permintaan.
sashoalm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.