Kill -9 杀不掉的进程
kill -9
通过发送SIGKILL
信号给进程,使其终止。但也不是一定能杀掉。
- 僵尸进程:此时进程已经释放所有的资源,但是没有被父进程释放。僵尸进程只有等到父进程结束或者重启系统才会被释放。
- 进程处于"核心态",并且在等待不可获取的资源。处于"核心态"的资源默认忽略所有信号。因此只能重启系统才能释放。
僵尸进程
当你运行一个程序时,它会产生一个父进程以及很多子进程。 所有这些子进程都会消耗内核分配给它们的内存和 CPU 资源。
这些子进程完成执行后会发送一个Exit
信号然后死掉。这个 Exit
信号需要被父进程所读取。父进程需要随后调用wait
命令来读取子进程的退出状态,并将子进程从进程表中移除。
若父进程正确第读取了子进程的Exit
信号,则子进程会从进程表中删掉。
但若父进程未能读取到子进程的Exit
信号,则这个子进程虽然完成执行处于死亡的状态,但也不会从进程表中删掉。
查找僵尸进程
ps aux | grep Z
杀掉僵尸进程
kill -s SIGCHLD pid
pid指向父进程。
fork
复刻(英语:fork,又译作派生、分支)是UNIX或类UNIX中的分叉函数,fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。
一个现有进程可以调用fork
函数创建一个新进程。由fork
创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
为什么fork会返回两次?
由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork
函数中,等待返回。因此fork
函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。过程如下图。
fork
调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
(1)在父进程中,fork
返回新创建子进程的进程ID;
(2)正常情况下,在子进程中,fork
返回0;
(3)如果出现错误,在子进程中,fork
返回一个负值。
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
grep的用法
grep
用于查找文件里符合条件的字符串。
语法
grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
参数说明
-a
或 --text : 不要忽略二进制的数据。
-A
<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b
或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B
<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c
或 --count : 计算符合样式的列数。
-C
<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d
<动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e
<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-E
或 --extended-regexp : 将样式为延伸的正则表达式来使用。
-f
<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F
或 --fixed-regexp : 将样式视为固定字符串的列表。
-G
或 --basic-regexp : 将样式视为普通的表示法来使用。
-h
或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H
或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
-i
或 --ignore-case : 忽略字符大小写的差别。
-l
或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L
或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-n
或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o
或 --only-matching : 只显示匹配PATTERN 部分。
-q
或 --quiet或–silent : 不显示任何信息。
-r
或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
-s
或 --no-messages : 不显示错误信息。
-v
或 --invert-match : 显示不包含匹配文本的所有行。
-V
或 --version : 显示版本信息。
-w
或 --word-regexp : 只显示全字符合的列。
-x
--line-regexp : 只显示全列符合的列。
-y
: 此参数的效果和指定"-i"参数相同。
Linux top和ps的区别
ps
看到的是命令执行那一瞬间的进程信息,而top
可以持续的监视。
ps
只是查看进程,而top
可以监视系统性能,资源使用情况,如平均负载,cpu和内存的消耗。
top
还可以操作进程,如改变进程优先级(r)
或者关闭进程(k)
等。
Linux查看进程的4种方法
ps aux
a:显示当前终端下的所有进程信息,包括其他用户的进程。
u:使用以用户为主的格式输出进程信息。
x:显示当前用户在所有终端下的进程。
ps -elf
-e:显示系统内的所有进程信息。
-l:使用长(long)格式显示进程信息。
-f:使用完整的(full)格式显示进程信息。
pstree -aup
以树状图的方式展现进程之间的派生关系,显示效果比较直观。
top
以全屏交互式的界面显示进程排名,及时跟踪包括CPU、内存等系统资源占用情况,默认情况下每三秒刷新一次,其作用基本类似于Windows系统中的任务管理器。
Linux下如何通过一行命令查找并杀掉进程
通过ps
查找到对应的进程号,然后再用kill
命令把进程杀掉。
假设要查找的ID包含头条关键字
ps -ef | grep 头条
假设找到的进程ID为12345
kill -9 12345
Linux查看端口使用情况
Linux netstat
命令用于显示网络状态。
利用 netstat 指令可让你得知整个 Linux 系统的网络情况。
语法
netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]
参数说明:
-a
或--all
显示所有连线中的Socket。
-A
<网络类型>或–<网络类型> 列出该网络类型连线中的相关地址。
-c
或--continuous
持续列出网络状态。
-C
或--cache
显示路由器配置的快取信息。
-e
或--extend
显示网络其他相关信息。
-F
或--fib
显示FIB。
-g
或--groups
显示多重广播功能群组组员名单。
-h
或--help
在线帮助。
-i
或--interfaces
显示网络界面信息表单。
-l
或--listening
显示监控中的服务器的Socket。
-M
或--masquerade
显示伪装的网络连线。
-n
或--numeric
直接使用IP地址,而不通过域名服务器。
-N
或--netlink
或–symbolic 显示网络硬件外围设备的符号连接名称。
-o
或--timers
显示计时器。
-p
或--programs
显示正在使用Socket的程序识别码和程序名称。
-r
或--route
显示Routing Table。
-s
或--statistics
显示网络工作信息统计表。
-t
或--tcp
显示TCP传输协议的连线状况。
-u
或--udp
显示UDP传输协议的连线状况。
-v
或--verbose
显示指令执行过程。
-V
或--version
显示版本信息。
-w
或--raw
显示RAW传输协议的连线状况。
-x
或--unix
此参数的效果和指定"-A unix"参数相同。
--ip
或--inet
此参数的效果和指定"-A inet"参数相同。
常用的 netstat 命令组合
netstat -na
该命令将显示所有活动的网络连接。
同时,还可以结合使用 grep、wc、sort 等 linux 命令来分析系统中连接情况,查看连接数状况,判断服务器是否被攻击。
netstat -an | grep :80 | sort
显示所有 80 端口的网络连接并排序。这里的 80 端口是 http 端口,所以可以用来监控 web 服务。如果看到同一个 IP 有大量连接,则判定该 IP 疑似存在单点流量攻击行为。
netstat -n -p|grep SYN_REC | wc -l
统计当前服务器有多少个活动的 SYNC_REC 连接数。正常来说这个值很小(小于 5)。
说明:当有 DDos 攻击或时,该值可能会非常高。但有些并发很高的服务器,该值也确实很高,因此该很高并不能说明一定是被攻击所致。
netstat -n -p | grep SYN_REC | sort -u
列出所有连接过的 IP 地址。
netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'
列出所有发送 SYN_REC 连接节点的 IP 地址。
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
计算每个主机连接到本机的连接数。
netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
列出所有连接到本机的 UDP 或者 TCP 连接的 IP 数量。
netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
检查 ESTABLISHED 连接并且列出每个 IP 地址的连接数量。
netstat -plan | grep :80 | awk {'print $5'} | cut -d: -f 1 | sort | uniq -c | sort -nk 1
列出所有连接到本机 80 端口的 IP 地址及其连接数。80 端口一般是用来处理 HTTP 网页请求。
netstat -antp | awk '$4 ~ /:80$/ {print $4" "$5}' | awk '{print $2}'|awk -F : {'print $1'} | uniq -c | sort -nr | head -n 10
显示连接到 80 端口连接数排名前 10 的 IP,并显示每个 IP 的连接数。如果看到同一个 IP 有大量连接,则判定该 IP 疑似存在单点流量攻击行为。
netstat - atulnp
会显示所有端口和所有对应的程序,用grep管道可以过滤出想要的字段
使用如下命令来查看端口占用的进程(以查看9000端口为例):netstat -antp | grep 9000
traceroute
Linux下是traceroute
,Win下是tracert
。
traceroute
命令利用ICMP
协议定位您的计算机和目标计算机之间的所有路由器。它使用TTL值反映数据包经过的路由器或者网关的数量,通过操纵独立ICMP呼叫报文的TTL值和观察该报文被抛弃的返回信息,traceroute
命令能够遍历到数据包传输路径上的所有路由器。