Professional Documents
Culture Documents
Faq
Faq
Faq
Fcron documentation
Prev Chapter 2. Using fcron ... Next
_______________________________________________________________________
2.2.4. How can I prevent fcrontab from considering the first "word" of
my command line as a user name i.e. "runas(word)"?
First, you must understand that fcron determines, for each job, its
next time and date of execution. It then determines which of those jobs
would be the next to run and then, sleeps until that job should be run.
In other words, fcron doesn't wake up like Vixie cron each minute to
check all job in case one should be run ... and it avoids some problems
associated with clock adjusts.
This means that if the new time value is set into the past, fcron won't
run a particular job again. For instance, suppose the real time and
system clock are 3:00, so the next job cannot be scheduled to run
before 3:00, as it would have already been run and re-scheduled.
First, suppose you set your system clock into the past, say to 2:00,
Presuming that the last run was shortly before 3:00. then fcron will
sleep until the next job should be executed. The execution time for a
job is determined by identifying the last time that the job ran and
computing the next scheduled time. This means that the next scheduled
time must be on or after 3:01. Therefore, in this example, fcron will
not run a job for at least one hour.
Next, if you set the system time into the future, say to 4:00, fcron
will run every job scheduled between the old and the new time value
once, regardless of how many times it would have been scheduled. When
fcron wakes up to run a job after the time value has changed, it runs
all the jobs which should have run during the interval because they are
scheduled to run in a past time.
As special case is when "@xxx" style scheduling rules are involved, you
must consider the "adjustment-interval". The "adjustment-interval" is
the time difference between the original system time and the new system
time. The concerned jobs will run at "adjust-interval" too early or too
late depending of the nature of the adjust.
To conclude, fcron behaves quite well for small clock adjusts. Each job
which should have run does so once, but not exactly at the correct time
as if the job were scheduled within the adjustment interval. But, if
you have to make a big change in the time and date, you should probably
reset all the scheduled "nextexe" by running "fcrontab -z" on all the
fcrontabs.
There are two types of daylight saving time change: the remove-one-hour
change (for instance, "at 3:00, it will be 2:00"), and the add-one-hour
one (for instance, "at 2:00, it will be 3:00"). In both cases, fcron
will run the job only once (more precisely, it won't run the job twice
as many as it should have).
In the first case, the official time changes as follow (in order of
real chronological time): [x, 2:00] -> i1: [2:00, 3:00] -> i2: [2:00,
3:00] -> [3:00, y]. i1 and i2 are the names of the two intervals [2:00,
3:00]. For this kind of DST change, a job which should run between 2:00
and 3:00 will run either in i1 or in i2, but not both. Consequently, a
job scheduled to run every day at 2:30 (for instance) will be run only
once. There is no way for a user to know if the job will be run in i1
or i2.
In the second case, there is a gap in time: the official time changes
as follow (in order of real chronological time): [x, 2:00] -> [3:00,
y]. A job scheduled between 2:00 and 3:00 will get run once, and only
once, even if it should have been run several times. For instance, a
job which should have run every 10 minutes will run only once, not 6
times, between 1:59 and 3:01. A job scheduled to run at 2:xx will run
at 3:xx. For instance, if a job is scheduled to run every day at 2:30,
it will run at 3:30 the day of this kind of DST change.
2.2.3. What about fcron and software suspend (aka. suspend to RAM, to disk)?
We suppose here that you are using swsusp and the hibernate script to
do a "suspend to disk", but it should be similar with other methods.
When you switch on your computer after a suspend to disk, the system
time will be incorrect, and will then be corrected by the hibernate
script. Before it is corrected, fcron may compute the time and date of
the next execution of a job: the computation would then be incorrect
(please see the entry about system clock adjustment in the present
FAQ).
So you should have the hibernate script stop fcron before the suspend,
and then restart it when the system is switched on, ie. put a line like
"RestartServices fcron" in your hibernate.conf file. That way, the
system time will always be correct when fcron runs (assuming that fcron
is started after the system time is corrected).
2.2.4. How can I prevent fcrontab from considering the first "word" of my
command line as a user name i.e. "runas(word)"?
Suppose you have an user called "echo" (weird idea ... :)) ). If you
use the line '* * * * * echo "Hello!"' in root's fcrontab, "echo" will
be interpreted as "runas(echo)".
will work as expected as quotes are allowed for the shell command but
not for the user name.
2.2.5. I have a job which usually terminates with a non-zero status. When it
does, I receive a email with the exit status even if the command had no
output. How can I avoid the email?
You could disable email entirely by setting the "mail" option to "no".
But, if you still want to receive the standard output as email, you can
add an command which always evaluates to 0, like "/bin/true", after
your primary command. This will not affect your job nor create
additional output. For example:
* * * * * /a/non/zero/status/job ; /bin/true
The "/proc/loadavg" file provides loadavg values. These values are (in
order): the system load averages for the past 1, 5, and 15 minutes; a
count of the (active tasks/active processes); the pid of last process
run;
You can use pipes with "fcrontab -l" (list the fcrontab) and "fcrontab
-" (read the new fcrontab from input). For example:
echo -e "`fcrontab -l | grep -v exim`\n0 * * * * /usr/sbin/exim -q" | fcr
ontab -
can be used to add a line. Another way to do it would be to: list the
fcrontab settings into a temporary file ("fcrontab -l > tmpfile");
modify the temporary file ("echo $LINE >> tmpfile"); replace the
original fcrontab by the temporary; and finally, remove the temporary
file ("fcrontab tmpfile ; rm -f tmpfile").
2.2.8. Can I use fcron from time to time, for instance in a script?
Let's suppose you use fcron in your ppp-up script. Fcron can permit you
to run some jobs at connection startup, but not at each connection,
like it would be if the job was run directly by the ppp-up script: for
instance, only once every week.
Example 2-5. Using fcron in a script: running a job once every day,
week, etc, at dialup connection
You can also use fcron to run some jobs until the end of the
connection. For instance, you can make fetchmail retrieve emails more
often during connection: we suppose that it is configured to retrieve
mails every hour, which launches a dialup connection if necessary, and
we want it to check for mails every 5 minutes while connected.
Example 2-6. Using fcron in a script: running a job until the end of
the connection
ppp-up script:
# A ppp-up script ...
# run fcron at the beginning of the connection:
fcron -b
ppp-down script:
# A ppp-down script ...
# stop fcron at the end of the connection:
# -- Warning: killall may have unwanted effect on non linux systems --
killall -TERM fcron
the fcrontab:
# a fcrontab file ...
@volatile,first(0) 5 fetchmail
Yes, you can. To do that, see the following instructions, but please
note that fcrondyn currently does *not* work without root privileges.
Warning
This option allows a non privileged user to run fcron. When used, fcron
does not change its rights before running a job (i.e., if joe runs
fcron, every job will run as joe). It means that YOU SHOULD NOT RUN
FCRON AS A PRIVILEGED USER WHEN COMPILED WITH THIS OPTION or you'll
have a serious security hole.
As far as I know, fcron supports Vixie cron's crontab syntax fully. You
should be able to use a crontab with fcron with no modification (if not
please contact me at <fcron@free.fr>).
# Run once a day/week/month, and ensure only one of those tasks is run at a time
:
!reset
!serial,nice(10)
%daily * * run-parts --report /etc/cron.daily
%weekly * * run-parts --report /etc/cron.weekly
%monthly * * * run-parts --report /etc/cron.monthly
# Only run the tasks out of office-hours when the system load is low
# and send an email to the user if fcron couldn't run the job:
!reset
!serial,lavg(0.5,1,1.5),noticenotrun,nice(10),mailto(admin@yourdomain.com)
%daily * 0-9,18-23 run-parts --report /etc/cron.daily
%weekly * 0-9,18-23 run-parts --report /etc/cron.weekly
%monthly * 0-9,18-23 * run-parts --report /etc/cron.monthly