linux内核的功能:
进程管理
,硬件驱动
,文件系统
,网络管理
,安全管理
,内存管理
。 把一切硬件抽象为系统调用。
linux内核存储进程信息的固定格式:
task struct
多个任务的task struct
组成的链表称为:task list
init
: 初始化进程。它由kernel 创建。 除init
进程之外,于下的进程都是由init
进程创建而来的。 kernel 创建inint
进程之后,说明内核空间已有了,用户空间也已经创建。后续的用户空间所有管理工作由init
管理。- 进程与进程之间存在在父子关系:进程都由其父进程创建。
- 父进程创建子进程,由fork()而来,向内核发送调用。fork()是创建子进程的一个接口,内核开设的调用clone().
- 进程的优先级:
0-139
:0
一般不用。
1-99
: 实时优先级。实时优先级,数字越大,优先越高。
100-139
: 静态优先级 ;数字越小,优先级越高。nice
值:-20 <--> 19
之间, 对应于进程优先级的100<-->139
。
BIg O : 0(1) , 0( logn ) , 0(n), 0(n^2), 0(2^n) 。
进程内存
- page Frame : 页框,用于存储页面数据, 存储 Page。
- 线性地址:
- 物理地址:
- MMU : Memory Manage Unit : 内存管理单元。
- IPC : inter Process Communication 机制: 用于进程之间的通信。
-同一主机上:
- signal :
- shm : shared memory
- semerphor
- 不同主机上:
- rpc : remote procecure call
- socket
linux内核:进程实行抢占式多任务
daemon
: 在系统引导过程中启动的进程,与终端无关的进程。running
ready
进程的分类
cpu--->Bound
io ------>Bound
pstree , ps , pidof , pgrep , top, htop, glances, pmap, vmstat, dstat, kill, pkill, job,bg, fg, nohup, nice , renice , killall ,...
进程显示格式:
[root@caibird ~]# pstree
init─┬─NetworkManager─┬─dhclient
│ └─{NetworkManager}
├─abrtd
├─acpid
├─atd
├─auditd───{auditd}
├─automount───4*[{automount}]
├─bonobo-activati───{bonobo-activat}
├─certmonger
├─console-kit-dae───63*[{console-kit-da}]
├─crond
├─cupsd
├─2*[dbus-daemon───{dbus-daemon}]
├─dbus-launch
├─devkit-power-da
├─gconfd-2
....
pstree - display a tree of processes
pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-Z] [-A|-G|-U]
[pid|user]
pstree -V
ps - report a snapshot of the current processes.
命令格式: ps [options]
/proc/
目录下。 /proc/sys/
目录下。参数 : 模拟成文件系统类型
进程: /proc/# : # : 表示 PID 进程号。 进程号命名的目录 。 在/proc/ 下都会有一个以进程号为目录。
ps [OPTION] 选项有三种风格, 如下:
1 UNIX options, which may be grouped and must be preceded by a
dash.
2 BSD options, which may be grouped and must not be used with a
dash.
3 GNU long options, which are preceded by two dashes.
1, 系统启动过程中自动启动,与终端无关的进程。
2, 用户通过终端启动: 与终端相关的进程。
a
: 所有与终端相关的进程;x
: 所有与终端无关的进程。u
: 以用户为中心组织进程姿态信息显示。aux
例如:
[root@caibird ~]# ps -aux #centos 7
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 128164 6860 ? Ss 6月23 0:15 /usr/lib/systemd/s
root 2 0.0 0.0 0 0 ? S 6月23 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 6月23 0:01 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 6月23 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 6月23 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 6月23 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 6月23 0:06 [rcu_sched]
root 10 0.0 0.0 0 0 ? S 6月23 0:07 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 6月23 0:00 [kdevtmpfs]
root 13 0.0 0.0 0 0 ? S< 6月23 0:00 [netns]
root 14 0.0 0.0 0 0 ? S 6月23 0:00 [khungtaskd]
******************************************************************************************
[root@caibird ~]# ps aux #centos 6
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 19348 1552 ? Ss Jun15 0:03 /sbin/init
root 2 0.0 0.0 0 0 ? S Jun15 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Jun15 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S Jun15 0:01 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S Jun15 0:00 [stopper/0]
root 6 0.0 0.0 0 0 ? S Jun15 0:06 [watchdog/0]
root 7 0.0 0.0 0 0 ? R Jun15 3:49 [events/0]
root 8 0.0 0.0 0 0 ? S Jun15 0:00 [events/0]
VSZ
: 虚拟内存集, 占领虚拟内存的大小,—>线性地址空间。RSS
: Resident SRE , 常驻内存集, 不能放在交换上的数据。TIME
: 累积占用CPU的时间。[kthreadd]
: 带杰棕括号表示是 内核线程
。STAT
: 进程状态。R
:running 运行态。S
: interruptable sleeping ; 可中断睡眠。D
:uninterruptable sleping ; 不可中断睡眠。T
: stopped ;停止态。Z
: zombie : 僵尸态+
: 前台进程。N
: 低优先级进程。l
: 多线程进程。<
: 高优先级进程。s
: session leader : 会话领导者。-ef
-e
: 显示所有进程。-f
: 显示完整格式的进程信息。
[root@caibird ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jun15 ? 00:00:03 /sbin/init
root 2 0 0 Jun15 ? 00:00:00 [kthreadd]
root 3 2 0 Jun15 ? 00:00:00 [migration/0]
root 4 2 0 Jun15 ? 00:00:01 [ksoftirqd/0]
root 5 2 0 Jun15 ? 00:00:00 [stopper/0]
root 6 2 0 Jun15 ? 00:00:06 [watchdog/0]
root 7 2 0 Jun15 ? 00:03:51 [events/0]
root 8 2 0 Jun15 ? 00:00:00 [events/0]
root 9 2 0 Jun15 ? 00:00:00 [events_long/0]
root 10 2 0 Jun15 ? 00:00:00 [events_power_ef]
root 11 2 0 Jun15 ? 00:00:00 [cgroup]
root 12 2 0 Jun15 ? 00:00:00 [khelper]
....
说明:
-PID
: 进程号。
-PPID
: 父进程号:/sbin/init
的父进程为0 , 0 号进程是一个过渡,系统引导时会出现 。
-C
: 表示 CPU 占用百分比。 ; cpu utiliztion
-STIME
: 表示启动的时间。
-TTY
: 与其相关的终端。
-PSR
:表示运行在哪颗CPU上面。
##### 常用组合之三: -eFH
-F
: 显示完整格式的进程信息。-H
: 以层次结构显示进程的相关信息。[root@caibird ~]# ps -eFH
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 2 0 0 0 0 0 Jun15 ? 00:00:00 [kthreadd]
root 3 2 0 0 0 0 Jun15 ? 00:00:00 [migration/0]
root 4 2 0 0 0 0 Jun15 ? 00:00:01 [ksoftirqd/0]
root 5 2 0 0 0 0 Jun15 ? 00:00:00 [stopper/0]
root 6 2 0 0 0 0 Jun15 ? 00:00:06 [watchdog/0]
root 7 2 0 0 0 0 Jun15 ? 00:03:52 [events/0]
root 8 2 0 0 0 0 Jun15 ? 00:00:00 [events/0]
root 9 2 0 0 0 0 Jun15 ? 00:00:00 [events_long/0]
root 10 2 0 0 0 0 Jun15 ? 00:00:00 [events_power_ef]
root 11 2 0 0 0 0 Jun15 ? 00:00:00 [cgroup]
root 12 2 0 0 0 0 Jun15 ? 00:00:00 [khelper]
...
root 2011 1 0 45726 2376 0 Jun15 ? 00:00:00 /usr/sbin/abrtd
root 2038 1 0 29222 1400 0 Jun15 ? 00:00:06 crond
root 2053 1 0 5278 500 0 Jun15 ? 00:00:00 /usr/sbin/atd
root 2070 1 0 16106 1428 0 Jun15 ? 00:00:00 /usr/sbin/certmong
root 2109 1 0 33531 2208 0 Jun15 ? 00:00:00 /usr/sbin/gdm-bina
root 2142 2109 0 41206 3160 0 Jun15 ? 00:00:00 /usr/libexec/gdm
root 2145 2142 0 43128 27984 0 Jun15 tty1 00:00:16 /usr/bin/Xorg
gdm 2232 2142 0 68568 8340 0 Jun15 ? 00:00:01 /usr/bin/gnome
gdm 2258 2232 0 30189 4452 0 Jun15 ? 00:00:03 /usr/libexec
gdm 2269 2232 0 71725 10392 0 Jun15 ? 00:00:03 metacity
gdm 2270 2232 0 101687 18960 0 Jun15 ? 00:00:22 /usr/libexec
gdm 2271 2232 0 62205 7776 0 Jun15 ? 00:00:00 /usr/libexec
gdm 2274 2232 0 68568 9056 0 Jun15 ? 00:00:12 gnome-power-
root 2292 2142 0 35480 2140 0 Jun15 ? 00:00:00 pam: gdm-passw
root 2115 1 0 1017 532 0 Jun15 tty2 00:00:00 /sbin/mingetty /de
root 2117 1 0 1017 532 0 Jun15 tty3 00:00:00 /sbin/mingetty /de
-e0
:0 要写在 e的后面,后面带参数。0
: 表示自定义要显示的字段列表,各选项之间用逗号隔开。 0 可表示:field1 , field2, ...
pld , ni , pri , psr , pcup , stat, comm , tty , ppid,
pgrep, pkill 命令:
功能: look up or signal processes based on name and other attributes
是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。在服务器的配置和管理中,这个工具常被应用。
格式:
pgrep [options] pattern
pkill [options] pattern
选项:
-u uid
:effective user-U uid
: read user-t TERMINAL
: 与指定的终端相关的进程。-l
: 显示进程名。-a
: 显示完整格式的进程名。D pid
: 显示此进程的子进程。-o
进程起始的ID;-n
进程终止的ID;[root@caibird ~]# pgrep bash
1452
13524
14616
[root@caibird ~]# pgrep -lo bash
1452 bash
[root@caibird ~]# pgrep -ln bash
14616 bash
[root@caibird ~]#
作用: pidof用于找出正在运行的程序的进程
PID(find the process ID of a running program.)
,程序可以是一个二进制执行程序,也可以是一个shell脚本。
pidof program
pidof -s program
pidof -x script
选项:
--d #
:指定延迟时间间隔。
-u UserName
:仅显示指定用户的进程。
--s COLUME
: 以指定字段进行排序。
l
: 显示选定的进程打开的文件列表。s
: 跟踪选定的进程的系统调用。t
: 以层次关系显示各进程状态。a
: 将选定的进程绑定至某指定的cpu核心。vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。
命令格式:
vmstat [options] [delay [count]]
选项:
--a, --active
: active/inactive memory
-f, --forks
: number of forks since boot -m, --slabs
: slabinfo -n, --one-header
: do not redisplay header-s, --stats
: event counter statistics-d, --disk
: disk statistics-D, --disk-sum
: summarize disk statistics-p, --partition
: partition specific statistics-S, --unit
: define display unit-w, --wide
: wide output-t, --timestamp
: show timestampprocs :
r
:等待运行的进程个数;cpu上等待运行的任务的队列长度。b
:处于不可中断睡眠态的进程个数。被阻塞的任务队列的长度。 swap
:交换内存使用率。 free
:空闲的物理内存总量。buffer
:用于buffer的内存总量。cache
:用于cache的内存总量。si
:数据进入swap中的数据速率(kb/s)so
:数据离开swap的速率(kb/s)bi
:从块设备读入数据到系统的速度(kb/s) bo
:保存数据至块设备的速率(kb/s)in
:interrupts, 中断速率;cs
:context switch , 上下文切换的速率。us
:user space ; 用户空间。sy
:system ; 系统空间。id
: idle wa
:waitst
: stolen-report memory map of a process
pmap [ -x | -d ] [ -q ] pids...
pmap -V
-x
: 显示详细格式的信息。cat /proc/PID/maps
foreground
(前台作业) :通过终端启动,且启动后会一直占用终端(命令提示符)。background
(后台作业):可以通过终端启动,但启动后即转入后台运行(释放终端)。如何让作业于后台运行:
ctrl + z
; 注意: 送往后台的作业会转为停止状态(stop)。COMMAND &
;在启动的作业后面 + &
nohop COMMAND &
, 则立即转入与终端无关的模式。如何查看当前系统的所有作业
jobs
命令 可实现作业控制的常用命令
作业控制常用带作业号来实现 。
JOB_NUM
fg [[%] JOB_NUM]
:把作业从后门周往前台来。bg [[%] JOB_NUM]
: 后台停止的作业继续运行。kill %JOB_NUM
:终止作业进程。百分号%在这里不能省略,如果省略就变成进程号了。说明 :作业中 “+” ,“- ” : “ + ” : 表示下次执行作业没有加作业号默认管理的作业。
“- ” 减号 : 表示 “+” 作业之后的作业管理。
进程的优先级调整
- 可通过
nice
值调整的优先级范围100-139
, 分别对应于:-20,19
。- 进程启动时,其 nice 值默认为
0
,其优先级是120
;
nice [OPTION] [COMMAND[ARG] ... ]
-n NICE
: 指定 nice 值。nice
值。 renice [-n] NICE PID ...
例如:
renice -n -3 52073
# ps axo pid,ni,priority, command
send ICMP ECHO_REQUEST to network hosts
: 发送网络控制信息协议回显请求到网络主机。 ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS] [-r count] [-s count] [[-j host-list] | [-k host-list]][-w timeout] [-R] [-S srcaddr] [-4] [-6] target_name
ping [OPTION] destination
-c COUNT
: 指定发送 ping 包的个数。 -w #
: 指定 ping 命令超时时长。-W #
: 一次 ping 操作中,等待对方响应的超时时长 。 -s #
: 指明 ping 包报文大小,默认为32byte字节。Hping是一个命令行下使用的TCP/IP数据包组装/分析工具,其命令模式很像Unix下的ping命令,但是它不是只能发送ICMP回应请求,它还可以支持TCP、UDP、ICMP和RAW-IP协议,它有一个路由跟踪模式,能够在两个相互包含的通道之间传送文件。
hping host [options]
通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的.
格式:traceroute[参数][主机]
print the route packets trace to network hosts
功能:跟踪从源主机到目标主机之间经过的网关。
-d
: 使用Socket层级的排错功能。 -f
: 设置第一个检测数据包的存活数值TTL的大小。-F
: 设置勿离断位。-g
: 设置来源路由网关,最多可设置8个。-i
: 使用指定的网络界面送出数据包。-I
: 使用ICMP回应取代UDP资料信息。-m
: 设置检测数据包的最大存活数值TTL的大小。-n
: 直接使用IP地址而非主机名称。-p
:设置UDP传输协议的通信端口。-r
:忽略普通的Routing Table,直接将数据包送到远端主机上。-s
:设置本地主机送出数据包的IP地址。-t
: 设置检测数据包的TOS数值。-v
: 详细显示指令的执行过程。-w
:设置等待远端主机回报的时间。-x
:开启或关闭数据包的正确性检验。ftp 服务是命令行客户端工具: 用户名可以 是 ftp
或者 anonymous
- lftp: sophisticated file transfer program
-lftp [-p port] [-u user [, pass]] [site]
- 常用命令:
- get : 一次下载一个文件。
- mget : 一次下载多个文件。
- put : 一次上传一个文件。
- mput : 一次上传多个文件。
- rm : 一次删除一个文件。
- mrm : 一次删除多个文件。
….
lftget [-c][-d][-v] URL[URL...]
-c
:继续此前的下载。
- the non-interactive network downloader.
- 功能: 非交互式的网络下载工具。
注意: wget命令只能下载文件,而不能下载目录 。如果想下载目录, 可以把该目录打包成文件(tar)。
wget [option]... [URL]...
-b
: 在后台执行下载操作。-q
: 静默模式, 不显示下载进度。-O file
:下载的文件的保存位置。-c
: 续传。--limit-rate=amount
: 以指定的速率传输文件。执行方式
循环执行
1.for循环:
for VARAIBLE in LiST ; do
循环体
done
2. while 循环:
while CONDITION ; do #while循环:进入条件:CONDITION测试为“真”
循环体 #while循环:退出条件:CONDITION测试为“假”
循环控制变量修正表达式
done
3. until 循环:
until CONDITION ; do
循环体 #until循环:进入条件:CONDTITON测试为“假”
循环控制变量修正表达式 #until循环:退出条件:CONDITION测试为“真”
done
示例 打印9X9乘法表:
[root@caibird scripts]# vim show.sh
1 #!/bin/bash
2 # description: 打印九九乘法表
3 # author: caibirdnumberone
4 # author: caibirdnumberone
5 # date : 20180628
6 echo "for 循环"
7 declare j j=0
8
9 for j in {1..9} ; do
10 for i in $(seq 1 $j); do
11 echo -n -e "${i}x${j}"="$[${i}*${j}]\t"
12 done
13 echo
14 done
15
16 sleep 1
17
18 echo "while 循环 "
19
20 declare -i j=1 i=1
21
22 while [ $j -le 9 ]; do
23 while [ $i -le $j ]; do
24 echo -n -e "${i}x${j}=$[${i}*${j}]\t"
25 i+=1
26 done
27 i=1
28 echo
29 j+=1
30 done
31
32
33 sleep 1
34
35
36 echo "until 循环"
37
38 declare -i j=1 i=1
39
40 until [ $i -gt 9 ]; do
41 until [ $j -gt $i ]; do
42 echo -n -e "${j}x${i}=$[${j}*${i}]\t"
43 j+=1
44 done
45 j=1
46 echo
47 i+=1
48 done
49
~
~
"show.sh" 49L, 626C 已写入
[root@caibird scripts]# bash show.sh
for 循环
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
while 循环
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
until 循环
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
[root@caibird scripts]#
[root@caibird scripts]# cat test.sh
#!/bin/bash
# description: 测试192.168.0.0/24网段是否能ping通
# author: caibird_numberone
# version: 1.0
# date: 20180702
echo "下面用until实现"
declare -i i=1
until [ $i -gt 254 ]; do
ip="192.168.0.$i"
ping -c 3 -w 3 -W 3 $ip &> /dev/null
if [ $? -eq 0 ]; then
echo "ping $ip successful"
else
echo "ping $ip fail"
fi
i+=1
done
echo
echo "下面用for 循环实现 "
declare -i j=1
for j in {1..254} ; do
ip="192.168.0.$j"
ping -c 3 -w 2 $ip &> /dev/null
if [ $? -eq 0 ] ; then
echo " ping 192.168.0.$j successful"
else
echo " ping 192.168.0.$j fail"
fi
let j++
done
echo
echo "下面用while循环实现"
declare -i x=1
while [ $x -le 254 ]; do
ip="192.168.0.$x"
ping -c 2 -w 2 $ip &> /dev/null
if [ $? -eq 0 ]; then
echo "ping 192.168.0.$x is successful"
else
echo "ping 192.168.0.$X is fail "
fi
x+=1
done
[root@caibird scripts]#