在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 ~]$