Como faço para encontrar arquivos que são criados / modificados / acessados antes da reinicialização?

0

Em um sistema remoto (do qual não sou administrador), configurei uma alternativa TMPDIR em meu '.profile (porque o padrão do sistema tem espaço muito limitado).

Esta alternativa TMPDIR não é limpa na reinicialização. É por isso que eu quero periodicamente (ou no logon) limpe o diretório. No entanto, posso estar logado várias vezes com scripts de longa execução quando não estou logado, então, na verdade rm ing todo o conteúdo não é uma opção.

Existe uma maneira (preferencialmente em bash , mas as ferramentas usuais estão disponíveis) para localizar arquivos em um diretório específico que são mais antigos que a reinicialização mais recente, como limpar meu TMPDIR ?

    
por Bert Peters 18.11.2015 / 23:19

4 respostas

2

Igual ao respondido por Thomas, mas com uma maneira mais fácil de encontrar o tempo de inicialização usando o campo btime de / proc / stat

$ DT=$(awk '$1 ~ /btime/ { print "print scalar localtime("$2")" }' /proc/stat|perl)
$ echo $DT
Fri Nov 13 15:04:28 2015
$ last reboot|head -1
reboot   system boot  3.16.0-4-amd64   Fri Nov 13 15:04 - 22:53 (5+07:49)  
$ touch -d "$DT" /tmp/foo

e use find com a opção -newer

    
por 19.11.2015 / 04:54
0

Observando o comentário, uptime -s é bastante recente (aparecendo em código específico do Linux no final de 2012 ).

Um pouco mais portátil pode ser usar a saída de last , que lista os timestamps de inicialização do sistema, por exemplo,

tom      pts/0        michener.jexium- Wed Nov 18 17:00   still logged in
reboot   system boot  3.2.0-4-amd64    Wed Nov 18 16:47 - 20:36  (03:49)
tom      pts/0        michener.jexium- Wed Nov 18 04:12 - down   (01:21)
reboot   system boot  3.2.0-4-amd64    Wed Nov 18 04:04 - 05:33  (01:29)
tom      pts/0        michener.jexium- Tue Nov 17 17:03 - down   (04:24)

e (com grep ou awk) obtendo o timestamp da linha "reboot" mais recente e usando esse como um argumento para touch , por exemplo,

LAST=$(last | grep -E '^reboot ' | sed -e 's/^.\{39\}//' -e 's/\(.\{16\}\).*//' | head -n 1)

Isso permite que você use a opção -newer de find e trabalhe para reinicializações em frações de um dia:

FILE=/tmp/foo
touch -d "$LAST" $FILE
find $MY_TMPDIR ! -newer $FILE -exec echo rm -rf {} \;

A parte fraca disso, é claro, é conhecer o formato de last saída (mas não há padrão para que ).

    
por 19.11.2015 / 02:55
0

Com base na resposta fornecida pela VenkatC, acabei usando o seguinte script para limpar minha pasta tmp.

if [ -d $tmpdir ] || mkdir -p $tmpdir
then
    chmod 700 $tmpdir
    export TMPDIR="$tmpdir"

    DT=$(awk '$1 ~ /btime/ { print "print scalar localtime("$2")" }' /proc/stat|perl)
    touch -d "$DT" "$TMPDIR"

    find "$TMPDIR" -mindepth 1 -not -newer "$TMPDIR" -delete
fi
    
por 19.11.2015 / 15:45
0

Aqui está um script que analisa a saída de uptime , calcula o total de minutos desde a inicialização e encontra arquivos modificados maiores que muitos minutos atrás. Eu testei isso no FreeBSD 10.2, no Debian Jessie 8 e no Ubuntu Trusty 14.04. Eu não sei sobre o formato de saída uptime em outros sistemas.

O coração disso é o script awk na função uptime_minutes , que pode ser colocado em um arquivo de comando próprio para uso em outros comandos find e situações em que você precisa saber o número de minutos de tempo de atividade, provavelmente com precisão de 1 minuto.

Salve isso em um arquivo e execute com sh filename directory ... , em que filename é o nome escolhido para o script e directory é o diretório, um ou mais, que você deseja pesquisar:

    #!/bin/sh

    uptime_minutes() {
        uptime |
        awk '
            {
                for (i=1; i<=NF; i++) {
                    if ($i == "up") {
                        split($(i+3), hhmm, "[:,]")
                        print ($(i+1) * 24 * 60) + (hhmm[1] * 60) + hhmm[2]
                        exit
                    }
                }
            }
        '
    }
    find "${@:?}" -mmin +$(uptime_minutes) # -exec rm {} \;

O "${@:?}" apenas imprime e erro se você não fornecer nenhum argumento de diretório.

O código de remoção de arquivo está comentado no final. Basta remover o # se você quiser realmente remover os arquivos em vez de imprimir seus nomes.

    
por 19.11.2015 / 23:22

Tags