Chapter 8

Automating tasks: the system never sleeps
 

 
 
In this chapter:
 
 
* Manipulating cron to schedule recurring tasks
* Handy tools that ease system maintenance
* SuSE's default maintenance tasks
* Scheduling one-time jobs with the at command
 
 
 
Unix administration is often a complex task because many functions require regular, ongoing attention. Some examples are log files that may become too cumbersome and need to be compressed or deleted, system databases (that is, for locate or the man page index) that require regular updates, or files that need to be cleaned up. Most of these can be handled automatically by creating scripts that perform prescribed maintenance tasks.
 
The at daemon atd can be used to start a job once at a specified time. This is not as useful as having regularly scheduled maintenance, but it may be useful for unique tasks that you have to deal with. SuSE Linux, like most (if not all) Unix systems, employs the cron daemon to do just this -- schedule special tasks at given intervals. This chapter shows how cron works, which tasks are predefined by SuSE, and how to add new tasks to the cron scheduling mechanism. A short section covers the atd command and how to get jobs executed at later time.
8.1 Using cron to automate tasks
 


 
The cron daemon is a system service that runs scripts or single commands at a given interval. It is available to root and every user on the system. In addition to user-specified tasks, system tasks can be scheduled by running cron.
 
Pay attention to the man behind the curtain: Each user sets up a crontab file that specifies which jobs should be executed at a designated time. A crontab file contains instructions to the cron daemon in this format: run-this-command-at-this-time-on-this-date. Commands in any given crontab will be executed as the user who owns the crontab.
 

8.1.1 The crontab's format
 

In the crontab, blank lines, leading spaces, and tabs are ignored. Lines whose first nonspace character is a hash mark (#) are read as comments and are ignored. Note that comments are not allowed on the same line as the cron command because they will be taken as part of the command. Similarly, comments are not allowed on the same line as environment variable settings.
 
An active line in a crontab will be either an environment setting or a cron command. An environment setting follows this format:
 

 
name = value 
 
 
The value string may be placed in quotation marks (single or double, but must remain consistent) to preserve leading or trailing blanks. The environment variables may be used in the cron commands. The cron daemon predefines the variables LOGNAME (user name), HOME (the user's home directory), and SHELL (the user's login shell). The output of the commands is sent to the user by E-mail. If the variable MAILTO is defined (and not empty), mail is sent to the user indicated. If MAILTO is defined but empty ( MAILTO=""), no mail will be sent.
 
The command lines have five time and date fields, followed by a command. Commands are executed by cron when the minute, hour, and month of year fields match the current time, and when at least one of the two day fields (day of month or day of week) matches the current time.
 
The cron daemon examines cron entries once every minute. The time and date fields are displayed in Table 8-1 .
 
 
Table 8-1 Valid time and date specifications for cron
 
Field Allowed values
minute 0-59
hour 0-23
day of month 0-31
month 0-12 (or names; see below)
day of week 0-7 (0 or 7 is Sun, or use names)
  A field may be an asterisk (*), which always stands for first to last. A range of numbers is allowed. Ranges are two numbers separated by a hyphen. The specified range is inclusive. For example, 8-11 for an hour's entry defines command execution at hours 8, 9, 10, and 11.
 
Lists are also legal. A list is a set of numbers (or range of numbers) separated by commas. For example: 1,2,5,9,0-4,8-12.
 
Step values can be used in conjunction with ranges. Following a range with /number specifies that alternating numerical values in the range can be used. For example, 0-23/2 can be used in the hour field to specify command execution every other hour. Steps are also permitted after an asterisk, so if you want to say every two hours, just use */2.
 
Names can be used for the month and day-of-week fields. Use the first three letters of the desired day or month (the case is unimportant). Ranges or lists of names are not allowed in this instance.
 
The rest of the line specifies the command to be run. The entire command portion of the line, up to a newline or percent (%) character, will be executed by the shell specified in the SHELL variable. Percent signs (%) in the command, unless escaped with a backslash, will be changed into newline characters, and all data after the first % will be sent to the command as standard input.
 
The day of a command's execution can be specified by two fields: day-of-month and day-of-week. If both fields are restricted (that is, aren't *), the command will be run when either field matches the current time. For example, 30 4 1,15 * 5 would initiate a command to run at 4:30 a.m. on the 1st and 15th of each month, as well as every Friday. As an example, crontab could look like this:
 
 
# use /bin/sh to run commands, no matter what the login shell is 
SHELL=/bin/sh 

 
# run five minutes after midnight every day and ignore the output 5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
 
# Don't forget about the Bay Area Linux User Group meeting # every second thursday of the month 0 10 8-14 * tue mail -s "BALUG meeting" $LOGNAME%BALUG meeting tonight at 7pm
 
 
8.1.2 Installing a user crontab
 

User crontabs are stored in /var/cron/tabs/ and are named after the user's login name. However, you should never edit these files directly. The command to edit, install, list, or delete a crontab is crontab. The crontabs can be edited by users, but only root is allowed to edit crontabs for other users. The command crontab follows the arguments shown in Table 8-2 .
 
 

Table 8-2 Parameters of the crontab command
 
Parameter Meaning
-u user Name of the user whose crontab is to be altered (only root can use this feature)
-l Displays the current crontab on standard output
-r Removes current crontab
-e Edits the current crontab
  So to create or edit a crontab, just call crontab -e. This will start the editor specified in the VISUAL or EDITOR environment variable (defaults to vi, if both are undefined) and will present your installed crontab, or an empty buffer if you call it for the first time. After the user exits the editor, the new crontab will be installed in the proper directory and the specified jobs will be executed at the scheduled times.
 
8.1.3 The system crontab
 

In addition to individual user's crontabs, there is a central crontab for system administration. This crontab is stored in the file /etc/crontab. The syntax is almost the same as that for altering user crontabs. The only exception is that there is an additional column that allows root to specify with which user's permissions a job request will be issued. The name of the user belongs between the time/date fields and the command:
 

 
minute hour day-of-month month day-of-week user command 
 
 
You can of course use the root crontab to do most of the maintenance tasks, too. Certain jobs104 require the use of a special user ID; that is, expiring news has to be performed as user news, and some UUCP-related tasks are easily ruined if they are not performed as user uucp. Rather than switch user IDs with the su command in the root crontab, you can specify the user in the system crontab, which is more convenient and easier to read. SuSE uses /etc/crontab to start up a range of useful scripts, as you can see in the next section.
 
8.2 Standard maintenance tasks set up by SuSE
 

As we've said,cronis a perfect tool to ease administrative tasks that need to be taken care of on a regular basis. SuSE has done a good job of providing a set of scripts for the most important tasks. All of these scripts are scheduled by the system crontab in /etc/crontab. SuSE also implemented an add-on mechanism that makes adding or removing jobs even easier.
 
This works with a subdirectory within /etc that sets scripts to be executed every hour, day, week, or month, as shown in Table 8-3 . Every script within these directories will be executed once in the specified time frame.
 
 

Table 8-3 Directories for regular run scripts
 
Directory Schedule
/etc/cron.hourly/* run every hour
/etc/cron.daily/* run once a day
/etc/cron.weekly/* run once a week
/etc/cron.monthly/* run once a month
  SuSE provides the script aaa_base, which is run once a day. It uses several settings from /etc/rc.config and performs the tasks described in the following sections.
 
8.2.1 Log files are checked for size, ownership, and permission
 

The file /etc/logfiles contains a list of various log files and their maximum size, permission levels, and ownership information. Each of these files will be reviewed. If a file's size is greater than the allowed maximum size, the file will be compressed and moved to a backup copy named filename-date.gz. If the permissions or the ownership is different than specified, this will be reconciled. A notice is sent to root if a backup copy has been made or if ownership or permission information has been revised.
 
You can add files to the list. Edit the file /etc/logfiles and add one line per file to be checked:

 
Filename maximum-size permissions owner.group 
 
 
The filename may include wildcards. The maximum size must be prefixed with a plus sign (+) and have a lowercase k to indicate that it's given in kilobytes. The permissions are given in octal notation, and the owner and group names can be written either as user/group IDs or names.
 
Only if the value of MAX_DAYS_FOR_LOG_FILES in rc.config is greater than zero will the log file check be performed. Backup copies of log files will be removed after the number of days in MAX_DAYS_FOR_LOG_FILES has been reached. With this scheme, you can make sure that log files don't get too big. If they do, they'll be compressed and stored for a period of time, in case you need to review them. After the save period, the backups will be removed so that your hard drive doesn't become filled with old and often useless information.
 
8.2.2 Old files in various locations are removed
 

If the value of MAX_DAYS_IN_TMP (also set in /etc/rc.config like all other variables mentioned in this section) is not zero, all files in the directories specified in TMP_DIRS_TO_CLEAR will be removed when they are older than the number of days specified. Files owned by users listed in OWNER_TO_KEEP_IN_TMP won't be removed.
 
This feature is disabled by default; (MAX_DAYS_IN_TMP is set to 0).
 
Old YaST log files will be removed after MAX_DAYS_FOR_LOG_FILES days has been reached.
 
Preformatted versions of man pages will be removed after the default period -- 7 days -- if DELETE_OLD_CATMAN is set to yes. The length of time that you can keep man pages can be modified simply by setting CATMAN_ATIME to the number of days you want to retain these files.
 

8.2.3 System databases are updated and/or backed up
 

Some databases need to be updated on a regular basis. The database for the command locate andthe man page index are regenerated each day. This will be done only if RUN_UPDATEDB is yes. The locate database will contain information only about files in directories not listed in UPDATEDB_PRUNEPATHS. It will run as the user given in RUN_UPDATEDB_AS. By default, no NFS mounted directories will be included. However, if you like to have information about these directories, you can list them in UPDATEDB_NETPATHS.
 
The search will be done with the permissions of the user whose ID is listed in UPDATEDB_NETUSER.
 
All these variables are used to increase security. Because locate can be used by anyone on the system, you want to make sure that sensitive information is excluded from its database.
 
If the RPM database has changed since the last run, a backup will be created. If the original database is corrupted, this will allow you to recover data.
 

8.2.4 Core files are searched for
 

Core files are usually created when an application crashes. They can be used to debug the application because they represent a memory dump of the application at the moment of the crash.
 
But if you are not in the process of debugging the application, core files are almost useless. This is why all users receive a notice about core files they own. All core files older than MAX_DAYS_FOR_CORE are reported to the user. They will automatically be deleted when172 DELETE_OLD_CORE is set to yes.
 

8.2.5 CMOS battery is checked
 

If possible, the system checks the life of the battery that keeps the CMOS fresh when the system is turned off. A warning will be sent to root if a problem has been detected.

8.2.6 /root/bin/cron.daily.local is started
 


 
If the file /root/bin/cron.daily.local exists, it will be executed right after aaa_base is done. You can add your own cleanup or maintenance routines here.
 
This script is executed daily, usually at night. If you turn your machine off overnight, it'll be run shortly after you reboot.
 

8.3 Adding customized tasks
 

If you have some system-wide task you need to set to run every hour, day, week, or month, simply write a script to perform the task and put it in the appropriate directory, as shown in Table 8-3.
 
For user-specific tasks, implement user crontabs such as those described previously.
 

8.4 Executing a job once at a specified time
 

After cron, next in importance is at, another service that schedules jobs at a given time. The difference is that cron executes jobs repeatedly, whereas at executes them once and at a specified time.
 
The at service allows fairly complex time specifications. It accepts times formatted as HH:MM (two-digit hour specification, followed by a colon and a two-digit minute specification) to run a job at a specific time of day. (If that time is already past, it is assumed that the job is to be run the following day.) You may also specify midnight, noon, or tea time (4 p.m.), and you can have a time-of-day suffixed with AM or PM for running in the morning or the evening. You can also state what day the job will be run by giving a date in the form month-name day with an optional year, or giving the date in the form MMDDYY, or MM/DD/YY, or DD.MM.YY. When specifying the date, you must follow by specifying the time-of-day. You can also give times such as now +count time-units, where the time-units can be minutes, hours, days, or weeks. You can tell at to run the job today by suffixing the time with today and run the job tomorrow by suffixing the time with tomorrow.
 
For example, to run a job at 4 p.m. three days from now, you would enter:
 

 
at 4pm + 3 days 
  To run a job at 10 a.m. on July 31, you would enter:
 
 
at 10am Jul 31 
 
 
and to run a job at 1 a.m. tomorrow, you would state:
 
 
at 1am tomorrow 
 
 
After you call at, it will prompt you for the command to run at this time. The output of this command, or list of commands, will be mailed to the user who spooled the job. Say that you want to impress your boss by sending him or her an e-mail message really early in the morning, to make him or her think you started working early. You could do this by spooling an at job for 6 a.m. the next day:
 
 
at 6am tomorrow 
at> echo "Hi, you want coffee?" | mail -s "Coffee?" boss@work.com 
 
 
You can list the spooled jobs with atq and remove them with atrm job-number. Other features of at include handling several queues and fixing the execution of the job dependent on the system load. Review the man page at(1) for more details. The at service is seldom used, so this short overview will do for most uses.
 
 
Summary:
  Thecronservice can be used to schedule jobs on a regular basis. Every user can enter jobs into this scheduling mechanism. SuSE sets up some standard tasks that are executed once a day to perform maintenance, such as compressing log files and keeping the system clean.
 
SuSE also added a mechanism that makes it easy to schedule jobs every hour, day, week, or month, just by putting a script into a specific directory in /etc.
 
In addition to cron, the at command is available to schedule a job once at a given time.
 
--
Back Up Contents Next
--

Copyright (c) 1999 by Terrehon Bowden and Bodo Bauer
To contact the author please sent mail to bb@bb-zone.com