Vanade (logi)failide töötlemine serveris

Serverites juhtub ikka, et erinevad rakendused peavad logisid.  Ja logidega kipub ikka see juhtuma, et need muudkui kogunevad ja keegi ei kustuta neid.  Ning siis äkki avastame, et serveris on kettaruum kuhugile ära kadunud.

Sedalaadi probleemide lahendamiseks on hea kasutada Windowsi käsurea utiliiti forfiles.  Windows Server 2003-s on see juba Windowsiga kaasas, varasemates versioonides seda veel ei olnud.  Windows NT4 ja  2000 Resource Kit sisaldavad seda utiliiti ka, ent tasuta kättesaadavate utiliitide hulgas seda kahjuks ei ole.

Tegelikult on forfiles mõeldud failide otsimiseks ning iga leitud faili peal sama käsu käivitamiseks.  Aga vanade logide puhul me just seda tahamegi.

Mõned näited ka.  Kui me tahame kustutada kõik vanemad kui 90 päeva failid kaustast d:\logs ja alamkaustadest, siis seda teeb järgnev käsk:

forfiles /p "d:\LOGS" /s /d -90 /c "cmd /c if @isdir==FALSE del /f /q @file"

Kui Sa aga tahad samast kaustast (ilma alamkaustadeta) ainult *.log failid kustutamise asemel kokku pakkida (ma kasutan selleks utiliiti 7-zip), siis seda teeb järgmine käsk:

forfiles /p "d:\LOGS" /m *.log /d -90 /c "cmd /c if @isdir==FALSE 7z a @fname.zip @file && del /f /q @file"

Selle käsu ainsaks probleemiks on see, et iga fail pakitakse samanimeliseks arhiiviks.  Kui on vaja failid kuu kaupa kokku pakkida, siis tuleks selleks eraldi skript kirjutada, mis arhiivi failinime oskaks välja arvutada.

Teeme samad näited läbi ka PowerShellis. Esimene näide:

Get-ChildItem -Path d:\logs -Recurse |
    Where-Object {-not $_.PSIsContainer} |
    Where-Object {((get-date) - $_.lastwritetime).days -gt 90} |
    Remove-Item

#Requires -Version 3
Get-ChildItem -Path d:\logs -Recurse -File |
    Where-Object {((get-date) - $_.lastwritetime).days -gt 90} |
    Remove-Item

Ja teine näide:

#Requires -Version 3
Get-ChildItem -Path d:\logs -Recurse -File |
    Where-Object {([datetime]::Now - $_.lastwritetime).days -gt 90} |
    Foreach-Object {
        & 7z a $("{0:yyyy.MM}.zip" -f [datetime]::Now.AddDays(-90)) $_.FullName
        Remove-Item $_
    }

Positiivne asja juures on nüüd see, et failid pakitakse kokku ühte arhiivi.  Arhiivi nimi sisaldab aastat ja kuud tänasest päevast 90 päeva tagasi.  Alternatiivina võiks failinime tuletada tänasest päevast 3 kuud tagasi:

"{0:yyyy.MM}.zip" -f (get-date).AddMonths(-3)
Advertisements