User sessions in Interchange are usually kept as files in the
session/
directory (or inside
a DBM database) for each catalog. Since session
data is not deleted after sessions end (or timeout), periodic expiring
needs to be set up to keep the session database or session files from growing
too large, wasting disk space and slowing down directory lookups.
There's no worry that expiring will do any harm, because all our scripts only clean up unused sessions. Active users will not notice any change.
The simplest way to expire catalog's session files is to run
expire -c CATALOG_NAME
.
For convenience, there is also expireall script which
reads all catalog entries in interchange.cfg
and runs expire on them.
The expire script accepts a -r
option
which, when DBM sessions are used, tells the script to reorganize database
files and recover lost disk space.
On a UNIX server, it's most useful to run expireall
from crontab
. As the Interchange user, run
crontab -e to edit crontab data, and enter something like:
# once a day at 4:40 am 40 4 * * * /PATH/TO/perl /PATH/TO/INTERCHANGE/bin/expireall -r
Note | |
---|---|
If a session saved search paging files in |
When file-based sessions are used (no DBM), then you can use a custom script like this:
#!perl # expire_sessions.pl -- delete files 2 days old or older # invoke as: /PATH/TO/perl expire_sessions.pl /PATH/TO/CATALOG/session/ ... my @files; my $dir; foreach $dir (@ARGV) { # just push files on the list if (-f $dir) { push @files, $_; next; } next unless -d $dir; # get all the file names in the directory opendir DIR, $dir or die "opendir $dir: $!\n"; push @files, ( map { "$dir/$_" } grep(! /^\.\.?$/, readdir DIR)); } for (@files) { unless (-f $_) { warn "skipping $_, not a file.\n"; next; } next unless -M $_ >= 2; unlink $_ or die "unlink $_: $!\n"; }
This script can be adjusted as necessary. Refinements might include reading the file to "eval" the session reference and expire only customers who are not registered members.
If your files get chown-ed to root every day, then you probably used root's instead of Interchange user's crontab file. Either move the crontab to the Interchange user, or use su to swith users from the root account:
44 4 * * * su -c "/PATH/TO/INTERCHANGE/bin/expireall -r" IC_USERNAME
The above does not, however, clean temporary files from the ScratchDir
directory. We don't often use the expire scripts any more. We just use
a small standalone script clean_session_tmp
:
#!/bin/sh for DIR in $*; do for i in session tmp; do if test -d "$DIR/$i"; then find $DIR/$i -type f -mmin +480 | xargs --no-run-if-empty rm find $DIR/$i -depth -type d -empty -mtime +2 | xargs --no-run-if-empty rmdir else echo "$0: $DIR/$i doesn't exist."; fi done done
using a cron entry similar to:
44 0,4,8,12,16,20 * * *DIR/bin/
clean_session_tmp/path/to/catdir1
/path/to/catdir2