Linux系统基础

学习内容

这里写图片描述

linux档案与目录查询

0.相对路径与绝对路径
绝对路径:由”/”开始的,如/usr/xxx/.绝对路径的正确度要比较好,如果
是在写程序 (shell scripts) 来管理系统的条件下,务必使用绝对路径的写法
相对路径:不是有“/”开始的,如“../usr/xxx”
1.clear 清屏(翻到下页)
2.cd 打开目录
- 打开前一个目录
/ 打开根目录
~目前用户的家用户
~user 打开用户主页
3.mkdir 创建目录
-m:设置权限
-p:可以直接创建多层目录
4 rmdir 删除目录
-p:连接上层空的目录也一起删除
5.rm -rf 删除文件
-r删除目录
-f强制删除
-i:互动模式,在删除前会询问使用者是否动作
注意:root用户在root文件夹下,普通用户在home文件下
6.pwd 查看当前目录
-p 指向真正的文件的路径,而不是连接
7. ls 查看目录
-a:连同隐藏文件(以.为开头的文件)全部显示
-A :不包括..与.这两个目录
-d :仅列出目录本身,而不是列出目录内的档案数据
-f: :直接列出结果,不会进行排序(ls命令有将档名排序的功能)
-F :给予附加的数据结构。例如:*代表可执行档,/代表目录,=代表socket档案,|代表FIFO档案
-h :列出文件大小
-i 列出incode位置
-l :列出各文件属性
-n :列出 UID 与 GID 而非使用者与群组的名称 (UID 与 GID 会在账号管理提到!)
-r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;
-R :连同子目录内容一起列出来;
-S :以档案容量大小排序!
-t :依时间排序
–color=never :不要依据档案特性给予颜色显示;
–color=always :显示颜色
–color=auto :让系统自行依据设定来判断是否给予颜色
–full-time :以完整时间模式 (包含年、月、日、时、分) 输出
–time={atime,ctime} :输出 access 时间或 改变权限属性时间 (ctime)
而非内容变更时间 (modification time)
8.cp (来源档)…(来源档)(目的档):复制档案或目录
-a :相当于 -pdr 的意思;
-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;
-f :为强制 (force) 的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;
-i :若目的檔(destination)已经存在时,在覆盖时会先询问是否真的动作!
-l :进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;
-p :连同档案的属性一起复制过去,而非使用预设属性;
-r :递归持续复制,用于目录的复制行为;
-s :复制成为符号连结文件 (symbolic link),亦即『快捷方式』档案;
-u :若 destination 比 source 旧才更新 destination !
9.mv(来源档)…(来源档)(目的档):移动档案或目录。
-f :force 强制的意思,强制直接移动而不询问;
-i :若目标档案 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标档案已经存在,且 source 比较新,才会更新 (update)
10 查看档案
•cat 由第一行开始显示档案内容
• tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
• nl 显示的时候,顺道输出行号!
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号;
-b t :如果有空行,空的那一行不要列出行号;
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加 0 ;
-n rz :行号在自己字段的最右方显示,且加 0 ;
-w :行号字段的占用的位数。
• more 一页一页的显示档案内容
空格键 (space):代表向下翻一页;
Enter :代表向下翻『一行』;
/字符串 :代表在这个显示的内容当中,向下搜寻『字符串』;
:f :立刻显示出文件名以及目前显示的行数;
q :代表立刻离开 more ,不再显示该档案内容。
• less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
空格键 :向下翻动一页;
[pagedown]:向下翻动一页;
[pageup] :向上翻动一页;
/字符串 :向下搜寻『字符串』的功能;
?字符串 :向上搜寻『字符串』的功能;
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
q :离开 less 这个程序;
• head 只看头几行
• tail 只看尾巴几行
• od 以二进制的方式读取档案内容!
11.touch :修改或创建档案
-a :仅修订 access time;
-c :仅修改时间,而不建立档案;
-d :后面可以接日期,也可以使用 –date=”日期或时间”
-m :仅修改 mtime ;
-t :后面可以接时间,格式为[YYMMDDhhmm]
12 umask 查看预设创建文件的权限
-###:预设创建的文件的权限
13 查找档案
•whereis (寻找特定档案)
-b :只找 binary 的档案
-m :只找在说明文件 manual 路径下的档案
-s :只找 source 来源档案
-u :没有说明档的档案!
•locate (文件)
•find 高级的查找方式

档案的压缩与打包

1.zip格式(书上没有提到):
压缩:
zip 压缩文件名 源文件
zip -r 压缩文件名 源目录
解压缩:
unzip 解压文件
2..gz格式
压缩:
gzip -cdt# 源文件
-c 将压缩的数据输出到屏幕上,可透过数字流重导向来处理
-d 解压文件
-# 压缩等级,-1最快,压缩比最差,-9最慢!预设是6
zcat 文件:查看解压之后的文件内容
3..bz2格式
压缩:
bzip2 源文件(源文件会消失)
bzip2 -k 源文件(源文件会保留)
-d:解压缩
注:不能压缩目录
bzcat 文件:查看解压的文件
4..tar格式
打包:
tar -cvf 打包文件名 源文件
-c 打包
-x:解包
-v显示过程
-f 指定打包后的文件(此参数后不可再加参数)
-z打包压缩成(解压)tar.gz
-j打包压缩成(解压)tar.bz2
-p :使用原档案的原来属性(属性不会依据使用者而变)
-P :可以使用绝对路径来压缩!
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的档案中!
–exclude FILE:在压缩的过程中,不要将 FILE 打包!
5..Z格式(此格式已经淘汰)
compress -dcr 档案或目录
-d :解压缩
-r:连同目录下的档案同时给予压缩
-c:显示压缩数据

vi,vim文字处理器

vi的使用
一般指令模式:打开文件即此模式,按下i键(或I,o, O, a, A, r, R)进入编辑模式,:进入指令列表模式。
Ctrl+f:屏幕向下移动一页
Ctrl+b:屏幕向上移动一页
Ctrl+d:屏幕向下移动半页
Ctrl+u:屏幕向上移动半页
” n↓”表示向下n页。”n↑”表示向上n页。
/word:查找文件中“word”这个字符串
x:向前删除一个字符
nx:向前删除n个字符
dd:删除光标所在行。
ndd:删除光标下n列
yy:复制光标所在行
nyy:复制光标下n行
p,P:将已复制数据贴在光标上/下一行。
u:复原前一个动作
Ctrl+r:重做上一个动作。
编辑模式:对文件进行修改,esc进入一般指令模式。
指令列表模式::wq保存并退出vi。
:w:将编辑的数据写入硬盘档案中。
:q:离开vi
vim使用
用法和vi一样。相对于vi来说,vim具有颜色显示功能,最后一行显示信息文件内容信息。并且支持许多程序语法
区块选择:
v:字符选择,会将光标经过的地方反白选择
V:行选择,经过的行反白选择
y:反白区块复制
d:将反白的区块删除
多档案编辑;
:n编辑下一个档案
:N编辑上一个档案
:file列出这个vim的开启的所有档案。
多窗口功能
同时打开多个窗口:指令列模式下输入sp filename
Ctrl+wj:进入下个窗口
Ctrl+wk:光标进入上面的窗口。
Ctrl+wq结束离开
vim环境设定
:set nu显示行数
DOS和linux的断行字符

Bash shell

一、shell介绍
什么是shell
1.shell是用C语言编写的程序,他是用户使用linux的桥梁,shell既是一种命令语言,又是程序设计语言。
2.shell是一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
3.shell种类众多:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
shell脚本
shell脚本是一种为shell编写的脚本程序,业界所说的shell通常指得是shell脚本。
但shell和shell脚本是两个不同的概念
bash shell的功能
1.命令编写功能(可以保存历史命令)
2.命令与档案补全功能:[Tab]键
3.命令别名设定功能
4.功能控制、前景背景控制
5.shell script的强大功能
6.万用字符
内建命令查询:type 用法:type [-tpa] name
1.不加参数时,则type会显示name是否是bash内建命令
2.-p:会显示完整文件名(外部指令)或显示为内建指令。
3.-a:会将由path变量定义的路径中,将所有包含name的指令都列出来。
4.-t:会显示具体意义。
二、shell变量
变量类型
1.局部变量:用户自定义变量。
局部变量在脚本或命令中定义,仅在当前shell实例中有效,可以在shell程序内任意使用和修改它们,
其他shell启动的程序不能访问局部变量。
2.环境变量:所有的程序,包括shell启动的程序,都能访问环境变量。环境变量可以是用户自定义的,
也可以是系统专用的(比如: CUXTOP C U X T O P 、 ORACLE_HOME)。环境变量只有少数用户可以在shell加以中修改。
3.系统变量:
由系统提供,与环境变量不同的是用户不能修改它们
下面两种变量就是系统特殊的内部变量,将在【传递参数】中详细阐述
位置参数变量
通过命令行给程序传递执行产生
可用shift命令实现位置参数的迁移
专用参数变量
Bash预定义的特殊变量
用户不能修改其值
环境变量
1.env:列出目前的shell环境下的所有环境变量与其内容
2.export:列出目前的shell环境下的所有环境变量与其内容
3.set:其他所有变量说明
变量的设定、读取、取消
1.设定:变量名=变量内容
2.读取:echo 3.unset1.read:p:t:eg:readpPleasekeyinyourname:t30named2.declare/typesedeclare[aixr]vala:i:x:exportr:shellaliasunaliasegaliaslm=lsl|moreunaliaslmhistoryhistory[n]history[c]history[raw]histfilesnncshellhistoryahistoryhistfileshistfiles /.bashhistoryrhistfilesshellhistorywhistoryhistfilesecho 变 量 名 3. 取 消 变 量 : u n s e t 变 量 名 变 量 键 盘 读 取 、 数 组 与 宣 告 1. r e a d : 读 取 来 自 键 盘 输 入 的 变 量 − p : 后 面 接 提 示 字 符 − t : 后 面 可 以 接 秒 数 。 e g : r e a d − p “ P l e a s e k e y i n y o u r n a m e : ” − t 30 n a m e d 2. d e c l a r e / t y p e s e 用 法 : d e c l a r e [ − a i x r ] v a l − a : 数 组 型 − i : 整 型 − x : 与 e x p o r t 用 法 一 样 , 将 后 面 的 变 量 设 置 成 环 境 变 量 − r : 将 变 量 设 置 为 可 读 , 不 能 被 修 改 , 不 能 被 取 消 三 、 s h e l l 命 令 别 名 和 历 史 命 令 命 令 别 名 设 定 : a l i a s , u n a l i a s e g : a l i a s l m = ′ l s − l | m o r e ‘ u n a l i a s l m 取 消 设 定 历 史 别 名 : h i s t o r y 用 法 : h i s t o r y [ n ] ; h i s t o r y [ − c ] ; h i s t o r y [ − r a w ] h i s t f i l e s n : 数 字 , 意 思 是 要 列 出 最 近 的 n 笔 命 令 列 表 的 意 思 − c : 将 目 前 的 s h e l l 中 的 所 有 h i s t o r y 内 容 全 部 消 除 − a : 将 目 前 新 增 的 h i s t o r y 指 令 新 增 入 h i s t f i l e s 中 , 若 没 有 加 h i s t f i l e s , 则 预 设 写 入   / . b a s h h i s t o r y − r : 将 h i s t f i l e s 的 内 容 读 到 目 前 这 个 s h e l l 的 h i s t o r y 记 忆 中 ; − w : 将 目 前 的 h i s t o r y 记 忆 内 容 写 入 h i s t f i l e s 中 e c h o HISTSIZE 查看设置的历史命令的大小
四、bash shell的使用环境(简单了解)
终端机的环境设定: stty, set
环境设定档: bashrc, ~/.bashrc, ~/.profile, profile…,/etc/inputrc, source
登录讯息显示数据: /etc/issue, /etc/motd
五、shell数据流重导向
重定向
标准输入 0 <或<<
标准输出 1 >或>>
标准错误输出 2 2>或2>>
(1)输出重定向
格式:command [1-2]> file
例:
#关闭 1 ,2 文件描述符
ls test.sh test1.sh 1>&- 2>&-
将1,2 输出转发给/dev/null设备
ls test.sh test1.sh 2>/dev/null 1>/dev/null
将错误输出2 绑定给 正确输出 1,然后将 正确输出 发送给 /dev/null设备 这种常用
ls test.sh test1.sh >/dev/null 2>&1
&代表标准输出 ,错误输出 将所有标准输出与错误输出 输入到/dev/null文件
ls test.sh test1.sh &>/dev/null
注意:
1、shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。
不存在直接创建。 无论左边命令执行是否成功。右边文件都会变为空。
2、“>>”操作符,判断右边文件,如果不存在,先创建。
3、当命令:执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。
4、一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。
5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行
(2)输出重定向
格式:command

shell script

(1)认识shell script
shell的基本元素:
1.#!/bin/bash
2.#注释
3.程序
shell中的符号
1.注释符:#
2.$:变量符
3.单引号:普通的字符串
4.双引号:可以包含变量,转移符\、倒引号等功能,其余视为字符串
5.倒引号:shell命令使用倒引号。echo
pwd`
6.反斜杠:转移符\。注:单引号加转移符失去作用
(2)shell变量
变量类型:
局部变量:用户自定义变量
shell环境变量:可以是用户定义的,也可以是系统专用的
内部变量:由系统提供,不可修改
位置参数变量:通过命令行给程序传递执行产生,可用shift实现位置参数的迁移。
专用参数变量:bash预定义的特殊变量,用户不能修改其值。
变量使用:变量的替换(适用整型)
str:word:strword, s t r : − w o r d : s t r 不 存 在 或 空 值 则 值 为 w o r d , 不 赋 值 。 {str:=word}:srt不存在或空值则值为word,同时将word赋值给str。
str:?word:strword, s t r : ? w o r d : s t r 不 存 在 或 空 值 则 为 w o r d , 并 终 止 脚 本 {str:+word}:str存在并非空则为word,
变量使用:字符串的计数、截取
{#str}:str的长度 {#str}:str的长度 {str:n}:从第n个开始,截取到最后一个字符
str:n:len:nlen s t r : n : l e n : 从 第 n 个 开 始 , 截 取 长 度 为 l e n 的 字 符 串 {str#match_str}:删除从左与match_str匹配的最小部分
{str##match_str}:删除从左与match_str匹配最大部分 {str##match_str}:删除从左与match_str匹配最大部分 {str%match_str}:删除从右与match_str匹配最小部分
{str%%match_str}:删除从右与match_str匹配最大部分 {str%%match_str}:删除从右与match_str匹配最大部分 {str/oldstr/newstr}:用newstr替换第一次出现的oldstr
str//oldstr/newstr:newstroldstr s t r / / o l d s t r / n e w s t r : 用 n e w s t r 替 换 所 有 的 o l d s t r {str/#oldstr/newstr}:用newstr替换靠近开头的oldstr
{str/%oldstr/newstr}:用newstr替换靠近结尾oldstr。  
(3) shell内置命令:declare  
             -r :只读  
              -x:将变量输出到子shell中(export为全局变量)  
              -i:将变量设置为整型。  
              -a:设置为数组  
              -f:列出函数的名称和定义  
              -F:只列出函数名  
(4)SHELL传递参数  
 位置参数  
是一组特殊的内置变量  
跟在脚本后面的用空格隔开的每个字符串
{str/%oldstr/newstr}:用newstr替换靠近结尾oldstr。  (3) shell内置命令:declare               -r :只读                -x:将变量输出到子shell中(export为全局变量)                -i:将变量设置为整型。                -a:设置为数组                -f:列出函数的名称和定义                -F:只列出函数名  (4)SHELL传递参数   位置参数  是一组特殊的内置变量  跟在脚本后面的用空格隔开的每个字符串
1 表示第一个参数值,......, 99 9 表 示 第 9 个 参 数 值 {10} 表示第10个参数值, 1111..shell/shell 11 表 示 第 11 个 参 数 值 , … . . 位 置 参 数 的 用 途 从 s h e l l 命 令 / 脚 本 的 命 令 行 接 受 参 数 在 调 用 s h e l l 函 数 时 为 其 传 递 参 数 专 用 参 数 命 令 行 参 数 相 关 * 将所有位置参数看成一个字符串(以空格间隔)
@ @ 将 每 个 位 置 参 量 看 成 单 独 的 字 符 串 ( 以 空 格 间 隔 ) “ *” 将所有位置参量看成一个字符串(以 IFS I F S 间 隔 ) “ @” 将每个位置参量看成单独的字符串(以空格间隔)
0shell 0 命 令 行 上 输 入 的 s h e l l 程 序 名 # 表示命令行上参数的个数
进程状态相关
? ? 表 示 上 一 条 命 令 执 行 后 的 返 回 值 当 前 进 程 的 进 程 号 ! 显示运行在后台的最后一个作业的PID
Shift[n]n使5使1.:arrayname=(v1v2v3)2.使declaredeclareastrstr=(1234)3. 在 此 之 前 执 行 的 命 令 后 脚 本 的 最 后 一 个 参 数 S h i f t [ n ] 将 位 置 参 数 列 表 依 次 左 移 n 次 , 缺 省 为 左 移 一 次 一 旦 位 置 参 量 列 表 被 移 动 , 最 左 端 的 那 个 参 数 就 会 从 列 表 中 删 除 经 常 与 循 环 结 构 语 句 一 起 使 用 , 以 遍 历 每 一 个 位 置 参 数 ( 5 ) 数 组 的 使 用 1. 数 组 不 支 持 多 维 数 组 。 语 法 : a r r a y n a m e = ( v 1 v 2 v 3 ) 2. 使 用 d e c l a r e 声 明 直 接 给 变 量 名 加 下 标 赋 值 d e c l a r e − a s t r s t r = ( 1 2 3 4 ) 3. 数 组 的 引 用 {array_name[index]}
4.数组与数组元素的删除
unset str[0]
unset str
5.数组赋值时无需按顺序赋值
6.获取数组中所有元素
str[@] s t r [ @ ] 、 {str[*]}
7.获取数组的长度
{#str[@]}、 {#str[@]}、 {#str[*]}
8.遍历数组
for i in “$str[*]”
do echo i done
(6)条件测试
返回结果:0为真,其他为假。无布尔值。
语句:
格式1:test<测试表达式>
格式2:[<测试表达式>]
格式3:[[<测试表达式>]] (bash 2.x 版本以上)
说明:
格式1和格式2 是等价的,格式3是扩展的test命令
在[[]]中可以使用通配符进行模式匹配
&&,||,< 和 > 能够正常存在于[[]]中,但不能再[]中出现
[和[[之后的字符必须为空格,]和]]之前的字符必须为空格
要对整数进行关系运算也可以使用(())进行测试
数字测试
[ v1 -eq v2 ] 等于 ((v1 == v2))
[ v1 -nq v2 ] 不等 ((v1 != v2))
[ v1 -gt v2 ] 大于 ((v1 > v2 ))
[ v1 -ge v2 ] 大于等于 ((v1 >= v2))
[ v1 -lt v2 ] 小于 ((v1 < v2 ))
[ v1 -le v2 ] 小于等于 ((v1<= v2 ))
字符串测试
[ -z str ] str长度为0
[ -n str ] str长度不为0
[ str=str ] 两字符串相等
[ str!=str2 ] 两字符串不等

        [[ str == str2 ]] 两字符串相同
        [[ str != str2 ]] 两字符串不相等
        [[ str1=~str2 ]] str2是str1的子串
        [[ str1>str2 ]] str1大于str2
        [[ str<str2 ]] str1小于str2
  文件测试
      [ -f file ]   存在且是普通文件
       [ -L fname ]  存在且是链接文件
       [ -d fname ]   存在且是目录文件
       [ -e fname ]   文件存在
       [ -s fname ]   文件存在且大于0
       [ -r fname ]   文件或目录存在且可读
       [ -w fname ]   文件或目录存在且可写
       [ -x fname ]   文件存在且可执行
  逻辑测试
       与    [ e1 -a e2 ]      [[ e1 && e2 ]]      (( e1 && e2 )) 
        或    [ e1 -o e2 ]      [[ e1 || e2 ]]      ((e1 || e2 )) 
        非    [ !e1 ]           [[ !e1 ]]      ((!e1 ))

(6)分支语句
if语句语法:
if …
then …
elif …
then …
else …
fi
case条件语法:
case … in
…) …;;
…||…) …;;
*) …;;#若无匹配则执行此行,可以不出现
esac
(7)循环语句
for语句语法1:
for … in …
do…
done
说明:列表 list 可以是命令替换、变量名替换、字符串和文件名列表 ( 可包含通配符 ),每个列表项以空格间隔
for 循环执行的次数取决于列表 list 中单词的个数
可以省略 in list ,省略时相当于 in “ @1.1).forxincentosubuntugentooopensuse2).weekdays=monthuewedthurfrisatsunfordayin @ ” 例 1. 1 ) . f o r x i n “ c e n t o s ” “ u b u n t u ” “ g e n t o o ” “ o p e n s u s e ” 2 ) . w e e k d a y s = ” m o n t h u e w e d t h u r f r i s a t s u n ” f o r d a y i n weekdays
例2.
# 使用文件名或目录名列表作为 WordList
for filename in * ; do
echo filename  
         done  
     #循环a、b、c、d开头的文件  
     for fn in /etc/[abcd]*.conf ; do   
     echo
filename           done       #循环a、b、c、d开头的文件       for fn in /etc/[abcd]*.conf ; do        echo
fn ;
done
#循环d结尾的目录下所有文件(注:{}中可以有多个,号分割,代表匹配多个关键字符)
for fn in /etc/yum.{d,}/ ; do
echo $fn ;
done
例3.使用命令的执行结果作为 WordList
#循环/etc/passwd文件内容, -F指定域分隔符为’:’
i=1
for username in awk -F ':' '{print $1}' /etc/passwd
do
echo “Username ((i++)): ( ( i + + ) ) : username”
done
#循环当前目录文件名称1
i=1
for fname in ls -l|awk '{print $9}'
do
echo “Fname ((i++)): ( ( i + + ) ) : fname”
done
#循环当前目录文件名称2
for f in (ls/home/appluat);doecho ( l s / h o m e / a p p l u a t ) ; d o e c h o f; done
for f in ls /home/appluat; do echo f;done4.使WordListforsuffixin f ; d o n e 例 4. 使 用 数 值 范 围 作 为 W o r d L i s t f o r s u f f i x i n (seq 254) ; do
echo “192.168.0.${suffix}”;
done

mynet=”192.168.0”
for num in {1..254} ; do
echo “IPAdress num: n u m : mynet.$num”
done

使用包含步长(increment)的数值范围作为 WordList
for num in {1..20..3} ; do
echo “Number: $num”
done
for语句语法2:
for( ; ; ;)
(8)循环控制
while语法
while …do…
break;#跳出循环,可以不用
done…
until语法
until …do…
break;#跳出循环,可以不用
done…
select语法
select … in …
do…
break;#跳出循环,可以不用
done
(9)function函数
声明:
fname(){…}
**

linux账号管理

**
一、群组
1.查看所属群组:groups
第一个输出的群组即为有效群组。
当该用户创建文件时,文件属于有效群组,而不属于支持群组
2.有效群组切换:newgrp groupname
二、新增与移除使用者:useradd,相关配置文件,passwd,usermod,userdel
1.新增用户:
useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]
[-c 说明兰栏] [-d 家目录绝对路径] [-s shell] 使用者账号
选项与参数:
-u:后面接UID,是一组数据,直接指定一个特定的UID给这个账号。
-g:后面接的那个组名就是我们上面提到的initial group。
该群组的gid会被放置到/etc/passd的第四个字段中
-G:后面接的组名则是这个账号还可以加入的群组。
这个选项与参数会修改/etc/group内的相关资料
-M:强制!不要建立用户家目录!
-m:强制,要建立用户家目录。
-c:这个就是/etc/passwd的第五栏的说明内容
-d:指定某个目录成为家目录,而不使用默认值。
-r:建立一个账号,这个账号的UID会有限制
-s:后面接一个日期,格式为[yyyy-mm-dd]可写入第八段,即账号失效日
-f:后面接shadow的第七段项目,指定密码会失效,0为立即失效,-1为永远不失效。
2.默认建立用户:useradd user
默认建立的用户会建立家目录,且权限为700!
3.系统账号
UID小于1000,当加上-r这个选项则将账号与账号组都指定小于1000。
由于系统账号主要是用来进行运作系统所需要的服务的权限设定,所以账号默认都不会
主动建立家目录的。
4.设置用户密码:passwd [username]
5.修改账号信息:usermod [-cdegGlsuLU] username
6.删除用户:userdel [-r] username
-r:连同家目录一起删掉
7.更改用户的shell:
chsh [-l][-s shellname]
-l:列出目前系统上可用的shell,其实就是/etc/shells的内容
-s:改变目前的shell。成为shellname。
8.修改个人属性:chfn [-foph]
-f:后面接完整的名字
-o:办公室的房间号码
-p:办公室的电话号码
-h:家里的电话号码
9.查看用户相关信息:finger [-s] username
-s:使用长串数据输出格式
10.查看某人或与自己相关UID/GID 信息:
id [username] 输出uid,gid,group
11.新增用户组:
groupadd [-g GID] groupname
-g GID:自行设定GiD的大小。
12.删除用户组:groupdel groupname
13.密码管理:passwd [-lunxwS] username
-l:锁住密码
-u:解开密码
-n:最短天数
-x:最长天数
-w:警告天数
-S:显示当前用户的密码信息
三、切换用户身份
1.su [-lcm] [username]
-:使用su -时,表示该用户要变换身份为root,且使用root的环境变量设置参数文件
-l:后接用户,如su -l cheng,这个好处是可使用变换者的所有相关环境变量。
-m:使用当前环境变量设置。
-c:后面可以加上命令
说明:虽然改为root的身份,但环境当中,还是当初登入的那个使用者
如果要全部的环境变量均使用root的设定档,这个时候必须用su -下达命令。
2.sudo [-u username] [command] 不需要root密码即可以使用root身份做一些命令
-u:将身份变成username的身份
注:在使用sudo之前,要在/etc/sudoers里设置,在预设的情况下,只有root才可以使用sudo.
可以使用 visudo 来编辑 /etc/sudoers 这个档案即可!,不可用vi直接编辑
1)输入visudo
2)将允许使用sudo的群组注解取消掉。
在root下使用sudo -u username touch username可以使root变成别的用户的
四、mail
**

**

1 例行性工作排程**

**

一、例行排程概述:
1.什么是例行排程?
例行的工作进行安排执行
2.linux常见的例行性工作
1)进行登录档的轮替
Linux 会主动的将系统所发生的各种信息都记录下来,这就是登录档 (第十八章)。 由于系统会一直记录登
录信息,所以登录文件将会越来越大!我们知道大型文件不但占容量还会造成读写效能的困扰, 因此适时
的将登录文件数据挪一挪,让旧的数据与新的数据分别存放,则比较可以有效的记录登录信息。这就是 log
rotate 的任务!这也是系统必要的例行任务
2)登录文件分析logwatch的任务
如果系统发生了软件问题、硬件错误、资安问题等,绝大部分的错误信息都会被记录到登录文件中, 因此
系统管理员的重要任务之一就是分析登录档。但你不可能手动透过 vim 等软件去检视登录文件,因为数据
太复杂了! 我们的 CentOS 提供了一只程序『 logwatch 』来主动分析登录信息,所以你会发现,你的 root
老是会收到标题为 logwatch 的信件,那是正常的!你最好也能够看看该信件的内容喔!
3)建立locate的数据库
我们谈到的 locate 指令时, 我们知道该指令是透过已经存在的文件名数据库来进行系统上文件名
的查询。我们的文件名数据库是放置到 /var/lib/mlocate/ 中。 问题是,这个数据库怎么会自动更新啊?嘿
嘿!这就是系统的例行性工作所产生的效果啦!系统会主动的进行 updatedb 喔!
4)man page查询数据库的建立
与 locate 数据库类似的,可提供快速查询的 man page db 也是个数据库,但如果要使用 man page 数据库
时,就得要执行 mandb 才能够建立好啊! 而这个 man page 数据库也是透过系统的例行性工作排程来自
动执行的哩!
5)RPM 软件登录文件的建立:
RPM (第二十二章) 是一种软件管理的机制。由于系统可能会常常变更软件, 包括软件的新安装、非经常
性更新等,都会造成软件文件名的差异。为了方便未来追踪,系统也帮我们将文件名作个排序的记录呢! 有
时候系统也会透过排程来帮忙 RPM 数据库的重新建置喔!
6)移除暂存档:
某些软件在运作中会产生一些暂存档,但是当这个软件关闭时,这些暂存盘可能并不会主动的被移除。 有
些暂存盘则有时间性,如果超过一段时间后,这个暂存盘就没有效用了,此时移除这些暂存盘就是一件重
要的工作! 否则磁盘容量会被耗光。系统透过例行性工作排程执行名为 tmpwatch 的指令来删除这些暂存
档呢!
7)与网络服务有关的分析行为:
如果你有安装类似 WWW 服务器软件 (一个名为 apache 的软件),那么你的 Linux 系统通常就会主动的
分析该软件的登录文件。 同时某些凭证与认证的网络信息是否过期的问题,我们的 Linux 系统也会很亲和
的帮你进行自动检查!
二、仅执行一次的工作排程:at
1.启动atd服务
systemctl restart atd #重启atd服务
systemctl enable atd #让atd开机自动启动
systemctl status atd #查阅atd的启动状态
2.at的运作方式
我们使用 at 这个指令来产生所要运作的工作,并将这个工作以文本文件的方式写入 /var/spool/at/ 目录内,
该工作便能等待 atd 这个服务的取用与执行了
3.at的使用限制: /etc/at.allow 与 /etc/at.deny
1.) 先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能
使用 at (即使没有写在 at.deny 当中);
2.) 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,
而没有在这个 at.deny 文件中的使用者,就可以使用 at 咯;系统通常会保留一个空的 /etc/at.deny 文件,预设信任
所有用户。
3.)如果两个文件都不存在,那么只有 root 可以使用 at 这个指令
4.命令格式
at [- mldv] TIME
at - c 工作
-m :当 at 的工作完成后,即使没有输出讯息,亦以 email 通知使用者该工作已完成。
-l :at -l 相当于 atq,列出目前系统上面的所有该用户的 at 排程;
-d :at -d 相当于 atrm ,可以取消一个在 at 排程中的工作;
-v :可以使用较明显的时间格式栏出 at 排程中的任务栏表;
-c :可以列出后面接的该项工作的实际指令内容。
5.TIME:时间格式
这里可以定义出『什么时候要进行 at 这项工作』的时间,格式有:
HH:MM ex> 04:00
在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此工作。
HH:MM YYYY-MM-DD ex> 04:00 2015-07-30
强制规定在某年某月的某一天的特殊时刻进行该工作!
HH:MM[am|pm] [Month] [Date] ex> 04pm July 30
也是一样,强制在某年某月某日的某时刻进行!
HH:MM[am|pm] + number [minutes|hours|days|weeks]
ex> now + 5 minutes ex> 04pm + 3 days
就是说,在某个时间点『再加几个时间后』才进行。
三、循环执行的例行工作排程:cron
crontab :crontab 这个指令所设定的工作将会循环的一直进行下去! 可循环的时间为分钟、小时、每周、
每月或每年等。crontab 除了可以使用指令执行外,亦可编辑 /etc/crontab 来支持。 至于让 crontab 可以生
效的服务则是 crond 这个服务喔!
2)cron的运作方式
当用户使用 crontab 这个指令来建立工作排程之后,该项工作就会被纪录到 /var/spool/cron/ 里面去
了,而且是以账号来作为判别的喔!举例来说, dmtsai 使用 crontab 后, 他的工作会被纪录到
/var/spool/cron/dmtsai 里头去!但请注意,不要使用 vi 直接编辑该文件, 因为可能由于输入语法错
误,会导致无法执行 cron 喔!另外, cron 执行的每一项工作都会被纪录到 /var/log/cron 这个登录
档中,所以啰,如果你的 Linux 不知道有否被植入木马时,也可以搜寻一下 /var/log/cron 这个登录
档呢!
3)cron 的语法
crontab [- - u username] [- - l|- - e|- - r]
选项与参数:
-u :只有 root 才能进行这个任务,亦即帮其他使用者建立/移除 crontab 工作排程;
-e :编辑 crontab 的工作内容
-l :查阅 crontab 的工作内容
-r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。
实例:
crontab -e

此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。

0 12 * * * mail -s “at 12:00” dmtsai < /home/dmtsai/.bashrc

分 时 日 月 周 |<==============指令串========================>|

特殊字符

4)系统的例行性任务: /etc/crontab, /etc/cron.d/*
管理系统的例行性任务,编辑 /etc/crontab 这个文件

MAILTO=root:
这个项目是说,当 /etc/crontab 这个文件中的例行性工作的指令发生错误时,或者是该工作的执行
结果有 STDOUT/STDERR 时,会将错误讯息或者是屏幕显示的讯息传给谁?默认当然是由系统
直接寄发一封 mail 给 root 啦!不过, 由于 root 并无法在客户端中以 POP3 之类的软件收信,
因此,鸟哥通常都将这个 e-mail 改成自己的账号,好让我随时了解系统的状况!例如:
MAILTO=dmtsai@my.host.name
o PATH=….:
还记得我们在第十章的 BASH 当中一直提到的执行文件路径问题吧! 没错啦!这里就是输入执
行文件的搜寻路径!使用默认的路径设定就已经很足够了!
o 『分 时 日 月 周 身份 指令』七个字段的设定
这个 /etc/crontab 里面可以设定的基本语法与 crontab -e 不太相同喔!前面同样是分、时、日、月、
周五个字段, 但是在五个字段后面接的并不是指令,而是一个新的字段,那就是『执行后面那串
指令的身份』为何!这与使用者的 crontab -e 不相同。由于使用者自己的 crontab 并不需要指定
身份,但 /etc/crontab 里面当然要指定身份啦!以上表的内容来说,系统默认的例行性工作是以 root
的身份来进行的。
四、注意事项
资源分配不均的问题
当大量使用 crontab 的时候,总是会有问题发生的,最严重的问题就是『系统资源分配不均』的问题,
以鸟哥的系统为例,我有侦测主机流量的信息,包括:
· 流量
· 区域内其他 PC 的流量侦测
· CPU 使用率
· RAM 使用率
· 在线人数实时侦测
如果每个流程都在同一个时间启动的话,那么在某个时段时,我的系统会变的相当的繁忙,所以,这
个时候就必须要分别设定啦!我可以这样做:

取消不要的输出项目
另外一个困扰发生在『 当有执行成果或者是执行的项目中有输出的数据时,该数据将会 mail 给
MAILTO 设定的账号 』,好啦,那么当有一个排程一直出错(例如 DNS 的侦测系统当中,若 DNS
上层主机挂掉,那么你就会一直收到错误讯息!)怎么办?呵呵!还记得第十章谈到的数据流重导向
吧? 直接以『数据流重导向』将输出的结果输出到 /dev/null 这个垃圾桶当中就好了!
安全的检验
很多时候被植入木马都是以例行命令的方式植入的,所以可以藉由检查 /var/log/cron 的内容来视察
是否有『非您设定的 cron 被执行了?』这个时候就需要小心一点啰!
周与日月不可同时并存
另一个需要注意的地方在于:『你可以分别以周或者是日月为单位作为循环,但你不可使用「几月几
号且为星期几」的模式工作』。 这个意思是说,你不可以这样编写一个工作排程:
30 12 11 9 5 root echo “just test” <==这是错误的写法
本来你以为九月十一号且为星期五才会进行这项工作,无奈的是,系统可能会判定每个星期五作一次,
或每年的 9 月 11 号分别进行,如此一来与你当初的规划就不一样了~所以啰,得要注意这个地方!

**
**

进程管理

**

一、什么是进程
1.什么是进程
触发任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个ID,成为PID,同时依据这个
进程的用户与相关属性关系,给予这个PID一组有效的权限设定。
2.什么是程序
系统需要一个执行文件才能工作,而系统只能识别二进制文件(binary file),而这个binary file就是程序
3.进程与程序
1.)进程与程序的关系
程序一般是放置在实体磁盘中,然后通过用户的执行来触发。触发后会加载到内存中成为一个个体,那就是进程。为例操作系统可管理这个进程,因此进程有给予执行者的权限/属性等参数,并包括程序所需的脚本与数据或文件数据等,最后再给予一个PID。系统就是通过这个PID来判断该process是否具有权限进行工作的。
2.)子进程与父进程
从一个进程衍生出来的进程
3.)fork and exec :进程呼叫的流程
在 Linux 的进程呼叫通常称为 fork-and-exec 的流程 (注 1)!进程都会藉由父进程以复制 (fork) 的方式产生一个
一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。
4.) 系统或网络服务:常驻在内存的进程
我们将启动在背景当中一直持续不断的运作,那就是『常驻在内存当中的进程』啦!常驻在内存当中的进程通常都
是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻程序就会被我们称为:服务 (daemon)。系统的服务
非常的多, 不过主要大致分成系统本身所需要的服务,例如刚刚提到的 crond 及 atd ,还有 rsyslogd 等等的。
还有一些则是负责网络联机的服务,例如Apache, named, postfix, vsftpd… 等等的。这些网络服务比较有趣的地方,
在于这些程序被执行后,他会启动一个可以负责网络监听的端口口 (port) ,以提供外部客户端 (client) 的联机要求。
4.linux多人多任务环境
1)多人多任务环境
在linux系统中可以有多个用户存在,root有至高无上的权限。系统可以在进程之间互相切换,为不同的用户更好的服务
2)特殊的进程管理
以在任何时候, 将某个被困住的进程杀掉,然后再重新执行该进程而不用重新启动!够炫吧!那么如果我在 Linux
下以文字界面登入,在屏幕当中显示错误讯息后就挂了~动都不能动,该如何是好!? 这个时候那
默认的七个窗口就帮上忙啦!你可以随意的再按 [Alt]+[F1]…..[F7] 来切换到其他的终端机界面,然
后以 ps -aux 找出刚刚的错误进程,然后给他 kill 一下。
3)bash环境下的环境管理:&
实例:cp file1 file2 &
在这一串指令中,重点在那个 & 的功能,他表示将 file1 这个文件复制为 file2 ,且放置于背景中
执行, 也就是说执行这一个命令之后,在这一个终端接口仍然可以做其他的工作!而当这一个指令
(cp file1 file2) 执行完毕之后,系统将会在你的终端接口显示完成的消息!很便利喔!
4)多人多任务的系统资源分配问题考虑
多人多任务确实有很多的好处,但其实也有管理上的困扰,因为使用者越来越多, 将导致你管理上
的困扰哩!另外,由于使用者日盛,当使用者达到一定的人数后, 通常你的机器便需要升级了,因
为 CPU 的运算与 RAM 的大小可能就会不敷使用

二、工作管理
1.什么是工作管理
1) 这个工作管理 (job control) 是用在 bash 环境下的,也就是说:『当我们登入系统取得 bash shell 之
后,在单一终端机接口下同时进行多个工作的行为管理 』
2)进行工作管理的行为中, 其实每个工作都是目前 bash 的子进程,亦即彼此之间是有相关性的。
我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的bash !
3)要注意的是,放入背景的工作想要运作时, 他必须不能够与使用者互动。举例来说,
vim 绝对不可能在背景里面执行 (running) 的!因为你没有输入数据他就不会跑啊!
而且放入背景的工作是不可以使用 [ctrl]+c 来终止的!

  2直接将指令丢到背景:&
           命令格式:command &
             说明: 1.执行后,会反馈:[n] xxxx, n是工作号码,xxxx是pid。
                    2.背景执行的命令不会被Ctrl+C中断 
                    3.为了不让背景执行的进程输出的数据影响前景,可以数据流重导向
  3.将『目前』的工作丢到背景中『暂停』:[ctrl]-z
           按下 [ctrl] 及 z 这两个按键
                [1]  +    Stopped vim ~/.bashrc
           屏幕上会出现 [1],表示这是第一个工作, 而 那个 + 代表最近一个被丢进背景的工作,
           且目前在背景下预设会被取用的那个工作 (与 fg 这个指令有关 )!而那个 Stopped 则
           代表目前这个工作的状态。在预设的情况下,使用 [ctrl]-z 丢到背景当中的工作都是『暂停』的状态喔!
  4.观察目前的背景工作状态: jobs
           命令格式: jobs [- lrs]
       选项与参数:

-l :除了列出 job number 与指令串之外,同时列出 PID 的号码;
-r :仅列出正在背景 run 的工作;
-s :仅列出正在背景当中暂停 (stop) 的工作
说明:+ 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。 而
超过最后第三个以后的工作.
5.将背景工作拿到前景来处理:fg
命令格式: fg %jobnumber
选项与参数:
%jobnumber :jobnumber 为工作号码(数字)。
fg -代表将 - 号的那个工作号码拿出来
6.让工作在背景下暂停的状态变成运作中: bg %number

  7.删除背景当中的工作: kill
        命令格式:  kill -n %number
        n的取值:
          -1 :重新读取一次参数的配置文件 (类似 reload);

-2 :代表与由键盘输入 [ctrl]-c 同样的动作;
-9 :立刻强制删除一个工作;(通常不知道用什么样的方式结束才使用此方式删除,所以此删除方式正常情况不建议使用)
-15:以正常的进程方式终止一项工作。与 -9 是不一样的。

三、进程管理
1.进程的观察
1.)静态ps
ps aux <==观察系统所有的进程数据
ps - lA <==也是能够观察所有系统的数据
ps axjf <==连同部分进程树状态
选项与参数:
-A :所有的 process 均显示出来,与 -e 具有同样的效用;
-a :不与 terminal 有关的所有 process ;
-u :有效使用者 (effective user) 相关的 process ;
x :通常与 a 这个参数一起使用,可列出较完整信息。
输出格式规划:
l :较长、较详细的将该 PID 的的信息列出;
j :工作的格式 (jobs format)
-f :做一个更为完整的输出
ps -l

F:代表这个进程旗标 (process flags),说明这个进程的总结权限,常见号码有:
若为 4 表示此进程的权限为 root ;
若为 1 则表示此子进程仅进行复制(fork)而没有实际执行(exec)。
S:代表这个进程的状态 (STAT),主要的状态有:
R (Running):该程序正在运作中;
S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)
T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
Z (Zombie):僵尸状态,进程已经终止但却无法被移除至内存外。
UID/PID/PPID:代表『此进程被该 UID 所拥有/进程的 PID 号码/此进程的父进程 PID 号码』
C:代表 CPU 使用率,单位为百分比;
§PRI/NI:Priority/Nice 的缩写,代表此进程被 CPU 所执行的优先级,数值越小代表该进程越快被 CPU 执行。
详细的 PRI 与 NI 将在下一小节说明。
ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该进程在内存的哪个部分,如果是个
running 的进程,一般就会显示『 - 』 / SZ 代表此进程用掉多少内存 / WCHAN 表示目前进程是否运作中,
同样的, 若为 - 表示正在运作中。
TTY:登入者的终端机位置,若为远程登录则使用动态终端接口 (pts/n);TIME:使用掉的 CPU 时间,注意,是此进程实际花费 CPU 运作的时间,而不是系统时间;
CMD:就是 command 的缩写,造成此进程的触发程序之指令为何。
ps aux

§ USER:该 process 属于那个使用者账号的?
§ PID :该 process 的进程标识符。
§ %CPU:该 process 使用掉的 CPU 资源百分比;
§ %MEM:该 process 所占用的物理内存百分比;
§ VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
§ RSS :该 process 占用的固定的内存量 (Kbytes)
§ TTY :该 process 是在那个终端机上面运作,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登
入者进程,若为 pts/0 等等的,则表示为由网络连接进主机的进程。
§ STAT:该进程目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)
§ START:该 process 被触发启动的时间;
§ TIME :该 process 实际使用 CPU 运作的时间。
§ COMMAND:该进程的实际指令为何?

2.)动态top
命令格式: top [- d 数 字 ] | top [- bnp]
选项与参数:
-d :后面可以接秒数,就是整个进程画面更新的秒数。预设是 5 秒;
-b :以批次的方式执行 top ,还有更多的参数可以使用喔!
通常会搭配数据流重导向来将批次的结果输出成为文件。
-n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
-p :指定某些个 PID 来进行观察监测而已。
在 top 执行过程当中可以使用的按键指令:
? :显示在 top 当中可以输入的按键指令;
P :以 CPU 的使用资源排序显示;
M :以 Memory 的使用资源排序显示;
N :以 PID 来排序喔!
T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
k :给予某个 PID 一个讯号 (signal)
r :给予某个 PID 重新制订一个nice 值。
q :离开 top 软件的按键。
3.)查找进程之间的关系:pstree
pstree [- -A|U] [-up]
-A :各进程树之间的连接以 ASCII 字符来连接;
-U :各进程树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;
-p :并同时列出每个 process 的 PID;
-u :并同时列出每个 process 的所属账号名称。
2.进程的删除
1).kill -signal PID
kill -signal %jodnumber
kill 后面直接加数字与加上 %number 的情况是不同的! 这个很重要喔!因为工作
控制中有 1 号工作,但是 PID 1 号则是专指『 systemd 』这支程序!你怎么可以将 systemd 关闭
呢? 关闭 systemd ,你的系统就当掉了啊!所以记得那个 % 是专门用在工作控制的
2)killall -signal 指令名称
由于 kill 后面必须要加上 PID (或者是 job number),所以,通常 kill 都会配合 ps, pstree 等指令,因
为我们必须要找到相对应的那个进程的 ID 嘛!但是,如此一来,很麻烦~有没有可以利用『下达指
令的名称』来给予讯号的?举例来说,能不能直接将 rsyslogd 这个进程给予一个 SIGHUP 的讯号呢?
可以的!用 killall 吧!
命令格式:killall [- - iIe] [command name]
选项与参数:
-i :interactive 的意思,交互式的,若需要删除时,会出现提示字符给用户;
-e :exact 的意思,表示『后面接的 command name 要一致』,但整个完整的指令
不能超过 15 个字符。
-I :指令名称(可能含参数)忽略大小写。
3.关于进程的执行顺序
1)优先执行序 (priority, PRI)
这个 PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的, 用户无法直接调整 PRI值的。
PRI(new) = PRI(old) + nice(NI)
· nice 值可调整的范围为 -20 ~ 19 ;
· root 可随意调整自己或他人进程的 Nice 值,且范围为 -20 ~ 19 ;
· 一般使用者仅可调整自己进程的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源);
· 一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大于 5;
给予某个进程的nice值的方式
· 一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令;
· 调整某个已经存在的 PID 的 nice 值:用 renice 指令。
2)nice 新执行的指令即给予新的 nice 值
命令格式 nice [ -n -数 字 ] command
选项与参数:
-n :后面接一个数值,数值的范围 -20 ~ 19。

3)renice :已存在进程的 nice 重新调整
命令格式: renice [number] PID
选项与参数:
PID :某个进程的 ID.
4.资源系统的观察
1).free:观察内存
命令格式:free [-b|-k|-m|-g|-h][-t][-s N -c N]
选项与参数:
-b :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes)
k(Kbytes), 及 g(Gbytes) 来显示单位喔!也可以直接让系统自己指定单位 (-h)
-t :在输出的最终结果,显示物理内存与 swap 的总量。
-s :可以让系统每几秒钟输出一次,不间断的一直输出的意思!对于系统观察挺有效!
-c :与 -s 同时处理~让 free 列出几次的意思
2). uname :查阅系统与核心相关信息
uname [-asrmpi]
选项与参数:
-a :所有系统相关的信息,包括底下的数据都会被列出来;
-s :系统核心名称
-r :核心的版本
-m :本系统的硬件名称,例如 i686 或 x86_64 等;
-p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型!
-i :硬件的平台 (ix86)
3)uptime:观察系统启动时间与工作负载

4)netstat :追踪网络或插槽文件
netstat - - [atunlp]
选项与参数:
-a :将目前系统上所有的联机、监听、Socket 数据都列出来
-t :列出 tcp 网络封包的数据
-u :列出 udp 网络封包的数据
-n :不以进程的服务名称,以埠号 (port number) 来显示;
-l :列出目前正在网络监听 (listen) 的服务;
-p :列出该网络服务的进程 PID
5)dmesg :分析核心产生的讯息
6)vmstat :侦测系统资源变化
四、特殊文件与进程
1.具有SUID/SGID权限的指令执行状态
1)SUID:在进程执行时,会将该进程的所有者的权限赋给执行者。
·SUID 权限仅对二进制程序(binary program)有效;
· 执行者对于该程序需要具有 x 的可执行权限;
· 本权限仅在执行该程序的过程中有效 (run-time);
· 执行者将具有该程序拥有者 (owner) 的权限。
2)查询整个系统的 SUID/SGID 的文件
find / -perm /6000
2./proc/*代表意义
1)进程都是在内存当中嘛!而内存当中的数据又都是写入到 /proc/* 这个
目录下的,所以啰,我们当然可以直接观察 /proc 这个目录当中的文件啊
2)目前主机上面的各个进程的 PID 都是以目录的型态存在于 /proc 当中。
举例来说,我们开机所执行的第一支程序 systemd 他的 PID 是 1 ,
这个 PID 的所有相关信息都写入在 /proc/1/*当中!

3.查询已开启文件或已执行进程开启之文件
1)fuser :藉由 文件( 或文件系统) 找出正在使用该文件
fuser [-umv] [-k [i] [-signal]] file/dir
选项与参数:
-u :除了进程的 PID 之外,同时列出该进程的拥有者;
-m :后面接的那个档名会主动的上提到该文件系统的最顶层,对 umount 不成功很有效!
-v :可以列出每个文件与进程还有指令的完整相关性!
-k :找出使用该文件/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;
-i :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!
-signal:例如 -1 -15 等等,若不加的话,预设是 SIGKILL (-9) 。
2)lsof :列出被进程所开启的文件
相对于 fuser 是由文件或者装置去找出使用该文件或装置的进程,反过来说,如何查出某个进程开启
或者使用的文件与装置呢?呼呼!那就是使用 lsof。
lsof [- - aUu] [+d]
选项与参数:
-a :多项数据需要『同时成立』才显示出结果时!
-U :仅列出 Unix like 系统的 socket 文件类型;
-u :后面接 username,列出该使用者相关进程所开启的文件;
+d :后面接目录,亦即找出某个目录底下已经被开启的文件!
3)pidof :找出某支正在执行的程序的 PID
pidof [-sx] program_name
选项与参数:
-s :仅列出一个 PID 而不列出所有的 PID
-x :同时列出该 program name 可能的 PPID 那个进程的 PID

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值