没有什么特殊想法来写whisp,但是又想写一些东西。
心血来潮,很多linux的命令还不懂,边学边记,做个总结。
命令帮助
$ whatis command
$ whatis -w "comm*"
$ info command
$ man 1 command
$ man <number> command
$ which command
文件和目录
$ mkdir
$ rm
$ rm *log
等价于
$ find ./ -name “*log” -exec rm {}
查看当前目录下文件个数
$ find ./ | wc -l
切换到上一个目录
$ cd -
按时间排序,以列表的方式显示目录项
$ ls -lrt
$ alias lsl='ls -lrt'
$ alias lm='ls -al|more'
给文件编号
$ ls | cat -n
查找文件
$ find ./ -name "core*" | xargs file
递归当前目录及子目录删除所有.o文件;
$ find ./ -name "*.o" -exec rm {} \;
通过索引数据库查询
$ locate string
更新索引数据库
$ updatedb
$ cat -n <filename>
$ head -<number> <filename>
$ head -<number> **
$ diff file1 file2
$ tail -100f <filename>
查询文件内容
$ egrep '03.1\/CO\/AE' TSF_STAT_111130.log.012
$ egrep "string" **
增加脚本可执行权限
$ chmod a+x script
给文件增加别名
硬链接:删除一个,仍能找到
$ ln cc ccAgain
软连接:
$ ln -s cc ccTo
管道 & 重定向
- 批处理命令链接执行:|
- 串联:;
- 前面成功,则执行后面一条,否则不执行:&&
- 前面失败,则执行后面一条:||
$ ls /unexist && echo succ || echo failed
上面等价于
$ if ls /proc; then echo suss; else echo fail; fi
重定向:
将标准输出和标准错误重定向到同一文件
$ ls proc/*.c > list 2> &l
等价于
$ ls proc/*.c &> list
清空文件
$ :> <filename>
重定向:
$ echo aa >> aa.txt
查找record.log中包含AAA,但不包含BBB的记录的总数:
$ cat -v record.log | grep AAA | grep -v BBB | wc -l
文本处理
Shell处理文本时最常用的工具:
find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk
查找txt和pdf文件:
$ find . \( -name "*.txt" -o -name "*.pdf" \) -print
正则方式查找.txt和pdf:
$ find . -regex ".*\(\.txt|\.pdf\)$"
$ find . -regex ".*\(\.txt|\.pdf\)$" | wc -l
$ -iregex: 忽略大小写的正则
否定参数 ,查找所有非txt文本:
$ find . ! -name "*.txt" -print
指定搜索深度,打印出当前目录的文件(深度为1):
$ find . -maxdepth 1 -type f
磁盘管理
查看磁盘空间
查看磁盘空间
$ df -h
查看当前目录所占空间
$ du -sh
- -h 人性化显示
- -s 递归整个目录的大小
查看当前目录下所有子文件夹排序后的大小:
$ for i in \ls`; do du -sh du -sh `ls` | sort`
打包 & 压缩
打包:将多个文件归并到一个文件
$ tar -cvf etc.tar /etc <==仅打包,不压缩!
- -c :打包选项
- -v :显示打包进度
- -f :使用档案文件
用tar实现文件夹同步,排除部分文件不同步:
$ tar --exclude '*.svn' -cvf - /path/to/source | ( cd /path/to/target; tar -xf -)
压缩
$ gzip demo.txt
解包
$ tar -xvf demo.tar
- -x :解包选项
对于.tar.gz的文件,先解压缩,再解包
$ gunzip demo.tar.gz
bz2解压:
$ tar jxvf demo.tar.bz2
如果不支持j选项,则用bzip2先解压,再解包:
$ bzip2 -d demo.tar.bz2
$ tar -xvf demo.tar
- -d: decompose
- -z: 解压gz文件
- -j: 解压bz2文件
- -J: 解压xz文件
进程管理
任何进程都与文件有关,会用到lsof工具(list opened files):例举系统中已经被打开的文件。
查询正在进行的进程信息:
$ ps -ef
查询归属于用户test的进程:
$ ps -ef | grep test
$ ps -lu test
查询进程ID:
$ pgrep <ID>
查询进程名中含有php的进程:
$ pgrep -l php
以完整格式显示所有进程:
$ ps -ajx
显示进程信息,并实时更新:
$ top
查看端口3306占用的进程状态:
$ lsof -i:3306
查看用户username的进程所打开的文件
$ lsof -u <username>
查询init进程当前打开的文件:
$ lsof -c init
查询指定的进程ID(23295)打开的文件:
$ lsof -p 23295
查询指定目录mydir下被进程开启的文件(使用+D 递归目录):
$ lsof +d mydir/
终止进程
$ kill <pid>
$ kill -9 <pid>
$ kill %job
进程监控
$ top
?进入交互界面后,输入:
- P:根据CPU使用百分比大小进行排序。
- M:根据驻留内存大小进行排序。
- i:使top不显示任何闲置或者僵死进程。
?:Mac上没有这个指令,centos6.5有使用命令pmap,来输出进程内存的状况,可以用来分析线程堆栈;
$ pmap <PID>
将用户username下的所有进程名以av_开头的进程终止:
$ ps -u username | awk '/av_/ {print "kill -9 " $1}' | sh
将用户username下所有进程名中包含HOST的进程终止:
$ ps -ef | grep username | grep HOST | awk '{print $2}' | xargs kill -9;
性能监控
监控CPU
$ sar -u <num1> <num2>
$ sar -q <num1> <num2>
- num1: 频率
- num2: 次数
监控内存
$ sar -r <num1> <num2>
查看内存使用量
$ free -m
查看页面交换发生状况
页面发生交换时,服务器的吞吐量会大幅下降;服务器状况不良时,如果怀疑因为内存不足而导致了页面交换的发生,可以使用sar -W这个命令来确认是否发生了大量的交换;
$ sar -W <num1> <num2>
替代:
linux下有 vmstat、Unix系统有prstat
$ vmstat n m
- n: 频率
- m: 次数
监控变化
$ watch
$ watch -d -n 1 './redis-cli -h 127.0.0.1 -p 9100 info | grep memory'
网络工具
查询服务 & 端口
列出所有端口
$ netstat -a
列出所有tcp端口
$ netstat -at
列出所有监听的服务状态
$ netstat -l
查询端口
$ netstat -antp | grep 6379
$ ps <PID>
路由
查看路由状态
$ route -n
发送Ping包
$ ping <IP>
探测前往地址IP的路由路径:
$ traceroute <IP>
DNS查询,寻找域名domain对应的IP:
$ host domain
反向DNS查询
$ host <IP>
下载
$ wget url
- -limit-rate: 下载限速
- -o: 指定日志文件输出
- -c: 断点续传
ftp, sftp, lftp, ssh
$ ssh ID@host
文件传输:
$ sftp ID@host
sftp登陆后,可以使用下面的命令进一步操作:
- get filename # 下载文件
- put filename # 上传文件
- ls # 列出host上当前路径的所有文件
- cd # 在host上更改当前路径
- lls # 列出本地主机上当前路径的所有文件
- lcd # 在本地主机更改当前路径
lftp同步文件夹 (rsync)
$ lftp -u user:pass host
$ lftp user@host:~ > mirror -n
将本地localpath指向的文件上传到远程主机的path路径:
$ scp localpath ID@host:path
以ssh协议,遍历下载path路径下的整个文件系统,到本地的localpath:
$ scp -r ID@site:path localpath
用户管理工具
添加用户:
$ useradd -m username
创建密码:
$ passwd username
删除用户:
$ userdel -r username
切换账号:
$ su userB
查看当前用户所属组:
$ groups
将用户加入到组
$ usermod -G groupname username
变更用户所属根组
$ usermod -g groupname username
查看所有用户 & 权限
$ more /etc/passwd
$ more /etc/group
$ chmod userMark(+|-)PermissionsMark
userMark取值:
- u:用户
- g:组
- o:其它用户
- a:所有用户
PermissionsMark取值:
- r:读
- w:写
- x:执行
环境变量
bashrc与profile都用于保存用户的环境信息,bashrc用于交互式non-loginshell,而profile用于交互式login shell。
- /etc/profile,/etc/bashrc 是系统全局环境变量设定
/.profile,/.bashrc用户目录下的私有环境变量设定
当登入系统获得一个shell进程时,其读取环境设置脚本分为三步:
- 首先读入的是全局环境变量设置文件/etc/profile,然后根据其内容读取额外的文档,如/etc/profile.d和/etc/inputrc
- 读取当前登录用户Home目录下的文件~/.bash_profile,其次读取~/.bash_login,最后读取~/.profile,这三个文档设定基本上是一样的,读取有优先关系
- 读取~/.bashrc
/.profile与/.bashrc的区别:
这两者都具有个性化定制功能
- ~/.profile可以设定本用户专有的路径,环境变量,等,它只能登入的时候执行一次
- ~/.bashrc也是某用户专有设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次
.bashrc: dmp=/data/www/dmp
$ cd $dmp
系统管理 & IPC资源管理
查看Linux系统版本
$ uname -a
$ lsb_release -a
查看Unix
$ more /etc/release
查看CPU
$ cat /proc/cpuinfo
查看内存信息:
$ cat /proc/meminfo
显示内存page大小(以KByte为单位):
$ pagesize
显示架构:
$ arch
设置时区
选择时区信息。命令为:
$ tzselect
?IPCS
显示当前所有的系统资源limit 信息:
$ ulimit -a
性能优化
系统瓶颈
$ top
- M
- P
$ free
如果IO存在性能瓶颈,top工具中的%wa会偏高;
进一步的分析可以使用
$ iostat
$ iostat -d -x -k 1 10
- 如果 %iowait的值过高,表示硬盘存在I/O瓶颈。
- 如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
- 如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;
- 如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。
- 如果 avgqu-sz比较大,也表示有大量io在等待。
进程分析
$ pstack <PID>
$ strace
性能分析
$ gprof
调试内存泄漏:
$ valgrind
$ Oprofile