【拔苗计划】linux学习笔记——信号处理机制及kill、du、df命令

来源:互联网 发布:淘宝新手开店怎么装修 编辑:程序博客网 时间:2024/04/27 19:29

(2015-11-10)今天有两个主题,第一个是linux的信号处理机制,第二个就是学习三个命令——kill、du、df

信号处理机制

linux的信号原理这个主题有点大,对这一块,我更多的是整合网络上的资料进行消化,很难加入自己的想法。只有把《鸟哥的Linux私房菜》这本书重新捡起来再读一下了。

信号及信号来源

信号本质上是软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程无法知道信号什么时候到达。信号是进程之间通信机制中唯一的异步通信机制,可以看做是异步通知,通知接收信号的进程有哪些事情发生了。

信号有两个来源:硬件来源和软件来源。硬件来源主要就是硬件故障或者用户按下键盘操作;软件来源最常见的就是用户向进程发送系统函数比如kill、raise、alarm、setitimer和sigqueue函数,除此之外还包含一些非法运算等操作。

信号的种类

可以从两个不同的维度对信号进行分类:1.可靠性方面:可靠信号与不可靠信号;2.与时间有关的:实时信号与非实时信号。
不可靠信号主要指的是:信号不支持排队、有可能丢失。

实时信号与非实时信号

早期Unix系统只定义了32种信号,Ret hat7.2支持64种信号,编号0-63(SIGRTMIN=31,SIGRTMAX=63),将来可能进一步增加,这需要得到内核的支持。前32种信号已经有了预定义值,每个信号有了确定的用途及含义,并且每种信号都有各自的缺省动作。如按键盘的CTRL ^C时,会产生SIGINT信号,对该信号的默认反应就是进程终止。后32个信号表示实时信号,等同于前面阐述的可靠信号。这保证了发送的多个实时信号都被接收。实时信号是POSIX标准的一部分,可用于应用进程。

非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。

实时信号之所以是可靠的,因为在进程阻塞该信号的时间内,发给该进程的所有实时信号会排队,而非实时信号则会合并为一个信号。

进程对信号的响应

进程可以通过三种方式来响应一个信号:
(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;
(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;
(3)执行缺省操作,Linux对每种信号都规定了默认操作。注意,进程对实时信号的缺省反应是进程终止。
Linux究竟采用上述三种方式的哪一个来响应信号,取决于传递给相应API函数的参数。

信号的发送

发送信号的主要函数有:kill()、raise()、alarm()、setitimer()、sigqueue()以及abort()。这里着重关注kill函数,kill()最常用于pid>0时的信号发送,调用成功返回 0; 否则,返回 -1。

信号的安装

如果进程要处理某一信号,那么就要在进程中安装该信号。安装信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个信号;该信号被传递给进程时,将执行何种操作。

linux主要有两个函数实现信号的安装:signal()、sigaction()。其中signal()在可靠信号系统调用的基础上实现, 是库函数。它只有两个参数,不支持信号传递信息,主要是用于前32种非实时信号的安装;而sigaction()是较新的函数(由两个系统调用实现:sys_signal以及sys_rt_sigaction),有三个参数,支持信号传递信息,主要用来与 sigqueue() 系统调用配合使用,当然,sigaction()同样支持非实时信号的安装。sigaction()优于signal()主要体现在支持信号带有参数。

三个命令kill、du、df

这3个命令放在一起学是因为它们相对top这样的集大成命令来说,完成的功能比较单一,比较容易掌握。如果单独写笔记会觉得篇幅太短,因此合在一起。

kill

kill命令是对进程的一个结束信号,当我们发现线上某个进程失控(比如出现死循环这样的情况),这个时候需要把进程结束掉。那么首先我们得知道有问题的需要结束的进程号,这个问题又是另一个命令ps的事了,这里假设我们已经知道某个进程是需要被结束的,pid是1234,那么要结束这个进程的话,执行如下命令:
kill -s 9 1234或 kill 1234
其中-s 9 制定了传递给进程的信号是9,即强制、尽快终止进程。

kill pid与kill -9 pid的区别

kill pid的作用是向进程号为pid的进程发送SIGTERM(这是kill默认发送的信号),该信号是一个结束进程的信号且可以被应用程序捕获。若应用程序没有捕获并响应该信号的逻辑代码,则该信号的默认动作是kill掉进程。这是终止指定进程的推荐做法。

kill -9 pid则是向进程号为pid的进程发送SIGKILL(该信号的编号为9),从本文上面的说明可知,SIGKILL既不能被应用程序捕获,也不能被阻塞或忽略,其动作是立即结束指定进程。通俗地说,应用程序根本无法“感知”SIGKILL信号,它在完全无准备的情况下,就被收到SIGKILL信号的操作系统给干掉了,显然,在这种“暴力”情况下,应用程序完全没有释放当前占用资源的机会。事实上,SIGKILL信号是直接发给init进程的,它收到该信号后,负责终止pid指定的进程。在某些情况下(如进程已经hang死,无法响应正常信号),就可以使用kill -9来结束进程。

du、df

du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在的,没有被删除的。它计算的大小就是当前他认为存在的所有文件大小的累加和。

df,disk free,通过文件系统来快速获取空间大小的信息,当我们删除一个文件的时候,这个文件不是马上就在文件系统当中消失了,而是暂时消失了,当所有程序都不用时,才会根据OS的规则释放掉已经删除的文件, df记录的是通过文件系统获取到的文件的大小,他比du强的地方就是能够看到已经删除的文件,而且计算大小的时候,把这一部分的空间也加上了,更精确了。

df的结果>=du的结果,当文件系统也确定删除了该文件后,du和df结果相等。

今天太晚了,先到这里,明天接着更新。

——————–11月14号更新—————————-
补充几个du和df的命令吧。

du

1.du fileName
显示指定文件所占的空间
2.du dirName
显示指定目录所占的空间
3.du -s
只显示当前目录所占空间的总和
4.du -h –max-depth=1
输出当前目录下各个子目录所使用的空间
5.du * -sh
以更易读的方式显示当前目录下的各目录或文件所使用的空间

df

1.df -lh
以更易读的方式显示目前磁盘空间和使用情况

实战演练

当mysql连接报错时,根据错误码提示发现是磁盘空间不足,这个时候登上服务器,去到home目录下,利用du * -sh命令查看各个目录使用空间的情况,删掉一些使用空间特别大的文件,就可以解决mysql因磁盘空间不足报的错。

0 0
原创粉丝点击