跟散仙学shell编程(六)

阅读更多
上篇介绍了linux里面的处理数据的方式,本篇散仙来说下,如何在linux里面控制脚本的执行。


在linux里面我们最常遇见的几个linux信号如下:
序号 信号 描述
1 1 sighup 挂起进程
2 2 sigint 终止进程
3 3 sigquit 停止进程
4 9 sigkill 无条件终止进程
5 15 sigterm 可能的话终止进程
6 17 sigstop 无条件停止进程,但不是终止进程
7 18 sigtstp 停止或暂停进程,但不终止进程
8 19 sigcont 继续运行停止的进程



在shell脚本里,Ctrl+C命令会产生sigint终止进程的信号,所以会强制退出任何在运行的进程:
[search@h1 814]$ sleep 30
^C
[search@h1 814]$ 

Ctrl+Z的组合键,会产生一个Sigtstp的信号,停止shell中运行的任何进程,如果你在此时退出shell进程,shell会提醒你,你有停止的进程:
[search@h1 814]$ sleep 30
^Z
[1]+  Stopped                 sleep 30
[search@h1 814]$ exit
logout
There are stopped jobs.
[search@h1 814]$ ps au
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1112  0.0  0.0   4064   580 tty1     Ss+  02:59   0:00 /sbin/mingetty /dev/tty1
root      1114  0.0  0.0   4064   576 tty2     Ss+  02:59   0:00 /sbin/mingetty /dev/tty2
root      1116  0.0  0.0   4064   576 tty3     Ss+  02:59   0:00 /sbin/mingetty /dev/tty3
root      1118  0.0  0.0   4064   576 tty4     Ss+  02:59   0:00 /sbin/mingetty /dev/tty4
root      1120  0.0  0.0   4064   580 tty5     Ss+  02:59   0:00 /sbin/mingetty /dev/tty5
root      1122  0.0  0.0   4064   580 tty6     Ss+  02:59   0:00 /sbin/mingetty /dev/tty6
root      1132  0.0  0.0 108432  1968 pts/0    Ss   03:00   0:00 -bash
root      1359  0.0  0.0 145432  1584 pts/0    S    04:19   0:00 su - search
search    1360  0.0  0.0 108432  2024 pts/0    S    04:19   0:00 -bash
search    1383  0.0  0.0 100904   596 pts/0    T    04:21   0:00 sleep 30
search    1384  1.0  0.0 110228  1172 pts/0    R+   04:22   0:00 ps au
[search@h1 814]$ 


找到pid,我们就可以使用我们经常用的kill -9 pid来,为T的进程


在linux里面捕捉信号,我们可以使用trap命令:
[search@h1 814]$ cat a.sh 


trap "echo '我捕捉到了Ctrl+C的信号'"  SIGINT SIGTERM






sleep 20





echo `date`
[search@h1 814]$ sh a.sh 
^C我捕捉到了Ctrl+C的信号
2014年 08月 15日 星期五 04:35:25 CST
[search@h1 814]$ 


trap命令会捕捉此信号,并阻止其停止进程。
当然我们还可以捕捉,脚本的退出:
[search@h1 814]$ cat aa.sh 
#!/bin/bash
trap "退出了"  EXIT




sleep 5





echo "最后执行!!!!"

[search@h1 814]$ sh aa.sh 
最后执行!!!!
aa.sh: line 1: 退出了: command not found


我们可以使用trap - EXIT命令移除捕捉

[search@h1 814]$ cat b.sh 



trap "退出了:"  EXIT


sleep 5



echo `date`


trap - EXIT

echo "移除捕捉"
[search@h1 814]$ sh b.sh 
2014年 08月 15日 星期五 04:56:20 CST
移除捕捉
[search@h1 814]$ sh b.sh 
^Cb.sh: line 1: 退出了:: command not found

[search@h1 814]$ 



下面我们来看下,如何在后台模式运行,脚本:

[search@h1 814]$ cat bb.sh 




for ((  i=0 ; i< 10 ;i++  ))
do
 
 echo "序号: $i"

 sleep 1


done

[search@h1 814]$ sh bb.sh 
序号: 0
序号: 1
序号: 2
序号: 3
序号: 4
序号: 5
序号: 6
序号: 7
序号: 8
序号: 9
[search@h1 814]$ 

如果我们想后台模式执行,可以在脚本后面加个&符号:
[search@h1 814]$ sh bb.sh &
[2] 1455
[search@h1 814]$ 序号: 0
序号: 1
序号: 2
序号: 3
序号: 4
序号: 5
序号: 6
序号: 7
序号: 8
序号: 9

[2]-  Done         


方括号里面的是作业号,后面的是进程,我们可以通过ps au命令查看。


注意&和nohup的区别,就在于&在shell终端关闭时,任务就会终止,如果你不想这么样,你可以使用nohup命令来实现,同样式刚才的例子:
[search@h1 814]$ nohup sh bb.sh & 
nohup: 忽略输入并把输出追加到"nohup.out"




[search@h1 814]$ 
[search@h1 814]$ 
[search@h1 814]$ 
[search@h1 814]$ 
[search@h1 814]$ ll
总用量 32
-rw-rw-r-- 1 search search  77 8月  15 04:47 aa.sh
-rw-rw-r-- 1 search search  95 8月  15 04:35 a.sh
-rw-rw-r-- 1 search search  75 8月  15 05:01 bb.sh
-rw-rw-r-- 1 search search  87 8月  15 04:56 b.sh
-rw-rw-r-- 1 search search  20 8月  15 05:05 c1.sh
-rw-rw-r-- 1 search search  20 8月  15 05:05 c2.sh
-rw-rw-r-- 1 search search  20 8月  15 05:05 c.sh
-rw------- 1 search search 100 8月  15 05:13 nohup.out
[search@h1 814]$ cat nohup.out 
序号: 0
序号: 1
序号: 2
序号: 3
序号: 4
序号: 5
序号: 6
序号: 7
序号: 8
序号: 9
[search@h1 814]$ 


nohup命令,会把后台运行中的输出充重定向到nohup.out里面,如果有错误则输出到nohup.err里面。

查看作业使用jobs命令可以查看,后台运行情况:
[search@h1 814]$ nohup sh bb.sh &
[2] 1550
[search@h1 814]$ nohup: 忽略输入并把输出追加到"nohup.out"

[search@h1 814]$ job
-bash: job: command not found
[search@h1 814]$ jobs
[1]+  Stopped                 sleep 30
[2]-  Running                 nohup sh bb.sh &
[search@h1 814]$ 


[search@h1 814]$ cat bb.sh 





echo "进程ID:$$"

for ((  i=0 ; i< 10 ;i++  ))
do
 
 echo "序号: $i"

 sleep 1


done

[search@h1 814]$ nohup sh bb.sh &
[2] 1564
[search@h1 814]$ nohup: 忽略输入并把输出追加到"nohup.out"

[search@h1 814]$ jobs
[1]+  Stopped                 sleep 30
[2]-  Running                 nohup sh bb.sh &
[search@h1 814]$ 


$$可以打印当前进程id
要以后台模式重启一个作业,可以使用bg命令加上作业号,
如果以前台模式重启一个作业,可以使用fg命令,加上作业号:

除以之外,我们还可以使用nice命令来调整任务的优先级别,范围从-20到20 ,数值越大优先级越低,
nice -n 10 nohup sh bb.sh &
[2] 1576
[1]   Exit 125                nice -n 10nohup sh bb.sh
[search@h1 814]$ nohup: 忽略输入并把输出追加到"nohup.out"

[search@h1 814]$ ps al
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0  1112     1  20   0   4064   580 n_tty_ Ss+  tty1       0:00 /sbin/mingetty /dev/tty1
4     0  1114     1  20   0   4064   576 n_tty_ Ss+  tty2       0:00 /sbin/mingetty /dev/tty2
4     0  1116     1  20   0   4064   576 n_tty_ Ss+  tty3       0:00 /sbin/mingetty /dev/tty3
4     0  1118     1  20   0   4064   576 n_tty_ Ss+  tty4       0:00 /sbin/mingetty /dev/tty4
4     0  1120     1  20   0   4064   580 n_tty_ Ss+  tty5       0:00 /sbin/mingetty /dev/tty5
4     0  1122     1  20   0   4064   580 n_tty_ Ss+  tty6       0:00 /sbin/mingetty /dev/tty6
4     0  1132  1127  20   0 108432  1968 wait   Ss   pts/0      0:00 -bash
4     0  1359  1132  20   0 145432  1584 wait   S    pts/0      0:00 su - search
4   500  1360  1359  20   0 108432  2056 wait   S    pts/0      0:00 -bash
4     0  1503  1498  20   0 108432  1968 wait   Ss   pts/1      0:00 -bash
4     0  1518  1503  20   0 145432  1584 wait   S    pts/1      0:00 su - search
4   500  1519  1518  20   0 108428  1984 n_tty_ S+   pts/1      0:00 -bash
0   500  1576  1360  30  10 106060  1348 wait   SN   pts/0      0:00 sh bb.sh
0   500  1581  1576  30  10 100904   596 hrtime SN   pts/0      0:00 sleep 1
0   500  1582  1360  20   0 108124  1040 -      R+   pts/0      0:00 ps al
[search@h1 814]$ 


renice命令,可以改变已有进程的优先级别,使用root用户可以调整任意优先级,其他用户则有限制。



在linux中执行定时的任务主要有at和crontab两种方法:
如果系统没有都可执行yum install at 或yum install crond下载安装
命令格式at [-f filename ] time
查询作业atq,删除作业使用atrm 作业号


at命令适合用在预设时间内执行脚本比较好,如果需要每天或每周甚至每月跑一次,我们就可以使用cron程序,cron在实际开发中,用的比较多,例如散仙公司用到的定时建索引的服务就是以crontab设定的,关于crond的使用,请参考散仙以前的 文章


小技巧:如何在每月的最后一天执行某个任务用法

00 12 * * * if [ `date +%d -d tomorrow` = 01 ] ; then ; command

在linux里面还有一个anacron程序,类似cron,它可以在错过的计划内,尽快运行某次因服务挂掉,或机器停电的作业,有兴趣的朋友可以自己查阅下。



如果我们想把我们的脚本,开始时运行起来,就需要把我们的脚本放在/etc/init.d/rc.local里面或/etc/rc.local里面,不同的linux的发行版本可能不太一样,通常,我们看一下就能识别出来。

[search@h1 814]$ cd /etc/init.d/
[search@h1 init.d]$ ll
总用量 168
-rwxr-xr-x  1 root root  2062 1月  30 2012 atd
-rwxr-xr-x. 1 root root  3378 6月  22 2012 auditd
-r-xr-xr-x. 1 root root  1340 11月 24 2013 blk-availability
-rwxr-xr-x. 1 root root  2826 11月 23 2013 crond
-rw-r--r--. 1 root root 18586 10月 10 2013 functions
-rwxr-xr-x. 1 root root  5866 10月 10 2013 halt
-rwxr-xr-x. 1 root root 10804 11月 23 2013 ip6tables
-rwxr-xr-x. 1 root root 10688 11月 23 2013 iptables
-rwxr-xr-x. 1 root root  4535 10月  8 2013 iscsi
-rwxr-xr-x. 1 root root  3990 10月  8 2013 iscsid
-rwxr-xr-x. 1 root root   652 10月 10 2013 killall
-r-xr-xr-x. 1 root root  2134 11月 24 2013 lvm2-lvmetad
-r-xr-xr-x. 1 root root  2665 11月 24 2013 lvm2-monitor
-rwxr-xr-x. 1 root root  2571 10月 11 2013 mdmonitor
-rwxr-xr-x. 1 root root  2523 11月 23 2013 multipathd
-rwxr-xr-x  1 root root  7026 2月  13 2014 mysqld
-rwxr-xr-x. 1 root root  2989 10月 10 2013 netconsole
-rwxr-xr-x. 1 root root  5428 10月 10 2013 netfs
-rwxr-xr-x. 1 root root  6334 10月 10 2013 network
-rwxr-xr-x. 1 root root  3852 12月  3 2011 postfix
-rwxr-xr-x. 1 root root  1513 9月  17 2013 rdisc
-rwxr-xr-x. 1 root root  1822 11月 23 2013 restorecond
-rwxr-xr-x. 1 root root  2011 8月  15 2013 rsyslog
-rwxr-xr-x. 1 root root  1698 11月 23 2013 sandbox
-rwxr-xr-x. 1 root root  2056 11月 20 2012 saslauthd
-rwxr-xr-x. 1 root root   647 10月 10 2013 single
-rwxr-xr-x. 1 root root  4534 11月 23 2013 sshd
-rwxr-xr-x. 1 root root  2294 11月 23 2013 udev-post
[search@h1 init.d]$ 


如果想在登陆shell时,执行一些脚本,通常我们在用户根目录下的.bash_profile和.bashrc文件里面来测试,注意这两个文件为隐藏文件,需要使用ls -al命令查看
下面散仙测试:

-rw-------.  1 search search      9909 8月  15 05:28 .bash_history
-rw-r--r--.  1 search search        18 7月  18 2013 .bash_logout
-rw-r--r--.  1 search search       176 7月  18 2013 .bash_profile
-rw-r--r--.  1 search search       124 7月  18 2013 .bashrc



在.bashrc里面加一条输出,每次退出(Ctrl+D)登陆(Enter),都会打印:
[root@h1 ~]# su - search
欢迎使用!!
[search@h1 ~]$ cat .bashrc 
# .bashrc

# Source global definitions



if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

echo "欢迎使用!!"

# User specific aliases and functions
[search@h1 ~]$ 



你可能感兴趣的:(编程,脚本,linux,脚本控制)