Linux中让程序或者命令后台运行的方式

      在Linux下,有时候我们需要将执行的命令或者脚本或者程序放到后台去运行,这就牵扯到了Linux的程序后台运行方法,目前来说,可以通过crontab方式、at命令方式、结尾&方式、nohup方式等。

1 cron and crontab

        cron是Linux系统主要的调度进程,可以在无需人工干预的情况下运行作业。而crontab命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。可以使用它运行任意一个shell脚本或某个命令,设置运行周期,可以是每小时一次,也可以是每周一次等。系统管理员是通过cron.deny和cron.allow这两个文件来禁止或允许用户拥有自己的crontab文件。

        下面是crontab的格式:

分< >时< >日< >月< >星期< >要运行的命令

其中< >表示空格。并且:

第1列是分钟1~5 9

第2列是小时1~2 3(0表示子夜)

第3列是日1~3 1

第4列是月1~1 2

第5列是星期0~6(0表示星期天)

第6列是要运行的命令

        可以用横杠-来表示一个时间范围,例如你希望星期一至星期五运行某个作业,那么可以在星期域使用1-5来表示。还可以在这些域中使用逗号“,”,例如你希望星期一和星期四运行某个作业,只需要使用1,4来表示。可以用星号*来表示连续的时间段。如果你对某个表示时间的域没有特别的限定,也应该在该域填入*。该文件的每一个条目必须含有5个时间域,而且每个域之间要用空格分隔。

        该文件中所有的注释行要在行首用#来表示。

crontab文件例子:

(1)30 21 * * * /apps/bin/cleanup.sh

表示每晚的2 1 : 3 0运行/apps/bin目录下的cleanup.sh脚本。

(2)45 4 1,10,22 * * /apps/bin/backup.sh

表示每月1、10、22日4:45运行/apps/bin目录下的backup.sh脚本文件。

(3)10 1 * * 6,0 /bin/find -name "core" -exec rm {} \;

表示每周六、周日的1:10运行一个find命令。

(4)0,30 18-23 * * * /apps/bin/dbcheck.sh

表示在每天18:00至23:00之间每隔30分钟运行/apps/bin目录下的dbcheck.sh脚本文件。

(5)0 23 * * 6 /apps/bin/qtrend.sh

表示每星期六的11:00pm运行/apps/bin目录下的qtrend.sh脚本文件。

       注意,当使用crontab运行shell脚本时,要由用户来给出脚本的绝对路径,设置相应的环境变量。记住,既然是用户向cron提交了这些作业,就要向cron提供所需的全部环境。不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shell脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。

       如果cron不能运行相应的脚本,用户将会收到一个邮件说明其中的原因。

       crontab命令的一般形式为:

crontab [-u user] -e -l -r

其中:

-u 用户名;

-e 编辑crontab文件;

-l 列出crontab文件中的内容;

-r 删除crontab文件。

       如果使用自己的名字登录,就不用使用-u选项,因为在执行crontab命令时,该命令能够知道当前的用户。

在向cron进程提交一个crontab文件之前,要先设置环境变量EDITOR.cron进程根据它来确定使用哪个编辑器编辑crontab文件。大部份的UNIX和linux用户都使用vi,如果你也是这样,那么你就编辑$HOME目录下的.profile文件,在其中加入这样一行:

EDITOR=vi; export EDITOR。然后保存并退出。

编辑crontab文件

其他操作可见:

http://baike.baidu.com/view/1229061.htm

2 at方式

       at命令允许用户向cron守护进程提交作业,使其在稍后的时间运行。一旦一个作业被提交, at命令将会保留所有当前的环境变量,包括路径,不象crontab,只提供缺省的环境。该作业的所有输出都将以电子邮件的形式发送给用户,除非你对其输出进行了重定向,绝大多数情况下是重定向到某个文件中。

       和crontab一样,根用户可以通过/etc目录下的at.allow和at.deny文件来控制哪些用户可以使用at命令,哪些用户不行。不过一般来说,对at命令的使用不如对crontab的使用限制那么严格。

        at命令的基本形式为:

at [-f script] [-m -l -r] [time] [date]

其中,

-f:script是所要提交的脚本或命令;

-l:列出当前所有等待运行的作业。

-r:清除作业。为了清除某个作业,还要提供相应的作业标识(ID);

-m:作业完成后给用户发邮件;

time:at命令的时间格式非常灵活;可以是H、HH . HHMM、HH:MM或H:M,其中H和M分别是小时和分钟。还可以使用a.m.或p.m.;

date:日期格式可以是月份数或日期数,而且at命令还能够识别诸如today、tomorrow这样的词。

        使用at命令提交作业有几种不同的形式,可以通过命令行方式,也可以使用at命令提示符。一般来说在提交若干行的系统命令时,使用at命令提示符方式,在提交shell脚本时,使用命令行方式。

(1)提示符方式

以在at命令后面跟上日期/时间并回车。然后就进入了at命令提示符,这时只需逐条输入相应的命令,然后按‘<CTRL-D>’退出。

(2)命令行方式:

at [-f script] [-m -l -r] [time] [date]

例一:提示符方式

# su sam 

$ at 10:40 

warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh 

at> find /etc -name "passwd" –print

at> <EOT>

job 1 at 2012-12-20 12:00

其中,<EOT>就是<CTRL-D>。在10:40系统将执行一个简单的find命令。提交的作业被分配了一个唯一标识job1。该命令在完成以后会将全部结果以邮件的形式发送给用户。

下面这些日期/时间格式都是a t命令可以接受的:

at 5.00am May23

at 11.20pm

at now +2 hour

at 9am tomorrow

at 15:00 May24

at now + 10 minutes

例二:命令行方式

如果希望向at命令提交一个shell脚本,使用其命令行方式即可。在提交脚本时使用-f选项。

如:

$ touch db_table.sh

$ at 3:00pm tomorrow -f db_table.sh

warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh

job 3 at 2012-12-20 12:00

在上面的例子中,一个叫做db_table.sh的脚本将在2012-12-20 12:00运行。

还可以使用echo命令向at命令提交作业:

$ echo find /etc -name "passwd" -print | at now +1 minute

warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh

job 4 at 2012-12-20 12:00

        一个作业被提交后,可以使用at -l命令来列出所有的作业。当提交一个作业后,它就被拷贝到/var/spool/at目录中,准备在要求的时间运行。

        清除作业的命令格式为:

atrm [job no]或at -r [job no]

         要清除某个作业,首先要执行at -l命令,以获取相应的作业标识,然后对该作业标识使用at -r 命令,清除该作业。

3 &方式

         当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。该命令的一般形式为:

命令 &

          在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。

不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:

command >out.file 2>&1 &

        在上面的例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。

        当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。

4 nohup方式

        nohup的使用方式为:

nohup command &

         如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件,如:

nohup command > myout.file 2>&1 

        输出被重定向到myout.file文件中。

        如果希望一次提交几个命令,最好能够把它们写入到一个shell脚本文件中,并用nohup命令来执行它。

        例如,下面的所有命令都用管道符号连接在一起;我们可以把这些命令存入一个脚本文件quarterend,并使该文件可执行。

cat /home/accounts/qrt_0499 | /apps/bin/trials.awk | sort | lp

$cat > quarterend

cat /home/accounts/qtr_0499 | /apps/bin/trials.awk | sort | lp

<ctrl-D>

现在让它可执行:

$ chmod 744 quarterend

       我们还将该脚本的所有输出都重定向到一个名为qtr.out的文件中。

nohup ./quarterend > qtr.out 2 &

其他操作可见:

http://www.21andy.com/blog/20071121/677.html

http://baike.baidu.com/view/1839401.htm

 

 CSDN的文本编辑有点坑爹。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值