La sostituzione di una esecuzione in linux

Ho un linux embedded sistema in grado di aggiornarsi da una scheda USB. L’interfaccia del programma rileva l’USB di inserimento e cerca l’aggiornamento eseguibile. Io attualmente copia in un file locale e installare alcuni comandi in rc5.d per copiare i file exe esistenti al prossimo avvio. Poi ho il riavvio del software.

C’è un modo migliore per fare questo?

InformationsquelleAutor David Huff | 2009-11-10

 

3 Replies
  1. 31

    Non c’è bisogno di avere copia del file sopra all’avvio successivo. Invece, questa sequenza funziona bene:

    • Copiare il file eseguibile un file locale.
    • Verificare file locale.
    • unlink() esistenti eseguibile.
    • rename() nuovo eseguibile con il nome giusto.

    L’applicazione continuerà a funzionare dopo il unlink() – il kernel non rilasciare i dati sottostanti fino a quando tutti l’esecuzione di copie sono finiti.

    È quindi possibile anche utilizzare solo execve() di avere attualmente in esecuzione di un processo, di sostituire con la nuova versione caricata.

  2. 24

    È su OK per sostituire il file eseguibile mentre il programma è in esecuzione SE si rm (scollegare) prima.

    Questo non è ciò che accade con cp, in modo da non usare. Sia mv file, o, per essere davvero sicuri, rm e poi mettere quello nuovo nello stesso luogo. Se si sta facendo questo con il codice nel software embedded, quindi unlink(2) è ciò che si desidera avviare con.

    Unix kernel sapere che l’inode è ancora in uso, e si rimuove la voce di directory per il file, ma non rilasciare il inode (e i blocchi di dati) fino a quando l’inode numero di riferimento colpisce zero, e che non accadrà durante un’istanza in esecuzione.

    Questo probabilmente non è un problema del tuo sistema embedded, ma come una generale attenzione, non contare su di questo lavoro per lo storage di rete, tranne quando sul server stesso.

    • Suppongo che devo anche aggiungere che sono OK, se la rete è di fatto sotto il filesystem strato, in modo che questa tecnica potrebbe essere OK con iSCSI.
  3. 10

    In linux, si può tranquillamente sostituire l’eseguibile in esecuzione durante il processo di esecuzione. Fintanto che il processo è in esecuzione, l’istanza potrà continuare ad utilizzare il “vecchio” codice. Tutte le nuove chiamate per l’applicazione utilizzerà il “nuovo” codice. Così, semplicemente a riavviare l’applicazione (o il dispositivo, se necessario) utilizzare la nuova copia.

    Nota: è necessario essere attenti se la vostra applicazione di modificare i file di configurazione o le biblioteche, come tali, non possono essere residente in memoria. In questo caso, la scommessa più sicura è quello di avere uno script che fare quello che hai detto.

    • Il punto essenziale da ricordare è che è necessario bisogno di unlink() il file originale prima (ad esempio, utilizzando il rm di comando) per questa garanzia di attesa.

Lascia un commento