#!/bin/bash
python /home/sites/myapp/Main.py &> /home/sites/myapp/logs/init.log &
該腳本產生大約1G /周的日誌。
當我在運行時手動刪除init.log並且未重新啓動腳本時,它仍將數據保存在缺少的init.log中。當腳本重新啓動時,init.log將再次可見。在運行時手動刪除日誌文件時,bash腳本在哪裏保存stdout和stderr?
重新啓動腳本是查看日誌的唯一方法嗎?
#!/bin/bash
python /home/sites/myapp/Main.py &> /home/sites/myapp/logs/init.log &
該腳本產生大約1G /周的日誌。
當我在運行時手動刪除init.log並且未重新啓動腳本時,它仍將數據保存在缺少的init.log中。當腳本重新啓動時,init.log將再次可見。在運行時手動刪除日誌文件時,bash腳本在哪裏保存stdout和stderr?
重新啓動腳本是查看日誌的唯一方法嗎?
在unix系統上當創建init.log
時,將創建一個inode。每個inode
都有一個計數器,它計算對該文件的所有引用。引用意味着硬鏈接或打開文件時。該文件只在該計數器回到零時被刪除。
因此,當標準輸出被重定向到init.log
其inode
具有計數器值2(由目錄項所引用,而且由於open
計數。當rm
(使用unlink
功能)刪除該文件,該計數器成爲1,所以文件是沒有被任何目錄條目引用,但inode
仍然存在當腳本完成時,計數器變爲0並且inode
被刪除
沒有簡單的方法來讀取任何目錄條目未引用的inode。
文件實際上不是d直到沒有任何引用它。在這種情況下,您已刪除所有目錄條目,但程序仍具有打開的文件描述符,因此在程序退出之前數據不會完全刪除。請注意,它也將繼續佔用磁盤空間。
在Linux中,仍然可以在/proc/PID/fd/FD
中查看文件的內容,其中PID是進程的ID,FD是您感興趣的文件描述符。一旦程序退出,數據將被烤乾,磁盤空間可以被回收...所以儘可能獲得你的數據;)
如果你知道一個程序仍然有打開的文件描述符,你不應該刪除一個日誌文件。而應該用cat /dev/null > log.file
截斷文件,或者在bash中使用> log.file
。
它消耗'home /'分區中的磁盤空間而不是可以找到/ proc/PID/fd/FD /'的'/' – Bob
謝謝TrueY。這現在有道理。 – Bob