In Linux, cosa accadrebbe a un programma in esecuzione quando il suo file eseguibile è stato modificato o cancellato?


12

Supponiamo che /usr/local/bin/rubysia in esecuzione in background, quindi sovrascriviamo rubycon una versione diversa o addirittura eliminiamo ruby.

Che cosa accadrà a coloro che eseguono processi ruby?

Risposte:


10

Dipende esattamente da come viene aggiornato l'eseguibile. Se lo stesso file viene aperto e parti di esso vengono modificate, accadranno cose brutte. Se viene rimosso, il file viene rimosso dalla struttura di directory del filesystem, ma in realtà non scollegato (cioè eliminato) fino a quando l'ultimo processo che lo ha aperto non lo ha eseguito. Quindi, se l'eseguibile viene rimosso e uno nuovo con lo stesso nome scritto al suo posto, quello vecchio dovrebbe continuare a funzionare bene.


"Se lo stesso file viene aperto e parti di esso vengono modificate" non equivale a "se il file eseguibile viene rimosso e ne viene scritto uno nuovo con lo stesso nome" ?? Intendi dire che il nuovo file nel vecchio file è errato, ma il vecchio file rm quindi il nuovo file nella posizione del vecchio file è ok?
gennaio

4

Continueranno ad andare. Forse si schiantano orribilmente se provano ad accedere a se stessi e ricevono qualcosa di completamente sbagliato. Non lo farei se non dovessi :)


Sì. Aggiornamento manuale del software continuamente mentre gli script sono in esecuzione.
John T,

1
Per gli script è importante disporre di interpreti recenti recenti che funzionano con il descrittore di file inizialmente aperto. In questo caso, va bene finché si sostituisce il file e non lo si modifica. Per i binari in genere funzionano sull'FD mappato inizialmente, quindi non c'è problema (a meno che non si modifichino i file). Ma potrebbero esserci applicazioni che aprono il nome del file per l'ispezione e che potrebbero essere rischiose (non posso dare alcun esempio negativo). La maggior parte delle distribuzioni / gestori di pacchetti di Linux funzionano supponendo che la sostituzione di binari e librerie (per un tempo limitato) vada bene.
Devo dire il

1

Che cosa accadrà a coloro che eseguono processi ruby?

  1. fare una copia di / usr / local / bin / ruby
  2. [se non è in esecuzione, esegui / usr / local / bin / ruby]
  3. prova: rm / usr / local / bin / ruby
  4. e vedere di persona :)

1

Comprendo che il kernel Linux ha un componente chiamato caricatore che apre il file eseguibile stesso, contenente l'immagine, durante il processo di caricamento / collegamento e una volta terminato il collegamento con le librerie, ecc., Il caricatore chiude il file. Pertanto, questo processo si verifica ed è completo quando il kernel avvia effettivamente il processo.

Non sono sicuro se si debba fare riferimento all'eseguibile originale su disco se l'eseguibile in seguito tenta di importare librerie esterne.

Direi, ed è stata la mia esperienza che, se si elimina l'eseguibile su disco, l'eseguibile caricato in memoria non è interessato. Allo stesso modo, se il file eseguibile viene sostituito con una versione più recente, quelle attualmente in esecuzione non vengono aggiornate "automaticamente" a meno che non vengano arrestate e riavviate.

Ho avuto problemi con un controller RAID che ha causato l'intero disco su cui era montata la directory principale e altre partizioni per agire all'improvviso come se fosse disconnesso. Impossibile caricare nuovi programmi, ma quelli in memoria funzionavano bene, fino a quando non avevano bisogno di file dal disco.


Non sembra molto efficiente. Penso che Windows invece lo mapperebbe in memoria, quindi le pagine vengono caricate su richiesta.
sashoalm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.