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 |