Shell 编程入门
一.Shell概述
1.shell是什么
Shell是一个命令行解释器,给用户提供了一个可以向Linux内核发送请求来运行程序的界面系统级程序,用户可以用shell来启动挂起停止应用程序
应用程序==》shell命令解释器==》内核==》硬件
功能强大的编程语言 易编写 易调试 灵活性较强 shell 是解释执行的脚本语言 在shell中可以直接调用Linux 系统命令
2.shell 分类
1.Bourne Shell 1979 年用于 Unix 主文件sh ksh Bash(linux) psh zsh
2.C shell 主要是BSD 版的Unix 系统中使用 语法和C 相识而得名 csh tcsh
注意:语法彼此不兼容
3.Bash Bash 和sh 兼容 现在使用的Linux就是使用Bash作为用户的基本Shell
二.Shell 脚本的执行方式
1.echo
echo [选项] [输出内容] 输出内容有空格 字符串用“” 包起来所有内容 有 ! 用 ‘’包起来所有内容
选项 -e 支持反斜线控制的字符转换
支持颜色输出
2.脚本执行
chmod 755 xxx.sh
./xxx.sh
bash xxx.sh
注意:
[root@localhost shellDemo]# ./hello.sh
/bin/bash: 标记是bash shell 脚本 必须要写: 没有那个文件或目录
[root@localhost shellDemo]# sh hello.sh
sff is a good man in the world ###可以看出问题 原因是脚本是在windows环境编辑 但是windows和linux 的换行符不一致 出现问题
##win 换行 ^\M linux是\M
[root@localhost shellDemo]# cat -A hello.sh
#!/bin/bash M-fM- M-^GM-hM-.M-0M-fM-^XM-/bash shell M-hM-^DM-^ZM-fM-^\M-, M-eM-?M-^EM-iM-!M-;M-hM-&M-^AM-eM-^FM-^Y$
#M-fM-3M-(M-iM-^GM-^J M-eM-^OM-/M-iM-^@M-^I M-dM-=M-^\M-hM-^@M-^E M-gM-^IM-^HM-fM-^\M-, M-gM--M-^IM-dM-?M-!M-fM-^AM-/$
#M-dM-=M-^\M-hM-^@M-^EM-oM-<M-^Zsff$
echo "sff is a good man in the world " $
[root@localhost shellDemo]# dos2
2.history
history [选项]
-c 清空历史命令
-w 缓存里面的命令写入文件~./bash_history (原来的写入时间是用户退出登录是写入文件 )
默认保存 1000 在/etc/profile中history 中 有histsize 修改大小
三.Bash 的基本功能
1.输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
2.输出重定向
类型 | 符号 | 作用 |
---|---|---|
标准输出重定向 | 命令>文件 | 覆盖方式输出到文件或者设备 |
命令>>文件 | 追加方式输出到文件或者设备 | |
标准错误输出重定向 | 错误命令2>文件 | 覆盖方式 |
错误命令2>>文件 | 追加方式 |
[sff@localhost ~]$ date >log.txt
[sff@localhost ~]$ cat log.txt
2021年 08月 25日 星期三 20:24:45 CST
[sff@localhost ~]$ lst 2>> abc
[sff@localhost ~]$ cat abc
-bash: lst: 未找到命令
类型 | 符号 | 作用 |
---|---|---|
正确的和错误的一起保存 | 命令 > 文件 2>&1 | 覆盖方式 正确和错误的同时保存到一个文件 |
命令>>文件 2>&1 | 追加方式 正确和错误的同时保存到一个文件 | |
命令&>文件 | 覆盖方式 正确和错误的同时保存到一个文件 | |
命令&>>文件 | 追加方式 正确和错误的同时保存到一个文件 | |
命令>>文件1 2>> 文件2 | 正确-》文件1 错误-》文件2 |
3.输入重定向
wc [选项] [文件名]
-c 统计字节
-w 统计单词
-l 统计行数
4.多命令与管道符
多命令
多命令执行符 | 格式 | 作用 |
---|---|---|
; | 命令1 ;命令2 | 多命令顺序执行,没有逻辑关系 |
&& | 命令1 &&命令2 | 命令1 正确执行后 才会执行命令2 命令1不正确后不会执行命令2 |
|| | 命令1 命令2 | 1不正确 2执行 1正确 2不会执行 |
管道符
命令1|命令2
#命令1的正确输出 作为命令2 的操作对象
[root@localhost dev]# netstat -an |grep ESTABLISHED
tcp 0 0 192.168.141.130:22 192.168.141.1:59240 ESTABLISHED
tcp 0 36 192.168.141.130:22 192.168.141.1:59017 ESTABLISHED
###所有端口是ESTABLISHED 状态的信息
## netstat -an 的输出对象 作为 grep ESTABLISHED 的操作对象
5.grep 命令
grep [选项] “搜索内容” 文件名
命令 | 解释 |
---|---|
-n | 输出行号 |
-i | 忽略大小写 |
-v | 反向查找 |
–color=auto | 搜索出关键字用颜色显示{有的不加也会有颜色} |
[root@localhost dev]# grep -n "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
6.通配符和其他特殊符号
通配符 | 解释 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或任意多个字符,也就是可以匹配任务内容 |
[] | 匹配中括号中任意一个字符 |
[-] | 匹配中括号中任意一个字符 -代表一个范围 例如:【a-z】 代表匹配一个小写字母 |
[^] | 逻辑非,表示匹配不是中括号内的一个字符。例如【^0-9】代表匹配一个不是数字的 |
符号 | 解释 |
---|---|
‘ ’ | 所有特殊符号都没有特殊意义 $ ` 等 |
“ ” | 所有特殊符号都没有特殊意义 $ \ ` 例外 |
`` | 内容是系统命令 在Bash 会先执行 和 一样推荐使用 {}一样 推荐使用 一样推荐使用{} 反 引号容易看错 |
${} | 应用系统命令 和``一样 |
# | 表示注释 |
$ | 调用变量 调用name ==> $name |
\ | \之后的特殊符号失去特殊含义 |
四.Bash 变量与运算
概念:计算机内存的单元 存放任意改变的信息,当shell脚本要保存一些信息是,比如一个文件名或者是一个数字,就把它存放在一个变量中,每个变量有一个名字 可以去引用它
组成:字母数字 下划线 数字不能开头
运算:bash 中 默认变量类型是字符串 如果要数值运算 必须指定变量的类型是数值型
变量用等号连接不能有空格 值有空格的话 用“”包起来
环境变量建议大写
变量分类
- 自定义变量
- 环境变量 保存操作系统先关的的数据
- 位置参数变量 脚本中作为参数传递使用 变量名是固定的不能自定义
- 预定义变量 Bash 中定义好的 变量名是固定的不能自定义 作用也是固定的
[sff@localhost ~]$ echo $name ##调用变量
sc
[sff@localhost ~]$ set ##查看系统所有变量
.........
_=sc
colors=/home/sff/.dircolors
name=sc
[sff@localhost ~]$ unset name #变量删除
[sff@localhost ~]$ echo $name
1.用户自定义变量
自己定义的变量 怎么使用 作用都是自己定义的
2.环境变量
用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和这个shell的子shell中生效 ,如果把环境变量写入相应的配置文件,那么环境变量就在所有的shell中生效
[root@localhost dev]# bash ##在进一个 bash shell
[root@localhost dev]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─auditd───{auditd}
├─bash
├─chronyd
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─irqbalance
├─login───bash
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash───bash───bash───pstree ##bash 就是子shell
│ └─sshd───sshd───bash
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
export 变量名=变量值
##声明变量
env
#查询环境变量
##常用环境变量
PATH=/usr/local/jdk/jdk1.8.0_51//bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
##path 路径里面保存我们常用的命令 ls cd 等等 不需要写全路径
当输出 ls cd 等 会现在path 里面查询
PS1:系统提示符的变量
[root@localhost dev]# set |grep PS1
PS1='[\u@\h \W]\$ '
用户@主机 最后一级目录 ==》 [root@localhost dev]
符号 | 解释 |
---|---|
\d | 显示日期 星期 月 日 |
\h | 简写主机名 localhost |
\t | 24 小时制 HH:MM:SS |
\T | 12小时制 HH:MM:SS |
\A | 24 小时制 HH:MM |
\u | 当前用户 |
\w | 完整目录 |
\W | 所在目录最后一级目录 |
# | 执行的第几个目录 |
$ | 提示符 root 提示# 普通用户$ |
3.位置参数变量
位置参数变量 | 作用 |
---|---|
$n | n为数字 0 代表本身 1 − 9 代表第一个到第九个参数十以上需要大括号 0代表本身 1-9代表第一个到第九个参数 十以上需要大括号 0代表本身1−9代表第一个到第九个参数十以上需要大括号{10} |
$* | 代表命令行中的所有参数 把所有参数看做是一个总体 |
$@ | 代表命令行中的所有参数 $@ 是区别对待 {可以遍历} |
$# | 代表命令行中的所有参数的个数 |
#示例1
[root@localhost sh]# vim echodemo.sh
#!/bin/bash
echo $0
echo $1
echo $2
# #$0 #$1 #$2 #$3
[root@localhost sh]# ./echodemo.sh nihao wphao dajiahaop
./echodemo.sh #$0
nihao #$1
wphao #$2
#示例二
[root@localhost sh]# vim showp.sh
#!/bin/bash
echo $*
echo $@
echo $#
[root@localhost sh]# ./showp.sh 45 45 21 56
45 45 21 56 #显示所有
45 45 21 56 #显示所有
4 #x显示个数
4.预定义变量
预定义变量 | 作用 |
---|---|
$? | 最后一次执行命令的发挥状态 0表示正确,非0表示不正确 |
$$ | 当前进程的进程好PID |
$! | 后台运行的最后一个进程的进程号 PID |
[root@localhost sh]# ldfs
-bash: ldfs: 未找到命令
[root@localhost sh]# echo $?
127
[root@localhost sh]# ls
add.sh echodemo.sh showp.sh
[root@localhost sh]# echo $?
0
[root@localhost sh]# echo $$
1482
[root@localhost sh]# echo 111 & # & 表示后台运行
[1] 1556
111
[root@localhost sh]# echo $!
1556
[1]+ 完成 echo 111
5.接受键盘输入
read [选项] [变量名]
预定义变量 | 作用 |
---|---|
-p “提示信息” | 等待输入是 输出提示信息 |
-t 秒数 | 等待输入的时间 |
-n 字符数 | 指定输入字符的长度 |
-s | 隐藏输入 |
#!/bin/bash
read -n 3 -t 5 -p "输入名字:" name
echo "name = $name"
##输入三个字符 等待5S 提示信息是 输入名字
6.数值运算和运算符
方法1 declare [+/-] [选项] 变量名
命令 | 解释 |
---|---|
-: | 变量设定类型属性 |
+: | 取消变量类型属性 |
-i | 声明为整型integer |
-x | 变量声明为环境变量 |
-p | 显示指定变量被声明的类型 |
方法2 let / expr 都可以
[root@localhost sh]# aa=11
[root@localhost sh]# bb=22
[root@localhost sh]# cc=$aa+$bb
[root@localhost sh]# echo $cc
11+22
[root@localhost sh]# declare -i dd=$aa+$bb
[root@localhost sh]# echo $dd
33
[root@localhost sh]#
[root@localhost sh]# ee=$(expr $aa + $bb) ##注意必须有空格
[root@localhost sh]# echo $ee
33
方法3 $((运算)) 或 $[运算式] 推荐使用
[root@localhost sh]# gg=$(( $aa+$bb))
[root@localhost sh]# echo $gg
33
[root@localhost sh]# hh=$[$aa+$bb]
[root@localhost sh]# echo $hh
33
7.内容替换
五.环境变量配置文件
修改配置文件后需要注销/重新登录才会生效 执行下面立刻生效
source 配置文件 或者 **.**配置文件
1.简介
主要是定义对操作系统的操作环境生效的系统默认环境变量 比如PATH HISTSIZE PSI HOSTNAME 等默认环境变量
主要的文件有
- /etc/profile #全用户
- /etc/profile.d/*.sh #全用户
- ~/.bash_profile #当前用户
- ~/.bashrc #当前用户
- /etc/bashrc #全用户
注意 越是在后面定义的优先级越高 因为会覆盖前面相同的配置项
2.作用
/etc/profile作用
- USER
- LOGNAME
- PATH
- HOSTNAME
- HISTSIZE
- umask
- 调用/etc/profile.d/*.sh
#PATH 追加
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`/usr/bin/id -u`
UID=`/usr/bin/id -ru`
fi
USER="`/usr/bin/id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
# Path manipulation #
#[root@localhost sh]# vim /etc/profile
#[root@localhost sh]# echo $PATH
#/usr/local/jdk/jdk1.8.0_51/bin #z最后添加的
#:/usr/local/sbin #下面四个是这里添加的
#:/usr/local/bin
#:/usr/sbin
#:/usr/bin
#:/root/bin ==》 .bash_profile 文件添加的
if [ "$EUID" = "0" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
###调用/etc/profile.d/*.sh
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
unset i
unset -f pathmunge
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_51/
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
~/.bash_profile作用
if [ -f ~/.bashrc ]; then
. ~/.bashrc ##继续调用
fi
# User specific environment and startup programs
#:/root/bin ==》 .bash_profile 文件添加到PATH
PATH=$PATH:$HOME/bin
export PATH
~/.bashrc 作用
alias rm='rm -i' ##方法
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc ##、继续调用
fi
~
/etc/bashrc作用
if [ "$PS1" ]; then
if [ -z "$PROMPT_COMMAND" ]; then
case $TERM in
xterm*|vte*)
if [ -e /etc/sysconfig/bash-prompt-xterm ]; then
PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm
elif [ "${VTE_VERSION:-0}" -ge 3405 ]; then
PROMPT_COMMAND="__vte_prompt_command"
else
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
fi
;;
screen*)
if [ -e /etc/sysconfig/bash-prompt-screen ]; then
PROMPT_COMMAND=/etc/sysconfig/bash-prompt-screen
else
PROMPT_COMMAND='printf "\033k%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
fi
;;
*)
[ -e /etc/sysconfig/bash-prompt-default ] && PROMPT_COMMAND=/etc/sysconfig/bash-prompt-default
;;
esac
fi
# Turn on parallel history
shopt -s histappend
history -a
# Turn on checkwinsize
shopt -s checkwinsize
### 这个是定义 PSI 命令行格式
[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "
# You might want to have e.g. tty in prompt (e.g. more virtual machines)
# and console windows
# If you want to do so, just add e.g.
# if [ "$PS1" ]; then
# PS1="[\u@\h:\l \W]\\$ "
# fi
# to your custom modification shell script in /etc/profile.d/ directory
fi
#####这里是不使用用户名密码登录时候调用的 切换用户的时候
if ! shopt -q login_shell ; then # We're not a login shell
# Need to redefine pathmunge, it get's undefined at the end of /etc/profile
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
# By default, we want umask to get set. This sets it for non-login shell.
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
SHELL=/bin/bash
# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
unset i
unset -f pathmunge
fi
3.其他配置文件和登录信息
注销的时候生效的环境变量
~/.bash_logout
# ~/.bash_logout
#没有命令 可以自定义退出时执行的语句
~/.bash_history
所有的历史命令 本次登录的命令在缓存中需要注销的时候才会写入该文件
4.shell 登录信息
开机后显示的内容
[root@localhost ~]# cat /etc/issue ##w文件位置
\S
Kernel \r on an \m
可以修改
选项 | 作用 |
---|---|
\d | 日期 |
\s | 操作系统名称 |
\l | 终端号 |
\m | 隐藏输入 |
\n | 硬件结构 |
\o | 域名 |
\r | 内核版本 |
\t | 系统当前时间 |
\u | 当前登录用户的序列号 |
注意:/etc/issue.net
这个文件区别于上面文件 是登录以后才提示的信息;
六.正则表达式
正则表达式:文件中 匹配符合条件的字符串 正则是包含匹配 grep.awk sed 都支持
通配符是匹配符合条件的文件名,通配符是完全匹配 ls find cp 不支持正则表达式 所以只能使用shell自己的通配符来进行匹配
正则表达式
选项 | 作用 |
---|---|
* | 前一个字符 匹配0 次或任意次数 |
. | 匹配除了换行符外任意一个字符 |
^ | 匹配行首 |
$ | 匹配行尾 |
[] | 匹配【】里面的任意一个字符 |
[^] | 匹配 除了【】里面的任意一个字符 |
\ | 转义符 |
\ {n \ } | 表示其前面的字符恰好n次 |
\ {n, \ } | 表示其前面的字符大于n次 |
\ {n, m\ } | 表示其前面的字符出现次数为n到吗次 m>n |
1.字符串命令cut
cut -f 列 文件 默认分隔符是空格
cut -d “:” f 列 文件 分隔符是:
2.字符串命令 awk
printf 和 print 只能在awk 中使用
printf 支持格式输出
%ns
%ni
%m.nf
printf '%S\t' aa
#打印aa 加TAB
print 会自动加入一个换行符
awk {t条件1}{动作1} {t条件2}{动作2} 。。文件
3.sed
修改的是文件的输出内容 还没有修改原本的文件 如果想要影响到原来的文件需要加参数-i
4.排序
选项 | 作用 |
---|---|
-f | 忽略大小写 |
-n | 以数值来进行排序默认时字符串行排序 |
-r | 反向排序 |
-t | 指定分隔符 默认的分隔符是制表符 |
-k n[,m] | 按照指定的字段范围排序 n 开始 m 结束 |
六.条件判断
1.文件判断
2.权限判断
3.文件比较
4.数值比较
[root@localhost sff]# [ 11 -ge 22 ] &&echo 1 || echo 2
2
[root@localhost sff]# [ 11 -le 22 ] &&echo 1 || echo 2
1
5.字符串判断
七.流程控制
1.if
单分支
写法一
if [条件判断];then
程序
fi
=====================
写法二
if [条件判断]
then
程序
fi
多分支
if [ 条件判断]
then
条件成立 执行
else
条件不成立 执行
fi
=========================
if [条件]
then
程序
elif [条件]
then
程序
elif [条件]
then
程序
else
程序
fi
2.CASE
case $cho in
“case1” )
echo"Your choose is yes!"
;;
“case2” )
each “Your choose is yes!”
;;
* )
each “Your choose is yes!”
;;
3.for
for((初始值;循环控制条件;变量变化))
do
程序
done
4.while
while [ 条件 ] //条件成立执行
do
程序
done
八.服务管理
1.服务自启动
/etc/rc.d/rc.local
修改文件 把自启动脚本写入
[root@localhost sff]# cd /etc/rc.d
[root@localhost rc.d]# cat rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
##启动脚本
ntsysv 也是可以 但是推荐上一个方式
九.进程管理
1.进程简介
进程i正在执行的一个程序或者命令,每一个经常都是一个运行的实体,都有自己的实体空间,并占用一定的系统资源
2.进程管理的作用
- 判断服务器的健康状态
- 查看系统中的所有进程
- 杀死进程
3.查看进程
[root@localhost rc.d]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 193616 6632 ? Ss 8月28 0:02 /usr/lib/systemd/systemd --switched-root --system --deseriali
root 2 0.0 0.0 0 0 ? S 8月28 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 8月28 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 8月28 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 8月28 0:00 [migration/0]
VSZ:虚拟内存 KB
RSS:实际物理内存 KB
TTY:该进程是在那个终端中进行的 tty1-tty7 代表是本地控制台终端 1~6是字符终端 7 是图形终端 pts0~255是虚拟终端
STAT:R运行 S: 休眠状态 T :停止 +:后台运行
TIME:占用CPU 运行时间
COMMAND:进程名
top 判断服务器的健康状态
top 【选项】
选项 | 作用 |
---|---|
-d | top更新的间隔 默认3 s |
在top命令的交互模式中执行一下命令 | |
? 或者 h | 显示交互模式的帮助 |
P | CPU 占用来排名 默认就是这个选项 |
M | 以内存的使用率排序 |
N | 以PID排序 |
q | 退出top |
[root@localhost ~]# top -d 10
##第1行
top - 22:38:32 up 1 day, 4:21, 2 users, load average: 0.00, 0.01, 0.05
##第2行
Tasks: 118 total, 1 running, 117 sleeping, 0 stopped, 0 zombie
##第3行
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
#第4行
KiB Mem : 1865308 total, 1408452 free, 153752 used, 303104 buff/cache
#第5行
KiB Swap: 2097148 total, 2097148 free, 0 used. 1513328 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2490 root 20 0 162100 2340 1600 S 0.2 0.1 0:00.28 top
37 root 20 0 0 0 0 S 0.1 0.0 0:32.91 kworker/1:1
691 root 20 0 298940 6300 4952 S 0.1 0.3 1:08.93 vmtoolsd
1049 root 20 0 573844 19064 6044 S 0.1 1.0 0:10.37 tuned
1 root 20 0 193616 6632 4120 S 0.0 0.4 0:02.11 systemd
**第1行 ** 系统运行信息
top - 22:38:32 up 1 day, 4:21, 2 users, load average: 0.00, 0.01, 0.05
内容 | 说明 |
---|---|
22:38:32 | 系统当前时间 |
up 1 day, 4:21 | 系统的运行时间 1天4 小时21 分钟 |
2 users | 当前有两个用户 |
load average: 0.00, 0.01, 0.05 | 1,5,15 分钟的平均负载 小于1 负载小 大于1 负载较大 |
第2行 进程信息
Tasks: 118 total, 1 running, 117 sleeping, 0 stopped, 0 zombie
内容 | 说明 |
---|---|
Tasks: 118 total | 系统中的进程总数 |
1 running | 系统中运行的进程总数 |
117 sleeping | 睡眠的进程 |
0 stopped | 正在停止的进程 |
0 zombie | 僵尸进程 如果不是0 需要手动检查该进程 |
第3行 cpu信息
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
内容 | 说明 |
---|---|
%Cpu(s): 0.0 us | 用户模式占用CPU百分比 |
0.0 sy | 系统模式占用CPU百分比 |
0.0 ni | 改变优先级的进程占用CPU百分比 |
100.0 id | 空闲占用CPU百分比 |
0.0 wa | 等待输入输出的进程占用CPU百分比 |
0.0 hi | 硬CPU中断 |
0.0 si | 软CPU中断 |
0.0 st | 虚拟时间CPU百分比 |
第4行 内存信息
KiB Mem : 1865308 total, 1408452 free, 153752 used, 303104 buff/cache
内容 | 说明 |
---|---|
KiB Mem : 1865308 total | 物理内存总量 |
1408452 free | 空闲的物理内存 |
153752 used | 已使用物理内存总量 |
303104 buff/cache | 缓存的内存的数量 |
第5行 交换分区的swap 的信息
KiB Swap: 2097148 total, 2097148 free, 0 used. 1513328 avail Mem
内容 | 说明 |
---|---|
KiB Swap: 2097148 total | 交换分区/虚拟内存 的大小 |
2097148 free, | 已使用的交换分区 |
0 used | 空闲的交换分区 |
1513328 avail Mem | 作为缓存的交换分区大小 |
3.pstree
查看进程树 -p 带pid
[root@localhost ~]# pstree -p
systemd(1)─┬─NetworkManager(733)─┬─{NetworkManager}(745)
│ └─{NetworkManager}(748)
├─VGAuthService(690)
├─agetty(712)
├─auditd(655)───{auditd}(656)
├─chronyd(684)
├─crond(702)
├─dbus-daemon(682)───{dbus-daemon}(689)
├─firewalld(715)───{firewalld}(855)
├─irqbalance(680)
├─lvmetad(518)
├─master(1325)─┬─pickup(2513)
│ └─qmgr(1329)
├─polkitd(678)─┬─{polkitd}(692)
│ ├─{polkitd}(696)
│ ├─{polkitd}(698)
│ ├─{polkitd}(705)
│ └─{polkitd}(713)
├─rsyslogd(1047)─┬─{rsyslogd}(1055)
│ └─{rsyslogd}(1057)
├─sshd(1046)─┬─sshd(1753)───bash(1757)───top(2490)
│ └─sshd(2491)───bash(2495)───pstree(2533)
├─systemd-journal(492)
├─systemd-logind(681)
├─systemd-udevd(529)
├─tuned(1049)─┬─{tuned}(1421)
│ ├─{tuned}(1422)
│ ├─{tuned}(1423)
│ └─{tuned}(1436)
└─vmtoolsd(691)───{vmtoolsd}(719)
4.杀进程
1).kill
[root@localhost ~]# kill -l ### L
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
常用 |
---|
kill -1 PID |
kill -9 PID |
kill -15 PID |
2)killall
killall -9 进程名 会杀死进程名下面的所有进程
3)pkill
按照终端号提出用户
pkill -9 -t pts/1
5.工作管理
1.命令放入后台
方法1
命令 + & 后台执行
方法2
top 后 ctrl+Z
十.系统资源查看
1.查看系统位数
file /bin/ls 查看如何文件都可以
2.demsg 查看开机信息
3.free 内存信息
4.cache 和buff
区别 cache 是加速数据读取
buffer 加速数据的写入 只能是被内核直接使用
5.uptime
系统运行时间 ==top 第一行
6.查看内核
uname
-a 所有
-r 内核版本
-s 操作系统
十一.系统的定时任务
[root@localhost rc.d]# ps -ef |grep crond
root 702 1 0 8月28 ? 00:00:00 /usr/sbin/crond -n
root 2595 1757 0 23:39 pts/0 00:00:00 grep --color=auto crond
crond 是自启动的
1.用户的crotab 设置
crontab [选项]
选项 | 作用 |
---|---|
-e | 编辑crontab 任务 |
-l | 查询crontab 任务 |
-r | 删除当前用户的所有crontab任务 |
[root@localhost rc.d]# crontab -e
no crontab for root - using an empty one
* * * * * command ### 启动命令
#corn 表达式
-etdncc6t-1630389446446)]
常用 |
---|
kill -1 PID |
kill -9 PID |
kill -15 PID |
2)killall
killall -9 进程名 会杀死进程名下面的所有进程
3)pkill
按照终端号提出用户
pkill -9 -t pts/1
5.工作管理
1.命令放入后台
方法1
命令 + & 后台执行
方法2
top 后 ctrl+Z
十.系统资源查看
1.查看系统位数
file /bin/ls 查看如何文件都可以
2.demsg 查看开机信息
3.free 内存信息
4.cache 和buff
区别 cache 是加速数据读取
buffer 加速数据的写入 只能是被内核直接使用
5.uptime
系统运行时间 ==top 第一行
6.查看内核
uname
-a 所有
-r 内核版本
-s 操作系统
十一.系统的定时任务
[root@localhost rc.d]# ps -ef |grep crond
root 702 1 0 8月28 ? 00:00:00 /usr/sbin/crond -n
root 2595 1757 0 23:39 pts/0 00:00:00 grep --color=auto crond
crond 是自启动的
1.用户的crotab 设置
crontab [选项]
选项 | 作用 |
---|---|
-e | 编辑crontab 任务 |
-l | 查询crontab 任务 |
-r | 删除当前用户的所有crontab任务 |
[root@localhost rc.d]# crontab -e
no crontab for root - using an empty one
* * * * * command ### 启动命令
#corn 表达式
[外链图片转存中…(img-6f3KPMiC-1630389446447)]
[外链图片转存中…(img-u4IuzAqY-1630389446448)]
十一. shell 快捷键
快键键 | 含义 |
---|---|
ctrl+a | 回到行首 |
ctrl+e | 跳到行尾 |
ctrl+u | 清空命令 |
ctrl+p | 上条指令 |
ctrl+n | 下条指令 |
ctrl+b | 回退 |
ctrl+f | 前进 |
ctrl+d | delete 光标后面的 |