web-dev-qa-db-ja.com

前回使用した.shファイルを確認する

./myscript.shを実行すると、「アクセス」時間と見なされますか?

スクリプトが最後に実行された時刻を知る必要がありますが、これがmtimectimeまたはatimeとしてカウントされるかどうかはわかりません(説明されている違い here )。

7
Andrejs

回答 で説明したように、リンク先は設定によって異なります。原則として、atimeは、ファイルがreadになるたびに変更され、スクリプトを実行するには、ファイルを読み取る必要があります。つまり、通常、atimeはスクリプトが実行されるたびに変更されます。これは、現在のatimeを確認し、スクリプトを実行してからもう一度確認することで簡単に確認できます。

$ 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

ただし、スクリプトがnoatimeまたはrelatimeオプション(またはatimeの変更方法に影響を与える可能性のあるその他のオプション)を使用してマウントされたファイルシステムにある場合、動作は異なります。

   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.

引数なしでコマンドmountを実行すると、マウントされたシステムが使用しているオプションを確認できます。上記で示したテストは、relatimeオプションを使用してマウントされたファイルシステムで実行されました。このオプションを使用すると、i)現在のatimeが現在の変更または変更時刻よりも古い場合、またはii)1日以上更新されていない場合、atimeが更新されます。

したがって、relatimeを備えたシステムでは、現在のatimeが現在の変更時刻よりも新しい場合、ファイルにアクセスしてもatimeは変更されません。

$ 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

atimeは、1日以上経過している場合、アクセス時に常に変更されます。変更時間が古い場合でも:

$ 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

したがって、最新のほとんどのLinuxシステムでは、最後にアクセスしてからファイルが変更されていない限り、atimeは毎日程度しか更新されません。

15
terdon