I file temporanei devono essere salvati in / tmp o nella directory di lavoro corrente?

74

Ho un programma che ha bisogno di generare file temporanei. È scritto per macchine cluster.

Se ho salvato quei file in una directory temporanea a livello di sistema (ad esempio /tmp ), alcuni utenti si sono lamentati del fatto che il programma non era riuscito perché non avevano accesso corretto a / tmp. Ma se avessi salvato quei file nella directory di lavoro, anche questi utenti si sono lamentati che non volevano vedere quei file misteriosi.

Quale è una pratica migliore? Devo insistere sul fatto che il salvataggio in /tmp è il giusto approccio e difendere qualsiasi errore come "funzionante come previsto" (es. Chiedere all'amministratore l'autorizzazione / l'accesso appropriati)?

    
posta SmallChess 05.04.2016 - 13:40
fonte

6 risposte

137

I file temporanei devono essere memorizzati nella directory temporanea del sistema operativo per diversi motivi:

  • Il sistema operativo rende molto facile creare tali file assicurando che i loro nomi siano unici .

  • La maggior parte dei software di backup sa quali sono le directory che contengono i file temporanei e li salta. Se si utilizza la directory corrente, potrebbe avere un effetto importante su la dimensione dei backup incrementali se i backup vengono eseguiti frequentemente.

  • La directory temporanea può trovarsi su un altro disco, o nella RAM, rendendo l'accesso in lettura-scrittura molto, molto più veloce .

  • I file temporanei vengono spesso cancellati durante il riavvio (se sono in un ramdisk, vengono semplicemente persi). Ciò riduce il rischio di crescita infinita se la tua app non rimuove sempre i file temporanei correttamente (ad esempio dopo un arresto anomalo).

    La pulizia dei file temporanei dalla directory di lavoro potrebbe facilmente diventare disordinata se i file vengono archiviati insieme ai file dell'applicazione e dell'utente. Puoi mitigare questo problema creando una directory separata all'interno della directory corrente, ma questo potrebbe portare ad un altro problema:

  • La lunghezza del percorso potrebbe essere troppo lunga su alcune piattaforme. Ad esempio, su Windows, i limiti di percorso per alcune API, framework e applicazioni sono terribili , il che significa che puoi facilmente colpire tali limite se la directory corrente è già in profondità nella gerarchia ad albero e i nomi dei tuoi file temporanei sono troppo lunghi.

  • Nei server, il monitoraggio della crescita della directory temporanea viene spesso eseguito immediatamente. Se si utilizza una directory diversa, potrebbe non essere monitorata e il monitoraggio dell'intero disco non aiuterà a capire facilmente che si tratta di file temporanei che occupano sempre più spazio.

Per quanto riguarda gli errori di accesso negato, assicurati di lasciare che il sistema operativo crei un file temporaneo per te. Il sistema operativo può, ad esempio, sapere che per un dato utente dovrebbe essere usata una directory diversa da /tmp o C:\Windows\temp ; quindi, accedendo direttamente a tali directory, si potrebbe effettivamente incontrare un errore di accesso negato.

Se si ottiene un accesso negato anche quando si utilizza la chiamata del sistema operativo, beh, significa semplicemente che la macchina è stata mal configurata; questo era già spiegato da Blrfl . Spetta all'amministratore di sistema configurare la macchina; non devi cambiare la tua applicazione.

La creazione di file temporanei è semplice in molte lingue. Alcuni esempi:

  • Bash:

    # The next line will create a temporary file and return its path.
    path="$(mktemp)"
    echo "Hello, World!" > "$path"
    
  • Python:

    import tempfile
    
    # Creates a file and returns a tuple containing both the handle and the path.
    handle, path = tempfile.mkstemp()
    with open(handle, "w") as f:
        f.write("Hello, World!");
    
  • C #:

    // Creates a file and returns the path.
    var path = Path.GetTempFileName();
    File.WriteAllText(path, "Hello, World!");
    
  • PHP:

    # Creates a file and returns the handle.
    $temp = tmpfile();
    fwrite($temp, "Hello, World!");
    fclose($temp);
    
  • Rubino:

    require "tempfile"
    
    # Creates a file and returns the file object.
    file = Tempfile.new ""
    file << "Hello, World!"
    file.close
    

Si noti che in alcuni casi, come in PHP e Ruby, il file viene rimosso quando l'handle viene chiuso. Questo è un ulteriore vantaggio dell'uso delle librerie in bundle con il linguaggio / framework.

    
risposta data 05.04.2016 - 13:46
fonte
33

Should I insist saving to /tmp is the right approach and defend for any failure as "working as intended" (ie. ask your admin for proper permission access)?

Ci sono degli standard per questo, e la cosa migliore che puoi fare è conformarti a loro.

POSIX, che è seguito da quasi tutti i sistemi operativi non mainframe di qualsiasi significato che è probabile incontrare, dispone di disposizioni per la creazione di file temporanei con nomi univoci in una directory utilizzando valori predefiniti che possono essere riconfigurati dall'ambiente :

  • L'intestazione C stdio.h può facoltativamente includere una macro P_tmpdir che assegna un nome alla directory temporanea del sistema.
  • TMPDIR è la variabile di ambiente canonica per la modifica del percorso dei file temporanei. Prima di POSIX, c'erano altre variabili usate, quindi tendo ad andare con il primo di questo o TMP , TEMPDIR e TEMP che ha un valore, punting e usando il sistema predefinito se nessuno di questi esiste.
  • Le funzioni mkstemp() e tempfile() genereranno file temporanei unici.

Se ai tuoi utenti viene negata la possibilità di creare file temporanei, il sistema è configurato in modo errato o gli amministratori non stanno rendendo chiaro quale sia la loro politica su tali cose. In questi casi, ti troveremmo in una posizione molto ferma nel dire che il tuo programma è conforme a uno standard di portabilità ben definito e che il suo comportamento può essere modificato utilizzando le variabili di ambiente specificate dallo standard.

    
risposta data 05.04.2016 - 15:02
fonte
9

La directory temp-file è altamente dipendente dal sistema operativo / dall'ambiente. Ad esempio una dir web-server-temp è separata dalla directory os-temp per motivi di sicurezza.

Sotto ms-windows ogni utente ha il proprio temp-dir.

dovresti utilizzare createTempFile () per questo se tale funzione è disponibile.

    
risposta data 05.04.2016 - 14:10
fonte
9

Le risposte precedenti, sebbene corrette, non sono valide per la maggior parte dei cluster di computer su larga scala.

I cluster di computer non sempre seguono le convenzioni standard per le macchine, di solito per buoni motivi, e non ha senso discutere con gli amministratori di sistema.

La directory corrente si riferisce al file system centrale, a cui si accede attraverso la rete. Questo non è solo lento, ma mette anche carichi sul sistema per il resto degli utenti, quindi non dovresti usarlo a meno che tu non stia scrivendo molto e tu possa recuperare da esso se il lavoro va in crash.

I nodi di calcolo hanno il proprio disco rigido, ovvero il file system più veloce disponibile e quello che dovresti usare. La documentazione del cluster dovrebbe dirti di cosa si tratta, in genere /scratch , /tmp/[jobid] o qualche variabile ambientale non standard ( $SNIC_TMP in uno di quelli che uso).

Quindi, ciò che consiglio è renderlo configurabile dall'utente. I valori predefiniti possono essere i primi a cui si accede in scrittura:

  • $TMPDIR
  • tmpfile
  • /tmp
  • .

Ma aspettati un basso tasso di successo con questo approccio e assicurati di emettere un grosso avvertimento.

Modifica: aggiungerò un altro motivo per imporre che sia impostato dall'utente. Uno dei miei cluster ha $TMPDIR impostato su /scratch , che è scrivibile dall'utente e sul disco rigido locale. Ma la documentazione dice che tutto ciò che scrivi al di fuori di /scratch/[jobid] può essere cancellato in qualsiasi momento, anche nel mezzo della corsa. Quindi, se segui gli standard e confida in $TMPDIR , incontrerai arresti anomali casuali, molto difficili da eseguire il debug. Pertanto, puoi accettare $TMPDIR , ma non fidarti di esso.

Alcuni altri cluster hanno questa variabile correttamente configurata, quindi puoi aggiungere un'opzione per fidarti esplicitamente di $TMPDIR , altrimenti, emettere un grosso avvertimento.

    
risposta data 06.04.2016 - 09:48
fonte
1

Per molte applicazioni, dovresti considerare di inserire file temporanei in $XDG_RUNTIME_DIR o $XDG_CACHE_HOME (le altre dir XDG sono per file non temporanei). Per istruzioni su come calcolarli se non sono passati esplicitamente nell'ambiente, vedi le specifiche basate su XDG o trovare una libreria che già implementa quella parte.

Nota, tuttavia, che $XDG_RUNTIME_DIR è una nuova aggiunta e non esiste un fallback standard per i sistemi precedenti a causa di problemi di sicurezza.

Se nessuno di questi è adatto, /tmp è la posizione corretta. Dovresti mai assumere che la directory corrente sia scrivibile.

    
risposta data 07.04.2016 - 01:49
fonte
-2

Questo è più simile a un'alternativa, ma potresti scollegare () il file immediatamente dopo fopen (). Dipende dal modello di utilizzo di cource.

Lo scollegamento dei file, se possibile, aiuta in diversi modi:

  • il file non è visto - l'utente non lo vede.
  • Il file
  • non è visto da altri processi - non c'è possibilità che altri processi modifichino il file per errore.
  • facile pulizia in caso di arresto anomalo del programma.

I file devono essere creati in / tmp. Se l'utente non ha i diritti per creare file lì, significa che il sistema è configurato male.

I file non possono essere creati nella home directory degli utenti. Molti utenti, come "nessuno", "www-data" e molti altri, non hanno il diritto di scrivere nelle loro directory home, o sono anche chroot () - ed. Si noti che anche in ambiente chroot / tmp esiste ancora.

    
risposta data 06.04.2016 - 19:37
fonte

Leggi altre domande sui tag