NAME
tmpreaper - removes files which haven’t been accessed for a period of
time
SYNOPSIS
tmpreaper [-htvfmMsaT] [--help] [--test] [--verbose] [--force]
[--delay=x] [--runtime=x] [--showdeleted] [--ctime] [--mtime] [--mtime-
dir] [--symlinks] [--all] [[--protect ’<shell_pattern>’]...]
<time_spec> <dirs>...
DESCRIPTION
tmpreaper recursively searches for and removes files and empty
directories which haven’t been accessed for a given number of seconds.
Normally, it’s used to clean up directories which are used for
temporary holding space, such as "/tmp". Please read the WARNINGS
section of this manual.
When changing directories, tmpreaper is very sensitive to possible race
condition security exploits[1], and will exit with an error if one is
detected. It does not follow symbolic links in the directories it’s
cleaning (even if a symbolic link is given as its argument), never
performs chdir(".."), will not switch file systems, and only removes
empty directories and regular files. Unless your machine is one with
lots of relatively untrusted users, such as an ISP or school, you don’t
need this program; ‘find ... -exec rm ...’ works just as well when you
don’t have to be concerned about people trying to exploit the race
condition on you.
tmpreaper will stop itself after almost one minute with an appropriate
warning message, as attempts to keep it running long enough so that it
runs in parallel with another instance of itself may also lead to
possible vulnerabilities. Normally, tmpreaper won’t need that amount of
time. If your system is so slow that it does, try to configure things
so that this doesn’t happen. As a last resort, the --runtime=x option
can be used to set the number of seconds after which the timeout
occurs; the default setting is 55 seconds.
tmpreaper dates files by their atime, not their mtime, unless you
select the --mtime option. If files aren’t being removed when ls -l
implies they should be, use stat(1) or ls --time=access to examine the
file’s atime and see if that helps to explain the problem.
Additionally, tmpreaper can be instructed to also check the ctime
(inode change time, which is updated e.g. when the file is created or
permissions are changed). This is primarily useful when tmpreaper is
used to clean up directories that are accessible as a Samba share; DOS
(and Windows) PCs preserve the mtime and the atime when copying to a
new file, so that it appears that the newly created file is old.
tmpreaper will remove such files is the atime is beyond the removal
time, even though they were just created. This is avoided by using the
--ctime option.
As testing the contents of subdirectories will update those
directories’ atime, empty directories won’t be removed. To circumvent
this problem you can use the --mtime-dir option, which will switch on
mtime checking for directories only. Using --mtime-dir in addition to
--mtime doesn’t do anything useful.
The <time_spec> parameter defines the age threshold for removing files.
If the file has not been accessed for <time_spec>, it becomes eligible
for removal. The <time_spec> should be a number, defaulting to hours,
optionally suffixed by one character: ‘d’ for days, ‘h’ for hours, ‘m’
for minutes, or ‘s’ for seconds. Following the time option, one or
more directories must be given for tmpreaper to clean up.
On linux ext2/ext3 filesystems, no errors will be given when trying to
remove files marked as immutable. A common situation for this
(nowadays) is the ext3 .journal file. However, there may of course be
other files marked as such by the system administrator.
OPTIONS
<noargs>, -h, --help
Print a brief version, copyright, and usage statement on stderr,
then exit with error status 1.
-t, --test
Don’t actually remove any files, but go through the motions,
checking through the directory, then pretend to remove the
eligible files.
-v, --verbose
Print a verbose display. Two levels of verbosity are
available---use this option twice to get the most verbose
output. The --test option automaticly sets --verbose once.
Higher numbers mean more output (max. is 3).
To force normal verbosity after --test, use "--verbose=0". This
will generally only show error messages. Use "--test --verbose=0
--showdeleted" to give a shellscript-like list of actions that
would have been done (see the --showdeleted description below).
--showdeleted
Show what files and directories are deleted. The output is in
the form of shell commands, i.e. "rm /dir/dir2/file" and "rmdir
/dir/dir2".
When used together with --test, this option will still cause the
"shell commands" to be printed, although nothing is really done.
Note that this may show more than without --test, as problems
removing the file won’t be detected (e.g. immutable files).
-f, --force
Remove files even if EUID doesn’t have write access (akin to rm
-f). Normally, files owned by the current EUID, with no write
bit set are not removed.
--delay=x
Delay execution at the start for a random time, up to x seconds;
if no value is specified, the default maximum time to delay is
256 seconds. This is an option useful in cron scripts to make
the execution of tmpreaper less predictable, thus making things
a little harder for those who would attempt to use tmpreaper to
thwart security.
-T x, --runtime=x
Execution of tmpreaper will aborted after x seconds; this is to
prevent attacks that create many, many files. By default the
timeout is set to 55 seconds. A value of 0 will disable this
feature, which is not advised as this feature prevents possible
race-conditions between different instances of tmpreaper.
-m, --mtime
Base the decision of whether to remove the file on its mtime,
rather than on its atime.
-M, --mtime-dir
Base the decision of whether to remove the directory on its
mtime, rather than on its atime.
-c, --ctime
Base the decision of whether to remove the file on its ctime, in
addition to its atime. Only applicable if the --mtime options
is not given!
-s, --symlinks
Remove symlinks too, not just regular files and directories.
-a, --all
Remove all file types, not just regular files, symlinks, and
directories.
--protect <shell_pattern>
Protect the files that match the <shell_pattern> from deletion.
This option may be used more than once. It has no one letter
abbreviation, you must spell out the full word "protect".
If you do not enclose the <shell_pattern> in single quotes, the
shell will perform the expansion before tmpreaper reads its
argument array. The program does not support that syntax, so
you must use single quotes around the glob pattern.
tmpreaper will chdir(2) into each of the directories you’ve
specified for cleanup, and check for files matching the
<shell_pattern> there. It then builds a list of them, and uses
that to protect them from removal. For example:
tmpreaper --test --verbose --protect \
’.X*-{lock,unix,unix/*}’ --protect ’.ICE-{unix{/*,}}’ \
5d /tmp # 5 day grace period
TIPS
As long as there are files present inside a subdirectory, it won’t get
removed. You can use a non-writable, self-owned file, perhaps named
".tmpreaper", or, if you are su, a file that has the ext2fs immutable
attribute set, to keep a subdirectory from being deleted. Of course,
you could just as easily use use the --protect option to obtain the
same result.
Because the command line argument processing is implemented with GNU
getopt_long(3)[2], you may order the arguments thusly, if it pleases
you:
tmpreaper --test --verbose 5h \
--protect ’./tmp/{blah?,dir{/blah4,}}’ ./tmp \
--protect ’/tmp/.X*’ /tmp
... Note that if you use --all or --symlinks, it will have global
effect. If you only want it turned on for one directory, you must use
separate commands.
WARNINGS
Please do not ever run tmpreaper on ‘/’!!! There are no safeguards
against this built into the program, because that would make it
difficult to use in a chrooted environment.
SEE ALSO
chattr(1) chdir(2) chroot(8) cron(1) getopt_long(3) ls(1) lsattr(1)
rm(1) stat(1)
[1] http://seclists.org/lists/bugtraq/1996/May/00.html or
http://www.security-express.com/archives/bugtraq/1996_2/00.html
http://linuxgazette.net/18/tmp.html
(formerly http://www.linuxgazette.com/issue18/tmp.html)
http://linuxgazette.net/20/followup.html
[2] info:(libc)Long Options
AUTHOR
Karl M. Hegbloom <karlheg@debian.org>
Mostly based on ‘tmpwatch-1.2/1.4’, by:
Erik Troan <ewt@redhat.com>
Now being maintained for Debian by:
Paul Slootman <paul@debian.org>