Verifique a última vez que o arquivo .sh foi usado

6

Quando você executa ./myscript.sh é considerado como tempo de "acesso"?

Eu preciso saber a última vez que um script foi executado, mas não tenho certeza se isso conta como mtime , ctime ou atime (diferenças descritas here ).

    
por Andrejs 23.02.2016 / 09:00

1 resposta

14

Como explicado em a resposta à qual você está vinculado, isso depende das configurações. Em princípio, atime mudará toda vez que um arquivo for lido e, para executar um script, você precisa lê-lo. Então, sim, normalmente, o atime será alterado toda vez que o script for executado. Isso é facilmente demonstrado verificando o atime atual, executando o script e, em seguida, verificando-o novamente:

$ printf '#!/bin/sh\necho "running"\n' > ~/myscript.sh
$ stat -c '%n : %x' ~/myscript.sh 
/home/terdon/myscript.sh : 2016-02-23 10:36:49.349656971 +0200

$ chmod 700 ~/myscript.sh 
$ stat -c '%n : %x' ~/myscript.sh  ## This doesn't change atime
/home/terdon/myscript.sh : 2016-02-23 10:36:49.349656971 +0200

$ ~/myscript.sh 
running
$ stat -c '%n : %x' ~/myscript.sh   ## Running the script does
/home/terdon/myscript.sh : 2016-02-23 10:38:20.954893580 +0200

No entanto, se o script residir em um sistema de arquivos montado com as opções noatime ou relatime (ou qualquer uma das outras opções possíveis que podem afetar como atime é modificado), o comportamento será diferente:

   noatime
          Do  not  update inode access times on this filesystem (e.g., for
          faster access on the news spool to speed up news servers).  This
          works  for all inode types (directories too), so implies nodira‐
          time.

   relatime
          Update inode access times relative to  modify  or  change  time.
          Access time is only updated if the previous access time was ear‐
          lier than the current modify or change time.  (Similar to  noat‐
          ime,  but  it doesn't break mutt or other applications that need
          to know if a file has been read since the last time it was modi‐
          fied.)

          Since Linux 2.6.30, the kernel defaults to the behavior provided
          by this option (unless noatime was specified), and the  stricta‐
          time  option  is  required  to obtain traditional semantics.  In
          addition, since Linux 2.6.30, the file's  last  access  time  is
          always updated if it is more than 1 day old.

Você pode verificar quais opções seus sistemas montados estão usando executando o comando mount sem argumentos. Os testes que mostrei acima foram executados em um sistema de arquivos que foi montado usando a opção relatime . Com esta opção, atime é atualizado se i) o atual atime for mais antigo que a modificação atual ou a hora da alteração ou ii) não tiver sido atualizado por mais de um dia.

Portanto, em um sistema com relatime , o atime não é alterado quando um arquivo é acessado se o atual atime for mais recente que o horário atual da modificação:

$ touch -ad "+2 days" file
$ stat --printf 'mtime: %y\natime: %x\n' file
mtime: 2016-02-23 11:01:53.312350725 +0200
atime: 2016-02-25 11:01:53.317432842 +0200
$ cat file 
$ stat --printf 'mtime: %y\natime: %x\n' file
mtime: 2016-02-23 11:01:53.312350725 +0200
atime: 2016-02-25 11:01:53.317432842 +0200

O atime é sempre alterado no acesso se tiver mais de um dia. Mesmo que a hora da modificação seja mais antiga:

$ touch -ad "-2 days" file
$ touch -md "-4 days" file
$ stat --printf 'mtime: %y\natime: %x\n' file
mtime: 2016-02-19 11:03:59.891993606 +0200
atime: 2016-02-21 11:03:37.259807129 +0200
$ cat file
$ stat --printf 'mtime: %y\natime: %x\n' file
mtime: 2016-02-19 11:03:59.891993606 +0200
atime: 2016-02-23 11:05:17.783535537 +0200

Assim, na maioria dos sistemas Linux modernos, atime só será atualizado todos os dias, a menos que o arquivo tenha sido modificado desde que foi acessado pela última vez.

    
por 23.02.2016 / 10:06