快速业务通道

bash shell笔记6 脚本控制

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-07

2、以后台模式运行脚本
有些shell脚本在执行中需要等待漫长时间,终端回话无法执行其他操作,这个时候就可以shell放置到后台运行.
2.1、以后台模式运行
这个很简单就得意实现,只要在运行脚本时在命令后面附带一个&符号即可.
[root@wzp ~]# cat 6.2test
#!/bin/bash
count=1
while [ $count -le 5 ]
do
echo "loop #$count"
sleep 3
count=$[ $count 1 ]
done
[root@wzp ~]# ./6.2test &
[5] 7348
[root@wzp ~]# loop #1
loop #2
loop #3
loop #4
loop #5

[5] Done ./6.2test 拥有帝国一切,皆有可能。欢迎访问phome.net
通过这方法就可以到程序放到后台运行,控制台便可以进行其他操作.
可以借用这种方法运行多个程序.

3、在不使用控制台的情况下运行脚本
一个程序运行过程默认情况下会随着中断回话的退出而中断.这个时候就可以借用nohup命令来阻塞任何发送到进程的SIGHUP信号.
[root@wzp ~]# cat 6.2test
#!/bin/bash
count=1
while [ $count -le 5 ]
do
echo "loop #$count"
sleep 3
count=$[ $count 1 ]
done
[root@wzp ~]# nohup ./6.2test &
[2] 7877
[root@wzp ~]# nohup: appending output to “nohup.out”

[root@wzp ~]#
[2]- Done nohup ./6.2test
nohup将进程和终端断开,进程没有STDOUT和STDERR输出链接.nohup命令将自动把这两类消息重定向到nohup.out这个自动新创建的文件中去:
[root@wzp ~]# cat nohup.out
loop #1
loop #2
loop #3
loop #4
loop #5
这个文件的内容跟命令行运行进程输出是完全一样的!

4、作业控制
shell运行的进程可以通过ctrl z中断,利用kill终止进程,可以使用发送SIGCONT信号重启停止的进程.对于重启、停止.终止、恢复作业的操作就叫做作业控制.
4.1、查看作业
通过jobs命令可以直接查看shell处理的当前作业,看例子:
拥有帝国一切,皆有可能。欢迎访问phome.net[root@wzp ~]# nohup ./6.2test &
[1] 8477
[root@wzp ~]# nohup: appending output to “nohup.out”

[root@wzp ~]# nohup ./6.2test &
[2] 8479
[root@wzp ~]# nohup: appending output to “nohup.out”

[root@wzp ~]# jobs
[1]- Running nohup ./6.2test &
[2] Running nohup ./6.2test &
[root@wzp ~]# jobs
[1]- Done nohup ./6.2test
[2] Done nohup ./6.2test
我运行两次同样的脚步程序到后台,然后通过jobs查看,显示running状态,等到脚步运行结束再次jobs查看即可显示已完成状态.
[root@wzp ~]# nohup ./6.2test &
[2] 8594
[root@wzp ~]# nohup: appending output to “nohup.out”

[root@wzp ~]# jobs
[2] Running nohup ./6.2test &
[root@wzp ~]# kill 8594
[root@wzp ~]# jobs
[2] 已终止 nohup ./6.2test
当脚本一开始运行到后台会显示了PID号8594,当脚本还没运行结束我kill掉进程,也可以通过jobs查看出进程已经被kill了.
4.2、重新启动停止的作业
我们可以通过ctrl z暂停进程,当要重新启动停止的作业时可以通过使用带有作业编号的bg命令,看例子:
[root@wzp ~]# nohup ./6.2test
nohup: appending output to “nohup.out” 拥有帝国一切,皆有可能。欢迎访问phome.net
不过有点挺搞的提及下:系统管理员想在每个月的一天执行脚本,那么cron表格应该怎么写么?我们知道每个月的一天有可能是28、29、30、31,那么应该怎么判断这一天呢?答案:
这里可以借助添加if-then语句,用date命令检查明天是否1号即可解决问题,具体的cron表格内容如下:
* * * * * if [ `date %d -d tomorrow` = 01 ]; then ; command
通过这种方法就可以判定每个月一天啦~(≧▽≦)/~

本文出自 “twenty_four” 博客,请务必保留此出处http://twentyfour.blog.51cto.com/945260/522415

拥有帝国一切,皆有可能。欢迎访问phome.net

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号