Unix系統提供了cron和at命令,使系統和用戶可以定時運行一定的程序,而不需手工啟動。
使用cron用於周期性的執行一個命令,為了使用它,必須編輯crontab文件。系統缺省的/etc/crontab 文件為:
# /etc/crontab - root's crontab for FreeBSD
#
# $Id: crontab,v 1.13 1996/01/06 22:21:37 ache Exp $
# From: Id: crontab,v 1.6 1993/05/31 02:03:57 cgd Exp
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
#
#minute hour mday month wday who command
#
*/5 * * * * root /usr/libexec/atrun
#
# rotate log files every hour, if necessary
0 * * * * root /usr/sbin/newsyslog
#
# do daily/weekly/monthly maintenance
0 2 * * * root /etc/daily 2>&1 | sendmail root
30 3 * * 6 root /etc/weekly 2>&1 | sendmail root
30 5 1 * * root /etc/monthly 2>&1 | sendmail root
#
# time zone change adjustment for wall cmos clock,
# does nothing, if you have UTC cmos clock.
# See adjkerntz(8) for details.
1,31 0-4 * * * root /sbin/adjkerntz -a
在這個crontab文件中首先設置了幾個環境變量,cron執行這個文件時先設置這些環境變量,然後按照每列規定的時間來執行相應的命令。第一列為分鐘,規定每小時的第幾分執行相應的程序,第二列為每天第幾小時執行程序,,第三列為每月的第幾天,第四列為第幾周,第五列為每周的第幾天,第六列為執行該文件的用戶身份,第七列為要執行的命令。
普通用戶也可以使用crontab命令來創建和維護自己的crontab文件。由於是用戶不能更改執行程序的標識的,因此用戶的crontab就不需第六列──執行程序的用戶身份,而只要直接跟隨要執行的命令。使用 “crontab -e” 命令,使用編輯器按照相應的格式編輯自己的crontab文件,或者使用 “crontab -l ” 列出現有crontab文件的內容,當然只有root用戶才能查看其他用戶的crontab文件:
$ crontab -l
12 0 * * * /home/wb/bin/getfiles
所有用戶的crontab設置文件都放在/var/cron/tabs目錄下,文件名與每個用戶的用戶名相同。cron中的命令執行結果將被系統使用mail寄給每個用戶。在/var/cron目錄下還有crontab執行的記錄文件,系統管理員可以按照這個文件來檢查系統安全性,檢查是否有影響系統安全的程序被執行。
與cron不同,at命令用於在一定的時間後或在一定的時刻執行設置好的命令。at命令使用一個時間參數表示何時執行命令,然後就從標准輸入中讀入要執行的命令,此時就如同在shell下操作一樣輸入要執行的命令,最後使用^D 退出輸入命令的模式。用戶不必擔心真正執行命令時是否能夠找到正確的程序,at會將當前shell的設置,包括環境變量,保留起來,以便在執行命令時創造一個與啟動at時完全相同的執行環境。
$ at 1:00am +2days
^D
上面命令將在兩天後的凌晨1:00時啟動進程下載文件,當然at命令並不是十分精確,其執行時間只是表示大概時間,可能與標准時間存在一兩分鐘的差異。at也支持各種復雜的時間表示方法,可以使用hhmm,hh:mm,或者加上am或pm結尾的12小時制方式。還可以使用年月日,規定程序運行的日期:
$ at 1:00am Mar 5
echo Hello | mail root
^D
Job 5 will be executed using /bin/sh
$ atq
Date Owner Queue Job#
01時00分00秒 00/03/05 root c 5
$ atrm 5
用戶的at程序執行結果也被系統郵寄給該用戶,用戶可以使用mail來查看程序的輸出結果或執行錯誤。當用戶啟動at命令之後,可以使用atq命令來查看自己還沒有執行的at命令,如果atq是由root執行,則將列出系統中所有沒有執行的at命令。然後可以使用atrm命令根據atq輸出Job號來刪除at作業。
系統使用/var/at/at.allow和/var/at/at.deny文件來配置可以使用at命令的用戶,和不可以使用at命令的用戶。其中at.allow的優先權更高,如果存在at.allow,就只允許這個文件中列出的用戶使用at,而不考慮任何不在這個文件中列出的用戶。因此可以使用一個空at.allow文件禁止所有用戶使用at。當不存在at.allow文件的時候,那麼凡不在at.deny文件中列出的用戶都可以使用at。