一、kill 命令
Linux kill命令用于删除执行中的程序或工作。
信号编号 | 信号名 | 含义 |
---|---|---|
0 | EXIT | 程序退出时收到该信息。 |
1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
2 | INT | 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。 |
3 | QUIT | 退出。 |
4 | ILL | 非法指令(ANSI) |
5 | TRAP | 跟踪陷阱(POSIX) |
6 | IOT | IOT 陷阱(4.2 BSD) |
7 | BUS | 总线错误 (4.2 BSD) |
8 | FPE | 浮点异常(ANSI) |
9 | KILL |
杀死进程,即强制结束进程。 |
10 | USR1 | 用户定义信号1(POSIX) |
11 | SEGV |
无效的内存段访问(ANSI)。 |
12 | USR2 | 用户定义信号2(POSIX) |
13 | PIPE | 写在没有读卡器的管道上,管道破裂(posix) |
14 | ALRM | 闹钟(POSIX) |
15 | TERM |
正常结束进程,是 kill 命令的默认信号。 |
16 | STKFLT | Linux堆栈错误 |
17 | CHLD | 子进程已停止或退出,已更改(POSIX) |
18 | CONT | 如果停止,则继续执行(posix) |
19 | STOP | 停止执行(无法捕获或忽略)(POSIX) |
20 | TSTP | 终端停止信号(POSIX) |
21 | TTIN | 试图从tty(posix)读取的后台进程 |
22 | TTOU | 试图写入的后台进程,到tty(posix) |
23 | URG | Urgent condition on socket (4.2 BSD) |
24 | XCPU | 超过CPU限制(4.2 BSD) |
25 | XFSZ | 超出文件大小限制(4.2 bsd) |
26 | VTALRM | 虚拟闹钟(4.2 BSD) |
27 | VTALRM | 仿形闹钟(4.2 BSD) |
28 | WINCH | 窗尺寸变化(4.3 BSD,sun) |
29 | GIO | 可以进行I/O操作(4.2 BSD) |
30 | PWR | 电源故障重启 |
执行kill(不加 -* 默认kill -15)命令,系统会发送一个SIGTERM信号给对应的程序。当程序接收到该signal信号后,将会发生以下事情:
- 程序立刻停止
- 当程序释放相应资源后再停止
- 程序可能仍然继续运行
大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后再停止。但是也有程序可能接收信号后,做一些其他的事情(如果程序正在等待IO,可能就不会立马做出响应),也就是说,SIGTERM多半是会被阻塞的。
kill -9
系统给对应程序发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程。
在使用 kill -9 前,应该先使用 kill -15,给目标进程一个清理善后工作的机会。如果没有,可能会留下一些不完整的文件或状态,从而影响服务的再次启动。
二、AWK
awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
默认使用空格作为分隔符。
awk '{ action }' {filenames}
awk '{ pattern + action }' {filenames}
awk -F '分隔符' { action }
变量
$ + 数字 :表示第几个字段,$1 ,$2 表示第 1 ,2 个字段,
NF :表示当前行有多少个字段,因此$NF就代表最后一个字段,$(NF-1)代表倒数第二个字段。
NR 表示当前处理的是第几行
FILENAME:当前文件名
FS:字段分隔符,默认是空格和制表符。
RS:行分隔符,用于分割每一行,默认是换行符。
OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
OFMT:数字输出的格式,默认为%.6g。
函数
print 和 printf
awk中同时提供了print和printf两种打印输出的函数。
print函数,参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
其他函数
tolower():字符转为小写。
length():返回字符串长度。
substr():返回子字符串。
sin():正弦。
cos():余弦。
sqrt():平方根。
rand():随机数。
示例:
显示最近登录的5个帐号:
[root@localhost workspace]# last -n 5
root pts/1 192.168.77.1 Fri Oct 11 10:14 still logged in
root pts/0 192.168.77.1 Fri Oct 11 08:30 still logged in
reboot system boot 3.10.0-514.el7.x Fri Oct 11 08:21 - 13:24 (05:02)
root pts/0 192.168.77.1 Thu Oct 10 09:06 - 14:37 (05:31)
reboot system boot 3.10.0-514.el7.x Thu Oct 10 09:05 - 13:24 (1+04:18)
wtmp begins Wed Sep 4 19:31:26 2019
# 只是显示最近登录的5个帐号
[root@localhost workspace]# last -n 5 | awk '{print $1}'
root
root
reboot
root
reboot
wtmp
awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,1表示第一个域,1表示登录用户,$3表示登录用户ip,以此类推。
NR,表示awk开始执行程序后所读取的数据行数。
FNR,与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计。
$NF表示最后一个列(field),即输出最后一个字段的内容
三、 tail 命令
tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件。
tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。
参数:
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示文件的尾部 n 行内容
--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
四、linux shell中?,$!等的特殊用法
变量说明:
$$
Shell本身的PID(ProcessID)
$!
Shell最后运行的后台Process的PID
$?
最后运行的命令的结束代码(返回值)
$-
使用Set命令设定的Flag一览
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$#
添加到Shell的参数个数
$0
Shell本身的文件名
$1~$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
简单的脚本测试:
#!是一个特殊符号,/bin/sh是用来解释该脚本的的shell路径
#!/bin/sh指该脚本使用/bin/sh来执行
创建shell文件:
# touch variable
# vi variable
脚本内容如下
#!/bin/sh
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:$@"
保存退出
赋予脚本执行权限
# chmod +x variable
执行脚本
# ./variable aa bb
number:2
scname:./variable
first: aa
second:bb
argume:aa bb
通过显示结果可以看到:
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
五、xargs 命令
xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:
find /sbin -perm +700 |ls -l #这个命令是错误的
find /sbin -perm +700 |xargs ls -l #这样才是正确的
xargs 一般是和管道一起使用。
命令格式:
somecommand |xargs -item command