-
Prevents jobs to collide if they take longer to run than the frequency itself
-
it’s also possibl with a .htaccess file and “deny from all ” in that file
-
# onlogdo: a hack to handle a common problem: when a certain message shows up in the log file, an action should be performed. (credits to Ben Wong)
-
#!/bin/bash
-
# Author: Ben Wong <[email protected]>
-
# Created on: <2001-08-08 11:56:03 hackerb9>
-
# Time-stamp: <2002-11-20 14:13:11 bbb>
-
# onlogdo: a hack to handle a common problem: when a certain message
-
# shows up in the log file, an action should be performed. E.g.: when
-
# a PC-card network device is inserted, it should be ifconfig’d or
-
# perhaps dhclient should be run. This program can do that in a fairly
-
# reasonable way.
-
### FIRST, THE HELPER FUNCTIONS ###
-
function showmanpage () {
-
cat <<‘EOF’
-
NAME
-
onlogdo – monitor a log file and execute commands based on patterns
-
SYNOPSIS
-
onlogdo <logfile> <pattern> <command> [ <pattern> <command> … ]
-
logfile: a file that gets appended to (e.g., /var/log/messages),
-
pattern: a string (can use bash‘s extended pathname globbing syntax),
-
command: the command to run when the previous pattern is seen.
-
DESCRIPTION
-
Onlogdo is a hack to handle a common problem: when a certain
-
message shows up in a log file, an action should be performed.
-
E.g.: when a PC-card network device is inserted, it should be
-
ifconfig’d or perhaps dhclient should be run. This program can do
-
that in a fairly reasonable way.
-
Onlogdo continuously reads lines as they are appended to a log
-
file. When a line matches a given pattern, the command associated
-
with that pattern is run in the background. The patterns
-
recognized are standard pathname globbing (*, ?, []) plus bash‘s
-
extended pattern matching (extglob) syntax (see bash(1)).
-
The log file is reopened properly, if the log file being read is
-
rotated. Also, since it blocks when waiting for new lines, onlogdo
-
takes up almost no CPU time.
-
PATTERN MATCHING SYNTAX
-
Don’t worry about learning the pattern matching the first time you
-
read this manual; you‘ll rarely need it, unless you’re anal about
-
being as succinct as possible. (Like the author).
-
The following is an excerpt from bash‘s man page; see bash(1) for
-
full details. In the following description, a pattern-list is a
-
list of one or more patterns separated by a |. Composite patterns
-
may be formed using one or more of the following sub-patterns:
-
* Matches any string, including the null string.
-
? Matches any single character.
-
[…] Matches any one of the enclosed characters. A pair of
-
characters separated by a hyphen denotes a range
-
expression. If the first character following the [ is a
-
! or a ^ then any character not enclosed is matched.
-
?(pattern-list)
-
Matches zero or one occurrence of the given patterns
-
*(pattern-list)
-
Matches zero or more occurrences of the given patterns
-
+(pattern-list)
-
Matches one or more occurrences of the given patterns
-
@(pattern-list)
-
Matches exactly one of the given patterns
-
!(pattern-list)
-
Matches anything except one of the given patterns
-
EXAMPLES
-
Pipelines are okay:
-
onlogdo /var/log/messages ‘*‘ ‘sleep 5; echo olleH | rev‘
-
Wildcards match filenames as usual in a command:
-
onlogdo /var/log/messages ‘Segfault‘ ‘rm /*.core‘
-
Multiple pattern and command pairs are allowed:
-
onlogdo /var/log/messages \
-
‘ep0 at pcmcia‘ ‘/etc/rc.d/dhclient start‘ \
-
‘ep0 detached‘ ‘/etc/rc.d/dhclient stop‘ \
-
‘wi0 at pcmcia‘ ‘/etc/rc.d/dhclient start‘ \
-
‘wi0 detached‘ ‘/etc/rc.d/dhclient stop‘
-
Bash’s extended pathname globbing to do the same as above:
-
onlogdo /var/log/messages \
-
‘@(ep|wi)[0-9] at pcmcia’ ‘/etc/rc.d/dhclient start’ \
-
‘@(ep|wi)[0-9] detached’ ‘/etc/rc.d/dhclient stop’
-
A useful example for NetBSD/hpcmips:
-
onlogdo /var/log/messages ‘hpcapm: resume’ ‘sleep 1; xrefresh’
-
Under NetBSD/hpcmips-1.5.1, the X server screen is overwritten by the
-
console on an APM resume. I put the last “onlogdo” example in my
-
system xinitrc, so xrefresh will be run automatically. (The sleep
-
is there to wait for the console to finish junking up the screen).
-
SEE ALSO
-
tail(1), bash(1)
-
BUGS
-
If this had been written in Perl it would have used “normal”
-
regexp syntax instead of pathname expansion. Bash‘s extensions
-
make the patterns as powerful as regexps, but more recondite.
-
There is no (documented) way for a command to refer to specifics
-
in the line that matched. E.g., if the pattern was “@(ep|wi)0”,
-
the command wouldn’t know if the line contained ep0 or wi0.
-
The author has spent way too much time perfecting a kludge. No
-
matter what you‘re using onlogdo for, there’s probably a more
-
“correct” way to do it. On the other hand, onlogdo is widely
-
applicable and easy to use, so at least you won‘t be wasting much
-
time while doing it the “wrong” way.
-
There should be a real man page.
-
AUTHOR
-
Ben Wong <[email protected]>
-
HISTORY
-
Onlogdo started life as a one line kludge to work around a bug in
-
the interaction between APM and the X server in NetBSD-1.5/hpcmips
-
in September of 2001.
-
EOF
-
}
-
### USAGE AND ARGUMENT SANITY CHECKING ###
-
if [[ $# -lt 3 ]]; then
-
showmanpage
-
exit 1
-
fi
-
# Emacs’s syntax highlighting doesn‘t handle single ticks (‘) properly.
-
# Check if -v (verbose) flag was given.
-
if [[ “$1” == “-v” ]]; then
-
ifverbose=echo # Echo commands verbosely, if -v.
-
shift
-
else
-
ifverbose=: # Usually just run a no-op.
-
fi
-
# Make sure the log file is readable.
-
if [[ ! -r “$1” ]]; then
-
echo “onlogdo: \”$1\” is not readable” >&2
-
exit 1
-
fi
-
if [[ -d “$1” ]]; then
-
echo “onlogdo: \”$1\” is a directory” >&2
-
exit 1
-
fi
-
### SIGNAL HANDLING AND EXIT CLEANUP ###
-
# Run cleanup function when shell exits.
-
trap cleanup EXIT
-
cleanup () {
-
echo “onlogdo: cleaning up…” >&2
-
if [[ “$TAILPID” ]]; then
-
kill $TAILPID # Kill the bg tail process.
-
fi
-
rm -f “$PIPE” # Delete the named pipe.
-
rmdir “$PIPEDIR”
-
return 0
-
}
-
### MAIN ROUTINE STARTS HERE ###
-
# Don’t expand wildcards in pattern arguments as filenames.
-
set -o noglob
-
# Use bash’s extended pattern matching operators
-
shopt -s extglob
-
# Create a pipe to read the log file a line at a time;
-
# Use mktemp for security.
-
PIPEDIR=$(mktemp -d /tmp/onlogdo.XXXXXX)
-
PIPE=“$PIPEDIR/$(echo $1 | sed ‘s#^/##; s#/#.#g’)” # var.log.messages
-
rm -f $PIPE
-
mknod $PIPE p
-
tail -Fn0 $1 >$PIPE & # FSF tail: “tail –retry -fn0”
-
TAILPID=$!
-
exec 5< $PIPE
-
# Copy the positional paramaters in to a variable that can be indexed.
-
params=(“$0” “$@”)
-
# Repeatedly read from the pipe, process each line.
-
while :; do
-
while read REPLY <&5; do
-
$ifverbose -e “\nline: \”$REPLY\”“
-
for ((i=2; i<$#; i+=2)); do
-
pattern=${params[$i]}
-
command=${params[$((i+1))]}
-
$ifverbose “pattern: \”$pattern\”“
-
if [[ -z “${REPLY##*$pattern*}” ]]; then
-
$ifverbose “*MATCHED*”
-
$ifverbose “command: \”$command\”“
-
set +o noglob # Allow pathname matching in commands
-
eval $command &
-
set -o noglob # No pathname expansion for patterns
-
fi
-
done
-
done
-
# We get here whenever the pipe first blocks (returns EOF)
-
sleep 1 # Don’t loop too quickly
-
done
-
### MAIN ROUTINE ENDS HERE ###
-
# Note: if we ever get here, the cleanup() function will be called
-
# automatically since we’re trapping on signal 0.
-
-
Syntaxe: minute : de 0 à 59 heure : de 0 à 23 jour du mois de : 1 à 31 mois de : 1 à 12 jour de la semaine : de 0 à 7, 0 et 7 étant le dimanche et ainsi de suite. commande : peut comporter plusieurs commandes. Extra: - Les mois et les jours peuvent aussi être donnés avec les abréviations anglaises :jan,feb,... et mon,tue,... - On sépare les jours, les mois par des , (virgules), par exemple pour lancer une action tous les 15 et 30 du mois tapez 15,30 à la place de jour du mois. - Le '-' signifie jusqu'à, ainsi 15-30 signifie du 15 au 30. - Le '/' permet de spécifier une répétition, */3 indique toutes les 3 minutes. - '*' peut être utilisée et indique tous les jours de semaine, tous les mois, toutes les heures. Exemples: */3 * * * * commande --> toutes les X minutes. 0 0 * * * commande --> tous les jours à minuit 30 23 */3 * * commande --> tous les 3 jours à 23h30 0 0 * * 7 commande --> tous les dimanche à minuit
“cron” related tags
spirit’s tags
access apache apache2 apt arguments auditd auth awk backup backups bandwidth bash bridge cache cd charset cisco commands conversion cron css date debian debug default diff directories directory distance dns dom du eth ethernet excel exclude files find firefox flash forms function hacks headers history hosts htaccess html http https ie ifconfig images input ip javascript jobs kill latitude linux log logging longitude mac mail maps merge monitoring mysql network nginx openssl packages performance performances perl php red hat regex restore root route rpm script security server shell ssh ssl svn switch syslog tail trunk unix virtualhost vlan vmware windows yum