Linux简介
Linux 是一种自由和开放源码的类 UNIX 操作系统。它具有开方性,多任务,多用户,设备独立性,丰富的网络功能,可靠的系统安全,良好的可移植性等特点
1. Linux常用命令
文件和目录命令
ls 命令
用法: ls [选项] 目录名(可选)
功能:列出目录文件
选项:
- -a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来
- -d :仅列出目录本身,而不是列出目录内的文件数据
- -l :长数据串列出,包含文件的属性与权限等等数据
cd 命令
用法: cd [相对路径或绝对路径]
功能:切换工作目录
pwd 命令
用法:pwd
功能:显示目前所在目录
mkdir 命令
用法:mkdir [选项] 目录名
功能:创建目录
选项:
- -m 访问权限 设置目录的权限
- p 目录树 一次创建多级目录
例子:
touch 命令
用法:touch [选项] 目录或文件
功能:修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件
例子:
mv 命令
用法:mv [选项] 源文件或目录 目标文件或目录
功能:移动或重命名文件或文件夹
选项:
- -b 若存在同名文件,则覆盖之前先备份原来的文件
- -f 强制覆盖同名文件
例子:
cp 命令
用法:cp [选项] 源文件或目录 目标文件或目录
功能:复制文件或目录
选项:
- -b 若存在同名文件,则覆盖之前先备份原来的文件
- -f 强制覆盖同名文件
-r 按递归方式,保留原目录结构进行复制(即复制目录)
rm 命令
*用法:rm [选项] 文件或目录
功能:删除文件或目录
选项
- -f 强制删除,不出现确认信息
- -r 按递归的方式删除目录
例子:
进程命令
ps 命令
用法:ps [选项]
功能:显示进程的状态
选项:
- -a 显示当前终端上所有的进程
- -e 显示系统中的所有进程
- -l 显示进程的详细信息,包括父进程、进程优先级等
- u 显示进程的详细信息,包括CPU和内存的使用率
- x 显示后台进程的信息
- -t 终端号 显示指定终端上的进程信息
例子:
PID 是进程号,%CPU是cpu的使用率,%MEM是进程的使用率,STAT 是进程的状态
kill 命令
用法:kill [选项] 进程号;kill %作业号
功能:终止正在运行的进程或作业
选项:
-9 强制终止指定进程
top 命令
用法: top [选项]
功能:动态显示系统的整体性能信息以及正在运行的进程的相关信息
选项:
- -d <秒数>:指定 top 命令的刷新时间间隔,单位为秒
- -n <次数>:指定 top 命令运行的次数后自动退出
- -p <进程ID>:仅显示指定进程ID的信息
- -u <用户名>:仅显示指定用户名的进程信息
- -H:在进程信息中显示线程详细信息
- -i:不显示闲置(idle)或无用的进程
例子:
PR是进程的优先级,NI是进程的优先级调整值。
用户和用户组命令
useradd 命令
用法:user [选项] 用户名
功能:新建用户账号。只有超级用户才能使用此命令
选项:
- -d 主目录 指定用户的主目录
- -g 组ID 指定用户所属的主要组
- -u 用户ID 指定用户的ID
例子:
passwd命令
用法:passwd [选项][-u <-f>] 用户名
功能:设置密码
选项:
- -d 删除密码
- -l 锁住密码
- -u 解开已上锁的账号
- -f 强制执行
例子:
userdel命令
用法:userdel [-r] 用户名
功能:删除指定的用户账号
选项:
- -r 系统不仅删除此用户账号,并且将用户的主目录也一并删除。不使用-r仅删除用户账号
例子:
groupadd 命令
用法:groupadd [选项] 组名
功能:新建组
选项
- -g 指定新建组的ID
例子:
groupdel 命令
用法:groupadd 组名
功能:删除指定的组,删除前需确保没有任何用户是该组的成员。
例子:
更多命令可查看
Linux命令大全
2. shell脚本编程基础
2.1 构建基础shell脚本
如果想让两个命令一起运行,可以将其放在同一行中,彼此用分号隔开
创建shell脚本文件
在创建shell脚本文件时,必须在文件的第一行指定要使用的shell,格式如下:
#!/bin/bash
date
who
将其保存为test文件
运行
大多数shell命令会产生自己的输出,这些输出会显示在脚本所运行的控制台显示器上。很多时候,我们可能想添加文本消息来告诉用户脚本正在做什么。可以通过echo命令来实现这一点。如果在echo命令后面加上字符串,那么echo命令
就会显示出这个字符串:
#!/bin/bash
echo This is a test
date
echo This is date
将其存为t1文件并运行
使用变量
环境变量
在脚本中,可以在环境变量名之前加上$来引用这些环境变量
#!/bin/bash
# display user information from the system.
echo "User info for userid: $USER"
echo UID: $UID
echo HOME: $HOME
自定义变量
与系统变量类似,用户自定义变量可以通过$引用
#!/bin/bash
days=10
guest="Long"
echo "$guest checked in $days days ago"
days=5
guest="L"
echo "$guest checked in $days days ago"
命令替换
shell脚本中最有用的特性之一是可以从命令输出中提取信息并将其赋给变量。把输出赋给变量之后,就可以随意在脚本中使用,有两种方法可以将命令输出赋给变量。·反引号(`)·$()格式
#!/bin/bash
testing=$(date)
testing2=`pwd`
echo "The date and time are: " $testing
echo "pwd:"$testing2
管道
有时候,需要将一个命令的输出作为另一个命令的输入,就可以使用管道
数学运算
expr,该命令可在命令行中执行数学运算
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b 结果为 -10。 |
* | 乘法 | expr $a \* $b 结果为 200。 |
/ | 除法 | expr $b / $a 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | a=$b 把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
退出脚本
exit 状态码(0~255)
演练
计算两个日期之间相隔的天数
#!/bin/bash
date1="Jan 1, 2023"
date2="May 1, 2022"
time1=$(date -d "$date1" +%s)
time2=$(date -d "$date2" +%s)
diff=$(expr $time2 - $time1)
secondsinday=$(expr 24 \* 60 \* 60)
days=$(expr $diff / $secondsinday)
echo "The difference between $date2 and $date1 is $days days"
2.2 结构化命令
if-then语句
bash shell的if语句会运行if之后的命令。如果该命令的退出状态码为0(命令成功运行)
,那么位于then部分的命令就会被执行。如果该命令的退出状态码是其他值,则then部分的命令不会被执行,bash shell会接着处理脚本中的下一条命令。fi语句用来表示if-then语句到此结束。
#!/bin/bash
if pwd
then
echo "it worked"
fi
这里的notexist 是不存在的命令,它的退出状态码不是0
#!/bin/bash
if notexist
then
echo "it worked"
fi
echo "hi, it not exist"
if-then-else语句
if-then-else语句在语句中提供了另外一组命令:
if command
then
commands
else
commands
fi
当if语句中的命令返回退出状态码0时,then部分中的命令会被执行,这跟普通的if-then语句一样。当if语句中的命令返回非0退出状态码时,bash shell会执行else部分中的命令。
case语句
有了case命令,就无须再写大量的elif语句来检查同一个变量的值了,类似与C语言中的switch-case
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac
2.3 更多结构化命令
for命令
bash shell提供了for命令,以允许创建遍历一系列值的循环。每次迭代都使用其中一个值来执行已定义好的一组命令
for var in list
do
commands
done
演示
#!/bin/bash
for test in Alabama Alaska Arizona Arkansas California Colorado
do
echo The next state is $test
done
还有另一种格式的for ,类似于C语言的for循环的基本格式
for (( variable assignment ; condition ; iteration process ))
演示
#!/bin/bash
for (( i=1; i <= 10; i++ ))
do
echo "The next number is $i"
done
while命令
演示
#!/bin/bash
var1=10
while [ $var1 -gt 0 ]
do
echo $var1
var1=$[ $var1 - 1 ]
done
类似于C语言
int var1 = 10;
while(var1 > 0)
{
print("%d\n",&var1);
var1--;
}
until命令
与while命令工作的方式完全相反,until命令要求指定一个返回非0退出状态码的测试命令。只要测试命令的退出状态码不为0,bash shell就会执行循环中列出的命令。一旦测试命令返回了退出状态码0,循环就结束了
until test commands
do
other commands
done
演示
#!/bin/bash
var1=100
until [ $var1 -eq 0 ]
do
echo $var1
var1=$[ $var1 - 25 ]
done
循环控制break命令和continue命令
和C语言类似
break是跳出单个循环,我们也可用使用break n
跳出指定循环层级
演示
#!/bin/bash
for (( a = 1; a < 4; a++ ))
do
echo "Outer loop: $a"
for (( b = 1; b < 100; b++ ))
do
if [ $b -gt 4 ]
then
break 2
fi
echo " Inner loop: $b"
done
done
continue命令可以提前中止某次循环,但不会结束整个循环,和break命令一样,continue命令也允许通过命令行参数指定要继续执行哪一级循环continue n
演示
#!/bin/bash
for (( a = 1; a <= 5; a++ ))
do
echo "Iteration $a:"
for (( b = 1; b < 3; b++ ))
do
if [ $a -gt 2 ] && [ $a -lt 4 ]
then
continue 2
fi
var3=$[ $a * $b ]
echo " The result of $a * $b is $var3"
done
done
3 shell脚本编程进阶
3.1 函数
函数基础
在shell脚本中创建函数的语法有两种
第一种
function name {
commands
}
第二种
name() {
commands
}
演示
#!/bin/bash
function func1 {
echo "This is an example of a function1"
}
func2(){
echo "Now this is the end of the function2"
}
count=1
while [ $count -le 5 ]
do
func1
count=$[ $count + 1 ]
done
func2
函数返回值
在默认情况下,函数的退出状态码是函数中最后一个命令返回的退出状态码。
也可使用return
命令以特定的退出状态码退出函数
演示
#!/bin/bash
function dbl {
read -p "Enter a value: " value
echo "doubling the value"
return $[ $value * 2 ]
}
dbl
echo "The new value is $?"
函数执行结束后,可以使用标准变量$?
来确定函数的退出状态码
使用函数输出
函数可以使用标准的位置变量来表示在命令行中传给函数的任何参数。例如,函数名保存在$0
变量中,函数参数依次保存在$1
、$2
等变量中。也可以用特殊变量$#
来确定传给函数的参数数量
演示
#!/bin/bash
# passing parameters to a function
function addem {
if [ $# -ne 2 ]
then
echo -1
else
echo $[ $1 + $2 ]
fi
}
echo -n "Adding 10 and 15: "
value=$(addem 10 15)
echo $value
echo -n "Let's try adding just one number: "
value=$(addem 10)
echo $value
echo -n "Now try adding no numbers: "
value=$(addem)
echo $value
echo -n "Finally, try adding three numbers: "
value=$(addem 10 15 20)
echo $value
这里定义了一个函数,如果它的参数个数是2个则相加,不是2个则为-1
向函数传递数组
如果直接向函数传递数组,则函数只会提取数组变量的第一个元素.
所有,可用将数组变量拆解成多个数组元素,然后将这些数组元素作为函数参数传递。最后在函数内部,将所有的参数重新组合成一个新的数组变量
演示
#!/bin/bash
function addarray {
local sum=0
local newarray
newarray=(`echo "$@"`)
for value in ${newarray[*]}
do
sum=$[ $sum + $value ]
done
echo $sum
}
myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
arg1=$(echo ${myarray[*]})
result=$(addarray $arg1)
echo "The result is $result"
函数返回数组
也使用类似的方法
演示
#!/bin/bash
function arraydblr {
local origarray
local newarray
local elements
local i
origarray=($(echo "$@"))
newarray=($(echo "$@"))
elements=$[ $# - 1 ]
for (( i = 0; i <= $elements; i++ ))
{
newarray[$i]=$[ ${origarray[$i]} * 2 ]
}
echo ${newarray[*]}
}
myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
arg1=$(echo ${myarray[*]})
result=($(arraydblr $arg1))
echo "The new array is: ${result[*]}"
函数递归
shell函数也可用采用递归进行调用
演示
这是一个简单的求阶乘的函数
function factorial {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[ $1 - 1 ]
local result=$(factorial $temp)
echo $[ $result * $1 ]
fi
}
result=$(factorial 10)
echo "The factorial of 10 is $result"
3.2 输入/输出重定向
标准文件描述符
Linux系统会将每个对象当作文件来处理,这包括输入和输出。
执行一个shell命令行时通常会自动打开三个标准文件
- 标准输入文件(stdin),通常对应终端的键盘;
- 标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。
文件描述符 | 缩写 | 描述 | 指向设备 |
---|---|---|---|
0 | STDIN | 标准输入 | 键盘 |
1 | STDOUT | 标准输出 | 显示器 |
2 | STDERR | 标准错误 | 显示器 |
输入重定向
把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。
使用“ < ”符号将标准输入重定向到文件中
输出重定向
输出重定向
把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。这样,该命令的输出就不显示在屏幕上,而是写入到指定文件中。
-
使用 “ > ”符号,将标准输出重定向到文件中。形式为:命令>文件名
-
使用“ >> ”符号,将标准输出结果追加到指定文件后面。形式为:命令>>文件名
-
使用“ 2> ”符号,将标准错误输出重定向到文件中。形式为:命令 2> 文件名
-
使用“ 2>> ”符号,将标准错误输出追加到指定文件后面。形式为:命令 2>>文件名
-
使用“ 2>&1 ”符号或“ &> ”符号,将把标准错误输出stderr重定向到标准输出stdout
-
使用“ >/dev/null ”符号,将命令执行结果重定向到空设备中,也就是不显示任何信息。
在脚本中重定向输出
在脚本中重定向输出的方法有两种。
- 临时重定向每一行。
- 永久重定向脚本中的所有命令。
临时重定向:
例子
#!/bin/bash
echo "This is an error" >&2
echo "This is normal output"
通过STDOUT显示的文本出现在了屏幕上,而送往STDERR的echo语句的文本则被重定向到了输出文件。
永久重定向:
例子
#!/bin/bash
exec 1>testout
echo "This is a test of redirecting all output"
echo "from a script to another file."
echo "without having to redirect every individual line"
在脚本中重定向输入
例子:
#!/bin/bash
exec 0< testout
count=1
while read line
do
echo "Line #$count: $line"
count=$[ $count + 1 ]
done
3.3 创建库
使用函数可以为脚本省去一些重复性的输入工作,这一点是显而易见的。但如果你碰巧要在多个脚本中使用同一段代码呢?就为了使用一次而在每个脚本中都定义同样的函数,这显然很麻烦。有一种方法能解决这个问题。bash shell允许创建函数库文件,然后在多个脚本中引用此库文件。
有点类似与C语言的头文件
例子
第一步,创建公用库文件
#!/bin/bash
# my functions
function addem {
echo $[ $1 + $2 ]
}
function multem {
echo $[ $1 * $2 ]
}
function divem {
if [ $2 -ne 0 ]
then
echo $[ $1 / $2 ]
else
echo -1
fi
}
第二步 使用这个库文件
使用函数库的关键在于source命令
#!/bin/bash
# using a library file the wrong way
source ./myfuncs
result=$(addem 10 15)
echo "The result is $result"
source命令有个别名,称作点号操作符。要在shell脚本中运行myfuncs库文件,只需添加下面这一行代码:
. ./myfuncs
3.4 条件测试与比较
执行条件测试表达式后通常会返回“真”或“假”,就像执行命令后的返回值为0表示真,非0表示假一样。
条件测试语句 | 说明 |
---|---|
test <测试表达式> | 利用test命令进行条件测试表达式 |
[ <测试表达式> ] | 通过[] 进行条件测试表达式,和test相同。[]的边界与内容之间至少有一个空格 |
[[ <测试表达式> ]] | 通过[[]]进行条件测试表达式 ,和[]一样,边界与内容至少有一个空格 |
((<测试表达式>)) | 通过(())进行条件测试表达式,两端不需要有空格 |
文件测试表达式
参数 | 说明 |
---|---|
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
例子:
#!/bin/bash
if test -e func
then
echo 'file exist!'
else
echo 'file not exist!'
fi
整数二元比较
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
例子:
#!/bin/bash
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo 'equal'
else
echo 'not equal'
fi
字符串测试表达式
参数 | 说明 |
---|---|
= | 等于则为真 |
!= | 不相等则为真 |
-z | 字符串 字符串的长度为零则为真 |
-n | 字符串 字符串的长度不为零则为真 |
例子:
#!/bin/bash
[ -n "abc" ] && echo 1 || echo 0
逻辑操作符
[ ]和test中使用 | [[ ]]和(( ))中使用 | 说明 |
---|---|---|
-a | && | and,与,两端为真则为真 |
-o | || | or,或,两端有一个为真则为真 |
! | ! | not,非,两端相反,则结构为真 |
例子
#!/bin/bash
[ 5 -eq 6 -a 5 -gt 3 ] && echo 1 || echo 0
4 网络管理
4.1 网络接口配置
ifconfig命令
如果不使用任何参数,输入ifconfig命令时将会输出当前系统中所有处于活动状态的网络接口
eth0
表示的是以太网的第一块网卡,eth1
则表示第二块。
inet
是指该网卡当前的IP地址, netmask
是子网掩码,broadcast
是广播地址
inet6
则是ipv6的地址,
RX
和TX
分别代表接收和发送的包,
如果在ifconfig命令后面跟上具体设备的名称(比如eth0),则只显示指定设备的相关信息
如果需要手动修改IP地址等可采用如下命令
ifconfig eth0 192.168.1.2 netmask 255.255.255.0
也可简写成
ifconfig eth0 192.168.1.2/24
这是指明了其ip地址与子网掩码,通过ip地址与子网掩码可用算出广播地址,当然也可用显示的设置
ifconfig eth0 192.168.159.130 broadcast 192.168.159.255
手动断网与开启网卡则为:
关闭
ifconfig eth0 down
ifdown eth0
开启
ifconfig eth0 up
ifup eth0
配置文件
ifconfig命令可以直接配置网卡IP,但是这属于一种动态的配置,所配置的信息只是保存在当前运行的内核中。一旦系统重启,这些信息将丢失。为了能在重启后依然生效,可以在相关的配置文件中保存这些信息,这样,系统重启后将从这些配置文件中读取出来。
CentOS
系统的网络配置文件所处的目录为/etc/sysconfig/network-scripts/,eth0的配置文件为ifcfg-eth0,如果有第二块物理网卡,则配置文件为ifcfg-eth1
DEVICE
变量定义了设备的名称;BOOTPROTO
变量定义了获取IP的方式,这里BOOTPROTO=dhcp
的含义是:系统在启用这块网卡时,IP将会通过dhcp的方式获得;还有个可选的值是static,表示静态设置的IP;ONBOOT
变量定义了启动时是否激活使用该设备,yes表示激活,no表示不激活
修改如下:
#ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.159.129
NETMASK=255.255.255.0
静态化地为系统配置一个IP(这里假设IP为192.168.159.129,子网掩码为255.255.255.0)
修改完成后,如果要想立即生效,可以将端口先停用再启用,或者重启网络服务。
#端口先停用再启用
ifconfig eth0 down
ifconfig eth0 up
#重启网络服务
service network restart
第一种不适用与远程操控。
4.2 网关设置
Linux主机之间是使用IP进行通信的,假设A主机和B主机同在一个网段内且网卡都处于激活状态,则A具备和B直接通信的能力。
但是如果A主机和B主机处于两个不同的网段,则A必须通过路由器才能和B通信
在Linux中可使用route命令
添加默认网关
route add default gw 网关地址
这边使用虚拟机操作,可以看见已经不能进行通信了
linux下
route add -net 192.168.80.0/24 gw 192.168.2.3
windows
route -p add 192.168.80.0 mask 255.255.255.0 192.168.1.6
route del default gw 192.168.2.3
或者
route del defalut
添加网关后,可以使用route-n查看系统当前的路由表
同样的,如果只使用route命令添加网关,一旦系统重启,配置信息就不存在了,必须将这种配置信息写到相关的配置文件中才能永久保存。可以在网卡配置文件中使用GATEWAY变量来定义网关,只需要添加如下部分到ifcfg-eth0中即可,当然别忘了重启网络服务使配置生效。
4.3 网络测试工具
ping
ping程序的目的在于测试另一台主机是否可达,一般来说,如果ping不到某台主机,就说明对方主机已经出现了问题,但是不排除由于链路中防火墙的因素、ping包被丢弃等原因而造成ping不通的情况。
如果不按ctrl+c
会一直ping下去。
我们可以使用以下命令
参数 | 含义 |
---|---|
-c | 指定ping的次数 |
-i | 指定ping包的间隔 |
-w | 如果ping没有回应,则在超时时间后退出 |
host
host命令是用来查询DNS记录的,如果使用域名作为host的参数,命令返回该域名的IP
traceroute
用于显示数据包到主机间的路径。
traceroute指令可以追踪网络数据包的路由途径,预设数据包大小是60Bytes,可另行设置。
参数 | 说明 |
---|---|
-d | 使用Socket层级的排错功能 |
-g | <网关> 设置来源路由网关,最多可设置8个 |
-i | <网络界面> 使用指定的网络界面送出数据包 |
-I | 使用ICMP回应取代UDP资料信息 |
-m | <存活数值> 设置检测数据包的最大存活数值TTL的大小 |
-n | 直接使用IP地址而非主机名称 |
-v | 详细显示指令的执行过程 |
-w | <超时秒数> 设置等待远端主机回报的时间 |
-x | 开启或关闭数据包的正确性检验 |
5. 进程管理
5.1 什么是进程
进程表示程序的一次执行过程,它是应用程序的运行实例,是一个动态的过程。或者可以更简单地描述为:进程是操作系统当前运行的程序。当一个进程开始运行时,就是启动了这个过程。进程包括动态执行的程序和数据两部分。
每一个进程都是操作系统进行资源调度和分配的一个独立单位。
所有的进程都可能存在3种状态:运行态
、就绪态
、阻塞态
运行态
表示程序当前实际占用着CPU等资源;就绪态
是指程序除CPU之外
的一切运行资源都已经就绪,等待操作系统分配CPU资源,只要分配了CPU资源,即可立即运行;而阻塞态
是指程序在运行的过程中由于需要请求外部资源
(例如I/O资源、打印机等低速的或同一时刻只能独享的资源)而当前无法继续执行,从而主动放弃当前CPU资源
转而等待所请求资源。
5.2 相关命令
在第一节常用命令中已经学习了 ps
、top
、kill
命令了。这里就不做赘述了。
killall
killall命令,它可以直接使用进程的名字而不是PID
lsof
lsof(list open files)是一个列出当前系统中所有打开文件的工具。
Linux中一切皆文件,所以在系统中,被打开的文件可以是普通文件、目录、网络文件系统中的文件、字符设备、管道、socket等
用法: lsof [options] filename
参数 | 说明 |
---|---|
lsof filename | 显示打开指定文件的所有进程 |
lsof-c string | 显示COMMAND列中包含指定字符的进程所有打开的文件 |
lsof-u username | 显示所属于user进程打开的文件 |
lsof-g gid | 显示归属于gid的进程情况 |
lsof +d /DIR | /显示目录下被进程打开的文件 |
lsof +D /DIR/ | 同上,但是会搜索目录下的所有目录,时间相对较长 |
lsof-d FD | 显示指定文件描述符的进程 |
lsof-n | 不将IP转换为hostname,默认是不加-n参数 |
lsof-i | 用以显示符合条件的进程情况 |
字段 | 说明 |
---|---|
COMMAND | 进程的名称 |
PID | 进程标识符 |
USER | 进程所有者 |
FD | 文件描述符,应用程序通过文件描述符识别该文件 |
TYPE | 文件类型,如DIR、REG等。DEVICE:磁盘的名称 |
SIZE | 文件大小 |
NODE | 索引节点 |
NAME | 打开文件的全路径名称 |
也可以查看端口号
nice、renice
使用top命令输出中有NI字段
,标记了对应进程的优先级,该字段的取值范围是-20~19
,数值越低代表优先级越高,也就能更多地被操作系统调度运行,如果一个进程在启动时并没有设定nice优先级,则默认使用0。普通用户也可以给自己的进程设定nice优先级,但是范围只限于0~19。不过top中不是还有一个PR字段吗,它也是进程的“优先级”,这两个概念怎么理解呢?实际上,Linux使用了“动态优先级”的调度算法来确定每一个进程的优先级,一个进程的最终优先级=优先级+nice优先级。
nice命令仅限于在启动一个进程的时候同时赋予其nice优先级
对于已经启动的进程,可以用renice命令进行修改,不过,这需要先查询出该进程的PID(使用ps命令)
可以看见已经把进程号(PID)为1222的nice优先级修改为-20了
6. 磁盘管理
6.1 磁盘监控iostat
iostat [选项] (参数)
选项 | 说明 |
---|---|
-c | 仅显示CPU使用情况; |
-d | 仅显示设备利用率; |
-k | 显示状态以千字节每秒为单位,而不使用块每秒; |
-m | 显示状态以兆字节每秒为单位; |
-p | 仅显示块设备和所有被使用的其他分区的状态; |
-t | 显示每个报告产生时的时间; |
-V | 显示版号并退出; |
-x | 显示扩展状态。 |
参数为 间隔时间
(每次报告的间隔时间 秒)与 次数
(显示报告的次数)
avg-cup即cpu的属性值
参数 | 说明 |
---|---|
%user | CPU处在用户模式下的时间百分比 |
%nice | CPU处在带NICE值的用户模式下的时间百 |
%system | CPU处在系统模式下的时间百分比 |
%iowait | CPU等待输入输出完成时间的百分比 |
%steal | 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比 |
%idle | CPU空闲时间百分比 |
device中的参数说明:
参数 | 说明 |
---|---|
tps | 该设备每秒的传输次数 |
kB_read/s | 每秒从设备(drive expressed)读取的数据量 |
kB_wrtn/s | 每秒向设备(drive expressed)写入的数据量 |
kB_read | 读取的总数据量 |
kB_wrtn | 写入的总数量数据量 |
6.2 创建文件系统:fdisk
fdisk 是一个创建和维护分区表的程序,它兼容 DOS 类型的分区表、BSD 或者 SUN 类型的磁盘列表。
必要参数
- -l 列出素所有分区表
- -u 与 -l 搭配使用,显示分区数目
参数 | 说明 |
---|---|
m | 显示菜单和帮助信息 |
a | 活动分区标记/引导分区 |
d | 删除分区 |
l | 显示分区类型 |
n | 新建分区 |
p | 显示分区信息 |
q | 退出不保存 |
t | 设置分区号 |
v | 进行分区检查 |
w | 保存修改 |
x | 扩展应用,高级功能 |