Domanda

Ho fatto la seguente:

nohup find / &

rm nohup.out

Stranamente, il nohup -command continuato a correre. Ho atteso per un nuovo file da creare. Per la mia sorpresa non c'era tale file. Da dove viene lo stdout del comando andare?

È stato utile?

Soluzione

La rimozione di un file in UNIX fa due cose:

  • rimuove la voce di directory per esso.
  • se nessun processo l'hanno aperto e altre voci di directory punto ad esso (hard link), rilascia lo spazio.

Il vostro processo nohupped sarà lieto di continuare a scrivere sul file che si chiamava nohup.out, ma ora è conosciuto come nient'altro che un descrittore di file all'interno di tale processo.

Si può anche avere un altro processo di creare un nohup.out, non interferirà con il primo.

Quando tutti i collegamenti reali sono andati, e tutti i processi hanno chiuso esso, lo spazio su disco sarà recuperato.

Altri suggerimenti

se si vuole eliminare il file nohup.out, la maniglia sarà perso e sarà scrivere solo per il descrittore di file, ma se si vuole pulire il file nohup.out poi basta eseguire questo

true > nohup.out

si cancellerà il contenuto del file, ma non il file.

Questo è il comportamento standard su Unix.

Quando è stato rimosso il file, l'ultimo anello nel file system è stato rimosso, ma il file era ancora aperto e quindi l'uscita di find (in questo caso) è stato scritto per blocchi del disco nel pool di buffer del kernel, e forse anche su disco. Ma il file non aveva un nome. Quando uscì find, nessun processo o un file (inode) fa riferimento il file, quindi lo spazio è stato rilasciato. Questo è un modo che i file temporanei che spariranno quando vengono creati un programma uscite - aprendo il file e poi rimuoverlo. (Questo presuppone che non è necessario un nome per il file,. Chiaramente, se avete bisogno di un nome per la temporanea, questa tecnica non funzionerà)

cat /dev/null > nohup.out

qui

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top