1. cron、crontab命令
cron是执行定时计划任务的守护进程。
当系统是多用户运行级别时,cron进程会从/etc/init.d中自动启动。cron进程会在目录/var/spool/cron/contabs/下搜索定时计划任务文件(定时计划任务文件以创建次任务的账户名命名),并将找到的这些定时计划任务载入内存。
注意:/var/spool/cron/contabs/中的定时计划任务文件不要用文本编辑器编辑,应当使用crontab命令访问和更新它们的内容。因为crontab命令可以检查这些文件中的语法错误。
cron进程还会读取/etc/crontab以及目录/etc/cron.d下的内容。
cron进程每分钟唤醒一次,审查所有存储的定时计划任务,检查每个命令,看它是否应该在当前时间运行。
另外,cron每分钟会检查一次它的池目录/var/spool/cront/crontabs的修改时间(modtime)是否已经改变。如果修改时间已经改变,cron会检查所有定时计划任务文件的修改时间,并重新加载那些已经被修改的定时计划任务文件。因此,当定时计划任务文件被修改后,不需要重启cron守护进程。
注意:使用crontab修改定时计划任务文件时,它会更新池目录/var/spool/cront/crontabs的修改时间。
crontab命令用于创建、修改、删除和查看定时计划任务。每个用户可以使用crontab命令创建自己的定时计划任务,生成的计划任务文件将以用户的账户名命名。
定时计划任务文件由每行命令组成,每行有6个字段,由空格或制表符分隔。前五个字段表示运行任务的时间,最后一个字段是任务的命令。
前五个字段的含义依次为:
- 分钟:0~59
- 小时:0~23
- 日期:1~31
- 月份:1~12或Jan~Dec
- 星期:0~6或Sun~Sat,0表示星期日
这五个字段中还可以使用以下特殊字符描述:
- *星号:匹配所有可能的值,如“0 6 * * *”表示每天6点
- -连字符:定义一个范围,比如“0 2 ** 1-5”表示每周一到周五的凌晨2点
- /斜杠:表示每间隔多少时间,如“*/5 * * * *”表示每5分钟
- ,逗号:表示或,如“0 0,6,12,18 * * *”表示每天的0点、6点、12点和18点
$ crontab -l #使用-l选项,可以列出当前用户的所有定时计划任务,如每分钟执行一次脚本 */1 * * * * /home/user1/test/echotime.sh $ crontab -e #使用-e选项,创建或修改当前用户的定时计划任务 $ crontab -u user1 -l #使用-u选项,查看指定用户的定时任务计划 */1 * * * * /home/user1/test/echotime.sh $ crontab -r #使用-r选项,移除当前用户的定时计划任务,不经确认 $ crontab -i -r #使用-i配合-r选项,可以在移除前提示用户确认 crontab: really delete user1's crontab?
2. at命令
at命令用于安排一个任务在指定的时间运行。可以从标准输入读入命令,也可以从指定的文件中读入,然后在指定的时间运行这些命令。
语法:at [-f file] [-q queue] [OPTION] TIME [DATE]
# date # at now + 1 minutes #创建一个定时任务 at> date at> <EOT> #这里使用Ctrl+D job at [执行时间] # cat myjobs.txt /path/to/a/shell-script /path/to/any/command # at -f myjobs.txt now + 1 hour #使用-f参数,定时运行文件中的内容 job at [执行时间] # at -l #使用-l参数,列出当前用户(非root)所有使用at命令创建的还未运行或正在运行的任务,如果是root用户,列出所有用户的任务 1 2013-10-07 05:00 a root # atq #atp命令与at -l一样 # atrm 1 #通过-l列出的任务编号,删除现有的任务
注:上述命令未尝试
3. &控制操作符
字符“&”是Bash内置的用于并行处理进程的一个控制操作符。在命令末尾添加&会在后台运行该命令,将在当前的Shell进程下启动一个子Shell进程,因此当该命令在后台运行时,可以继续在此终端输入并运行其他命令。
语法:command &或script-name &
$ sleep 10 & #将命令放到后台执行 [1] 29281 #显示这个后台任务的编号(1)及其对应的子进程号(29281) $ jobs #使用jobs命令,可以查看后台正在运行的任务的信息 [1]+ Running sleep 10 & #正在运行 $ jobs #再次使用jobs命令查看 [1]+ Done sleep 10 #结束 $ jobs -l #jobs命令使用-l选项,可以列出后台正在运行的任务的进程号等信息 [2]+ 32203 Running sleep 10 & #这里的任务编号是2 $ %2 #使用%+通过jobs查到的任务编号,将指定的任务放到前台运行,并作为当前运行的任务 sleep 10 $ fg 2 #使用fg命令+通过jobs -l查到的任务编号,将指定的任务放到前台运行,并作为当前运行的任务 sleep 10 $ sleep 30 & #后台运行 [3] 5045 $ fg 3 #使用fg命令放到前台运行 sleep 30 ^C #这里输入Ctrl+Z将任务挂起 $ bg 3 #使用bg命令将任务重新放到后台运行 [3]+ sleep 30 & $ jobs -l [3] 5045 Running sleep 30 &
4. nohup命令
nohup命令让你运行的命令或脚本在你退出系统后继续在后台运行。
语法:nohup COMMAND [ARG]... &
COMMAND:Shell脚本或命令的名称
[ARG]:脚本或命令的参数
&:nohup命令不能自动地将任务放在后台运行,必须明确的使用&操作符
$ nohup ./echotime.sh & #使用nohup命令运行一个脚本 [1] 5327 #这里输出任务编号(1)和后台任务的进程号(5327) $ nohup: ignoring input and appending output to 'nohup.out' #输出一行信息,表示脚本运行输出的所有内容都被写入到当前目录下的文件nohup.out中 $ ps -ef|grep 5327 #当退出系统再重新登录后,还可以查看正在运行的脚本
本节结束