shell 编程--ch03 后台执行命令
时间:2006-03-29 来源:alphix
ch03 后台执行命令
内容提要:
[*]设置crontab,并提交作业.
[*]设用at命令来提交作业
[*]在后台提交作业
[*]使用nohup命令提交作业 名词解释:
cron : 系统调度进程.可以使用它在每天的非高峰负荷时间运行作业.
At : at命令.使用它在一个特定的时间运行一些特殊的作业.
& : 使用它在后台运行一个占用时间不长的进程
Nohup : 使用它在后台运行一个命令,即使在用户退出时也不受影响 3.1 cron和crontab
cron是系统主要的调度进程.可以在无需人工干预的情况下运行作业.有一个叫做crontab的
命令允许用户提交,编辑和删除相应的作业.每个用户都可以有一个crontab文件来保存调度信息.
可以使用它运行任意一个shell脚本或某个命令.可以在定制的时间间隔(一周,一天,一小时等)
运行一次.在一个大型的系统中,系统管理员一般会禁止这些文件,而只在整个系统保留一个这样的
文件.系统管理员是通过cron.deny和cron.allow这两个文件来禁止和允许用户拥有自己的crontab
文件. 3.1.1 crontab的域
crontab文件的格式:
第一列: 分钟1~59
第二列: 小时1~23(0表示子夜)
第三列: 日1~31
第四列: 月1~12
第五列: 星期0~6(0表示星期日)
第六列: 要运行的命令
下面是crontab的格式:
分<>时<>日<>月<>星期<>命令
注:<>表示空格
在这些域中,可以用横杠"-"来表示一个时间范围,例如你希望在周一到周五运行某个作业,那么可以
在星期域使用1-5来表示.
还可以在这些域中使用逗号",",例如你希望星期一和星期四运行某个作业,可以在星期域使用1,4表
示.
可以用星号"*"来表示连续的时间段.如果你希望对某个表示时间的域没有特别的限定,也应该填入*
该文件所有注释行要在行首用#表示.
3.1.2 crontab条目举例
#每晚的21:30运行/apps/bin目录下的cleanup.sh
30 21 * * * /apps/bin/cleanup.sh #每月1,10,20日的4:45运行/app/bin目录下的backup.sh
45 4 1,10,22 * * /apps/bin/backup.sh #每周六,周日的1:10运行一个find命令
10 1 * * 6,0 /bin/find -name "core" -exec rm {} \; #每天18:00至23:00之间每隔30分钟运行/apps/bin目录下的dbcheck.sh
0,30 18-23 * * * /apps/bin/dbcheck.sh 3.1.3 crontab 命令选项
crontab命令的一般形式:
crontab [-u user] -e -l -r
参数:
-u : 用户名
-e : 编辑crontab文件
-l : 列出crontab文件中的内容
-r : 删除crontab文件
如果使用自己的名字登陆,就不用使用-u选项,因为在执行crontab命令时,该命令能够知道当前用户 3.1.4
在向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR.编辑$HOME下
的.profile文件,在其中加入一行:
EDITOR=vi; export EDITOR
保存并退出.
创建一个名为<user>cron的文件,其中<user>为用户名,例如:davecrn.在该文件中加入如下内容。
# (put your own initials here echo the date to the console every
# 15 minutes between 6pm and 6am
0,15,30,45 18-06 * * * /bin/echo `date` >/dev/console
为提交你刚刚创建的crontab文件,可以把这个新创建的文件作为corn命令的参数:
$ crontab davecron 3.1.5 列出crontab文件
$ crontab -l
3.1.6 编辑crontab文件
$ crontab -e
这里将使用环境变量中制定的文本编辑器对crontab文件进行编辑。
3.1.7 删除crontab文件
$ crontab -r 3.2 at命令
at命令允许用户向cron守护进程提交作业,使其在稍后的时间运行。如果你希望在1个月或更长的时间
以后运行,最好还是使用crontab文件。
和crontab一样,根用户可以通过/etc目录的at.allow和at.deny文件控制那些用户可以使用at命令,那些用户不行。
at命令的基本形式:
at [-f script] [-m -l -r] [time] [date]
参数:
-f script 是所要提交的脚本或命令。
-l 列出当前所有等待的作业。atq命令有相同的功能
-r 清除作业。必须提供相应的作业标识(ID)
-m 作业完成后给用户发邮件。
time at命令的时间格式非常灵活;可以是H、HH.HHMM、HH:MM或H:M,其中H和M代表小时和分钟。还可以是a.m.或p.m.
date 日期格式可以是月份数或日期数,而且at命令还能识别诸如today、tomorrow这样的词。 3.2.1 用at命令提交命令或脚本
at命令行方式:
$ at 21:10
at> find / -name "passwd" -print
at> <EOT>
warning: commands will be executed using /bin/sh
job 1 at 1999-05-05 21:10
其中:<EOT>就是<ctrl-D> 向at命令提交一个shell 脚本,使用其命令行方式即可。
$ at 3.00pm tomorrow -f /apps/bin/db_table.sh
warning: commands will be executed using /bin/sh
job 1 at 1999-05-06 15:00 $ echo find /etc -name "passwd" -print | at now +1 minute 3.2.2 列出所提交的作业
$ at -l
3.2.3 清除一个作业
命令格式:atrm [job No.] 或at -r [job No.]
例如:
$ atrm job 2
清除列表中的第二个作业。
3.3 &命令
可以使用&命令把作业放到后台执行
命令的一般形式:command &
注意:需要用户交互的命令不要放在后台执行。
后台运行的作业同样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的屏幕输出,最好使用下面的命令将它的输出重定向到一个文件中
command > out.file 2>&1 & 3.3.1 向后台提交命令
$ find /etc -name "srm.conf" -print >find.dt 2>&1 &
[1] 27015
命令提交成功,系统给出它的进程号27015
3.3.2 用ps命令查看进程
$ ps x|grep 28305
$ ps ef | grep 28305
记住:在用ps命令列出进程时,他无法确定进程是在前台还是在后台运行。
3.3.3 杀死后台进程
使用kill命令:kill -signal [process_number] 3.4 nohup命令
如果你正在运行一个进程,而且你觉得在退出账户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出账户之后继续运行相应的程序。
命令:nohup command &
$ nohup command > myout.file 2>&1
[*]设置crontab,并提交作业.
[*]设用at命令来提交作业
[*]在后台提交作业
[*]使用nohup命令提交作业 名词解释:
cron : 系统调度进程.可以使用它在每天的非高峰负荷时间运行作业.
At : at命令.使用它在一个特定的时间运行一些特殊的作业.
& : 使用它在后台运行一个占用时间不长的进程
Nohup : 使用它在后台运行一个命令,即使在用户退出时也不受影响 3.1 cron和crontab
cron是系统主要的调度进程.可以在无需人工干预的情况下运行作业.有一个叫做crontab的
命令允许用户提交,编辑和删除相应的作业.每个用户都可以有一个crontab文件来保存调度信息.
可以使用它运行任意一个shell脚本或某个命令.可以在定制的时间间隔(一周,一天,一小时等)
运行一次.在一个大型的系统中,系统管理员一般会禁止这些文件,而只在整个系统保留一个这样的
文件.系统管理员是通过cron.deny和cron.allow这两个文件来禁止和允许用户拥有自己的crontab
文件. 3.1.1 crontab的域
crontab文件的格式:
第一列: 分钟1~59
第二列: 小时1~23(0表示子夜)
第三列: 日1~31
第四列: 月1~12
第五列: 星期0~6(0表示星期日)
第六列: 要运行的命令
下面是crontab的格式:
分<>时<>日<>月<>星期<>命令
注:<>表示空格
在这些域中,可以用横杠"-"来表示一个时间范围,例如你希望在周一到周五运行某个作业,那么可以
在星期域使用1-5来表示.
还可以在这些域中使用逗号",",例如你希望星期一和星期四运行某个作业,可以在星期域使用1,4表
示.
可以用星号"*"来表示连续的时间段.如果你希望对某个表示时间的域没有特别的限定,也应该填入*
该文件所有注释行要在行首用#表示.
3.1.2 crontab条目举例
#每晚的21:30运行/apps/bin目录下的cleanup.sh
30 21 * * * /apps/bin/cleanup.sh #每月1,10,20日的4:45运行/app/bin目录下的backup.sh
45 4 1,10,22 * * /apps/bin/backup.sh #每周六,周日的1:10运行一个find命令
10 1 * * 6,0 /bin/find -name "core" -exec rm {} \; #每天18:00至23:00之间每隔30分钟运行/apps/bin目录下的dbcheck.sh
0,30 18-23 * * * /apps/bin/dbcheck.sh 3.1.3 crontab 命令选项
crontab命令的一般形式:
crontab [-u user] -e -l -r
参数:
-u : 用户名
-e : 编辑crontab文件
-l : 列出crontab文件中的内容
-r : 删除crontab文件
如果使用自己的名字登陆,就不用使用-u选项,因为在执行crontab命令时,该命令能够知道当前用户 3.1.4
在向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR.编辑$HOME下
的.profile文件,在其中加入一行:
EDITOR=vi; export EDITOR
保存并退出.
创建一个名为<user>cron的文件,其中<user>为用户名,例如:davecrn.在该文件中加入如下内容。
# (put your own initials here echo the date to the console every
# 15 minutes between 6pm and 6am
0,15,30,45 18-06 * * * /bin/echo `date` >/dev/console
为提交你刚刚创建的crontab文件,可以把这个新创建的文件作为corn命令的参数:
$ crontab davecron 3.1.5 列出crontab文件
$ crontab -l
3.1.6 编辑crontab文件
$ crontab -e
这里将使用环境变量中制定的文本编辑器对crontab文件进行编辑。
3.1.7 删除crontab文件
$ crontab -r 3.2 at命令
at命令允许用户向cron守护进程提交作业,使其在稍后的时间运行。如果你希望在1个月或更长的时间
以后运行,最好还是使用crontab文件。
和crontab一样,根用户可以通过/etc目录的at.allow和at.deny文件控制那些用户可以使用at命令,那些用户不行。
at命令的基本形式:
at [-f script] [-m -l -r] [time] [date]
参数:
-f script 是所要提交的脚本或命令。
-l 列出当前所有等待的作业。atq命令有相同的功能
-r 清除作业。必须提供相应的作业标识(ID)
-m 作业完成后给用户发邮件。
time at命令的时间格式非常灵活;可以是H、HH.HHMM、HH:MM或H:M,其中H和M代表小时和分钟。还可以是a.m.或p.m.
date 日期格式可以是月份数或日期数,而且at命令还能识别诸如today、tomorrow这样的词。 3.2.1 用at命令提交命令或脚本
at命令行方式:
$ at 21:10
at> find / -name "passwd" -print
at> <EOT>
warning: commands will be executed using /bin/sh
job 1 at 1999-05-05 21:10
其中:<EOT>就是<ctrl-D> 向at命令提交一个shell 脚本,使用其命令行方式即可。
$ at 3.00pm tomorrow -f /apps/bin/db_table.sh
warning: commands will be executed using /bin/sh
job 1 at 1999-05-06 15:00 $ echo find /etc -name "passwd" -print | at now +1 minute 3.2.2 列出所提交的作业
$ at -l
3.2.3 清除一个作业
命令格式:atrm [job No.] 或at -r [job No.]
例如:
$ atrm job 2
清除列表中的第二个作业。
3.3 &命令
可以使用&命令把作业放到后台执行
命令的一般形式:command &
注意:需要用户交互的命令不要放在后台执行。
后台运行的作业同样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的屏幕输出,最好使用下面的命令将它的输出重定向到一个文件中
command > out.file 2>&1 & 3.3.1 向后台提交命令
$ find /etc -name "srm.conf" -print >find.dt 2>&1 &
[1] 27015
命令提交成功,系统给出它的进程号27015
3.3.2 用ps命令查看进程
$ ps x|grep 28305
$ ps ef | grep 28305
记住:在用ps命令列出进程时,他无法确定进程是在前台还是在后台运行。
3.3.3 杀死后台进程
使用kill命令:kill -signal [process_number] 3.4 nohup命令
如果你正在运行一个进程,而且你觉得在退出账户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出账户之后继续运行相应的程序。
命令:nohup command &
$ nohup command > myout.file 2>&1
相关阅读 更多 +