Linux常用命令总结

2016-01-06

以下是平时用到的Linux命令(会不定期更新)

线上排查故障命令汇总

查看进程线程:

ps -T -p pid

top -H -p pid

htop

pstree -p pid

ls -l /proc/pid/task

strace -p pid

htop配置文件定制

$ cat /root/.config/htop/htoprc

# Beware! This file is rewritten by htop when settings are changed in the interface.
# The parser is also very primitive, and not human-friendly.
fields=0 48 17 18 38 39 40 2 46 47 49 1
sort_key=46
sort_direction=-1
tree_sort_key=0
tree_sort_direction=1
hide_kernel_threads=1
hide_userland_threads=0
shadow_other_users=0
show_thread_names=0
show_program_path=1
highlight_base_name=0
highlight_megabytes=1
highlight_threads=1
highlight_changes=0
highlight_changes_delay_secs=5
find_comm_in_cmdline=1
strip_exe_from_cmdline=1
show_merged_command=0
tree_view=1
tree_view_always_by_pid=0
header_margin=1
detailed_cpu_time=0
cpu_count_from_one=0
show_cpu_usage=1
show_cpu_frequency=0
show_cpu_temperature=0
degree_fahrenheit=0
update_process_names=0
account_guest_in_cpu_meter=0
color_scheme=0
enable_mouse=1
delay=15
left_meters=AllCPUs
left_meter_modes=1
right_meters=Tasks LoadAverage Uptime Memory Swap
right_meter_modes=2 2 2 1 1
hide_function_bar=0

进程内存分析

pmap -x pid

文件读写情况

lsof -p pid

查看端口监听情况

ss -lntp

netstat -lntp

JAVA 线上故障排查完整套路

Spring Boot“内存泄漏”?看看美团大牛是如何排查的

ubuntu清理软件包

比如清理掉redis

apt list --installed |grep redis|awk -F '/' '{print $1}'|xargs apt remove -y

清理依赖残留

dpkg -l|grep ^rc|awk '{print $2}'|xargs dpkg -P

vim linux下查找显示^M并且删除

linux下 ^M的输入方法是ctrl+v然后再ctrl+m

vim下
在文件中显示^M
:e ++ff=unix %

在文件中删除^M
:%s/^M$//g

在linux下查找^M
find ./ | xargs grep '^M' -l -s

在linux下删除^M
find ./ | xargs grep '^M' -l -s | xargs dos2unix

端口扫描

方法一(推荐):

nmap -Pn -p 80 192.168.0.1
nmap -sT 192.168.0.1

方法二:

nc -v -w 2 '192.168.0.1 -i' 80-90

方法三:

masscan -p80,8080-8100 192.168.0.0/24

计划任务crontab

命令行添加计划任务:

先建立计划任务文件root

crontab < root  #导入计划任务
cron            #启动计划任务后台程序

压缩工具

7z

安装:apt-get install p7zip p7zip-full p7zip-rar

解压:7z x xxx.7z

启动项管理工具

小工具 rcconf:
#sudo apt-get rcconf
#sudo apt-get install rcconf
root 下运行: #sudo rcconf

功能更全的工具:sysv-rc-conf
#sudo apt-get update
#sudo apt-get install sysv-rc-conf
运行:#sudo sysv-rc-conf
也可以直接加入启动程序,例如把 /etc/init.d/red5 加入到系统自动启动列表中:
#sudo sysv-rc-conf red5 on

方法二:

如果要添加为开机启动执行的脚本文件,
可先将脚本复制或者软连接到/etc/init.d/目录下,
然后用:update-rc.d xxx defaults NN命令(NN为启动顺序),
将脚本添加到初始化执行的队列中去。
注意如果脚本需要用到网络,则NN需设置一个比较大的数字,如99。

删除自动启动项:

cd /etc/init.d
update-rc.d -f xxx remove

cd /etc/init/
mv xxx.conf ~    #移动掉不需要的启动项

vim /etc/rc.local   #修改自启动脚本里的启动项

Linux后台进程管理利器

supervisor

安装

apt-get install supervisor

安装2

easy_install supervisor

生成配置文件

echo_supervisord_conf >/etc/supervisord.conf

配置文件(每个进程的配置文件都可以单独分拆,放在/etc/supervisor/conf.d/目录下,以.conf作为扩展名,例如,app.conf定义了一个gunicorn的进程):

[program:app]
command=/usr/bin/gunicorn -w 1 wsgiapp:application
directory=/srv/www
user=www-data

其中,进程app定义在[program:app]中,command是命令,directory是进程的当前目录,user是进程运行的用户身份。

重启supervisor,让配置文件生效,然后运行命令supervisorctl启动进程:

supervisorctl start app

停止进程:

supervisorctl stop app

重新加载配置文件(平滑加载):

supervisorctl update

重启supervisor:

supervisorctl reload

*报错: unix:///var/run/supervisor.sock no such file

sudo touch /var/run/supervisor.sock
sudo chmod 777 /var/run/supervisor.sock
sudo service supervisor restart

*报错:supervisorctl start 报 ERROR (spawn error)

unlink /tmp/supervisor.sock

开启web管理,往配置文件里添加(supervisord.conf):

[inet_http_server]
# Web管理界面设定
port=9001
username = admin
password = admin

官方文档:http://supervisord.org/

哈希值

MD5

根据字符串输出一段md5值:

echo -n 'hello'|md5sum|cut -d ' ' -f1

byobu

比screen好用,推荐替代screen

修改状态栏内容的配置文件:

~/.byobu/status

配置终端title

$ cat ~/.byobu/.tmux.conf

set -g set-titles on
set -g set-titles-string "#H"

修改默认开启状态:

byobu-enable
byobu-config

或进byobu模式后按下F9

关闭自动启动

byobu-disable

Screen

screen显示状态栏,编辑配置文件 /etc/screenrc 或 ~/.screenrc

screen
screen $SHELL -c 'screen -X caption always "%{.bW}%-w%{.rW}$STY%{-}%+w %=%H %Y/%m/%d %0c "'

或标准用法

screen
screen $SHELL -c 'screen -X caption always "%{.bW}%-w%{.rW}%n %t%{-}%+w %=$STY %H %Y/%m/%d %0c "'

启动会话

[root@malu ~]# screen

[root@malu ~]# screen -ls
There is a screen on:
        123.pts-1.malu      (Detached)
1 Socket in /tmp/screens/S-root.
重新连接会话:
[root@malu ~]# screen -r 123

如果会话是Attached状态,可以用-d选项是之离线:

[ root@malu:~ ]$ screen -d
There are several suitable screens on:
	2412.pts-3.malu	(02/08/17 14:35:21)	(Attached)
	2314.pts-5.malu	(02/08/17 14:27:37)	(Attached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
[ root@malu:~ ]$ screen -d 2412
[2412.pts-3.malu detached.]

[ root@malu:~ ]$ screen -ls
There are screens on:
	2412.pts-3.malu	(02/08/17 14:35:21)	(Detached)
	2314.pts-5.malu	(02/08/17 14:27:37)	(Attached)
2 Sockets in /var/run/screen/S-root.

启动一个带shell的离线screen:

# screen -dmS hack /home/act.sh

向会话发送指令:

# screen -S hack -X stuff 'ls\n'

在screen会话中创建一个新窗口,并在其中运行ping命令

# screen -S hack -X screen ping www.baidu.com

向特定screen会话的指定窗口发送指定命令(-p 指定窗口编号)

# screen -S hack -p 1 -X stuff 'ping -i 10 g.cn\n'

显示指定会话window窗口列表

# screen -S hack -Q windows

语法

# screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

删除一个会话

# screen -S hack -X quit

参数说明

-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  连接到离线模式的会话(多窗口同步演示)
-ls 或 --list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。
-U   让screen启动是以utf-8模式启动,防止出现中文乱码

可以通过C-a ?来查看所有的键绑定,常用的键绑定有:

C-a ? 显示所有键绑定信息

C-a w 显示所有窗口列表

C-a C-a 切换到之前显示的窗口

C-a c 创建一个新的运行shell的窗口并切换到该窗口

C-a n 切换到下一个窗口

C-a p 切换到前一个窗口(与C-a n相对)

C-a 0..9 切换到窗口0..9

C-a a 发送 C-a到当前窗口

C-a d 暂时断开screen会话

C-a k 杀掉当前窗口

C-a [ 进入拷贝/回滚模式

翻页:

[Ctrl]+[A],再按[ESC],进入复制模式,默认翻页快捷键是 下翻[Ctrl]+[F] , [Ctrl]+[n]  上翻[Ctrl]+[B] , [Ctrl]+[u]

参考文档:

http://man.he.net/?topic=screen&section=all

https://www.hclrc.com/744

http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html

CentOS安装redis

yum install epel-release
yum install list
yum install redis

sed 命令

插入到最后一行
sed -i '$a\要插入的文字' file.txt
使用 -i 选项直接修改文件。
$ 匹配文件的最后一行位置
a 命令在后面append

*其实可以这样:
echo '要插入的文字' >> file.txt

插入到第一行
sed -i '1i\要插入的文字' file.txt

替换一行文字
sed -i 's/^被替换的文字/要替换的文字/' file.txt

匹配一行后追加文字
sed -i 's/关键字/&要追加的文字/g' file.txt

在每行的头添加字符,比如"HEAD",命令如下:

sed 's/^/HEAD&/g' file.txt

在每行的行尾添加字符,比如“TAIL”,命令如下:

sed 's/$/&TAIL/g' file.txt

"^"代表行首,"$"代表行尾

把错误输出到标准输出:2>&1

2> 表示把标准错误(stderr)重定向,尖括号后面可以跟文件名,或者是&1, &2,分别表示重定向到标准输出和标准错误。

nohup后台执行

nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中。   

使用 jobs 查看任务。   

使用 fg %n 关闭

监视某进程的资源占用情况(pid进程id):

ps -p pid

在目录中找指定后缀的文件内容包含某个关键字的:

find ./ -name "*.php"|xargs grep -n xxx

grep匹配上下文

grep -C 5 foo file 显示file文件中匹配foo字串那行以及上下5行

grep -B 5 foo file 显示foo及前5行

grep -A 5 foo file 显示foo及后5行

scp命令

scp -P 4588 root@www.abc.com:/root/sn.sh /home/admin

-r 递归目录

-v 和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接 , 认证 , 或是配置错误 .

-C 使能压缩选项 .

-P 选择端口 . 注意 -p 已经被 rcp 使用 .

-4 强行使用 IPV4 地址 .

-6 强行使用 IPV6 地址 .

mount挂载目录

//挂载exfat
mount -t exfat -o iocharset=cp936 /dev/sdb1

获取BGP骨干网IP地址

//facebook
whois -h whois.radb.net -i origin AS32934|grep ^route

//谷歌 GAE解析地址:ghs.googlehosted.com
whois -h whois.radb.net -i origin AS15169|grep ^route

//[Incapsula](http://bgp.he.net/AS19551)
whois -h whois.radb.net -i origin AS19551|grep ^route

//cloudflare 节点众多,用这个查吧
http://bgp.he.net/search?search%5Bsearch%5D=cloudflare

ln建立文件系统链接

给网站目录建立软连接:

ln -s /app/www /var/www/html

按行数切割文件

split access.log.1 -l 100000 -d -a 2 access_ && ls|grep access_|xargs -n1 -i{} mv {} {}.log

说明:

-l:按行分割,上面表示将access.log.1文件按100000行一个文件分割为多个文件

-d:添加数字后缀,如00,01,02

-a 2:表示用两位数据来顺序命名

ssh

ssh连接的时候会出现:

The authenticity of host 'ssh.malu.me (14.17.80.36)' can't be established.
RSA key fingerprint is cf:ee:17:cb:2e:fc:12:d7:72:7e:ae:80:c0:91:88:a7.
Are you sure you want to continue connecting (yes/no)?

提示用户该指纹密钥需要确认才能继续连接,一般选yes就过了。

但是有些特殊情况不需要显示这个提示,那么需要在连接命令添加-o参数:

ssh -o "StrictHostKeyChecking no" user@host

或者修改 /etc/ssh/ssh_config 全局配置文件 或 ~/.ssh/config 用户配置文件:

Host *
   StrictHostKeyChecking no

ssh 在客户端中强制使用密码验证方式登陆:

在客户端,你可以在~/.ssh/config文件里加入:

PreferredAuthentications password

或者加上参数:

ssh -o PreferredAuthentications=password user@host

也可以在服务端:

sshd_config中的PubkeyAuthentication设为no

还可以把AuthenticationMethods设为publickey,password publickey,keyboard-interactive这样你就同时需要私钥和密码才能登录。

根据端口查看进程

lsof -Pnl -i4

-P : 这个选项约束着网络文件的端口号到端口名称的转换。约束转换可以使lsof运行得更快一些。在端口名称的查找不能奏效时,这是很有用的。

-n : 这个选项约束着网络文件的端口号到主机名称的转换。约束转换可以使lsof的运行更快一些。在主机名称的查找不能奏效时,它非常有用。

-l : 这个选项约束着用户ID号到登录名的转换。在登录名的查找不正确或很慢时,这个选项就很有用。

+M : 此选项支持本地TCP和UDP端口映射程序的注册报告。

-i4 : 仅列示IPv4协议下的端口。

-i6 : 仅列示IPv6协议下的端口。

另一条命令:

netstat -antp

精简返回结果:

netstat -lntp

查看磁盘信息

fdisk -l /dev/sda

lsblk

df -h

hdparm -I /dev/sda

dmesg|grep sda

查看内存占用情况

ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'

或者

top

alise 别名

常用别名设置 cat ~/.bashrc:

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

alias ls='ls -hFG'
alias l='ls -lFah'
alias ll='ls -alF'
alias lt='ls -ltrF'
alias ll='ls -alF'
alias lls='ls -alSrF'
alias llt='ls -altrF'

alias tarc='tar cvf'
alias tarcz='tar czvf'
alias tarx='tar xvf'
alias tarxz='tar xvzf'

alias g='git'
alias less='less -R'
alias os='lsb_release -a'
alias vi='vim'

# Colorize directory listing
alias ls="ls -ph --color=auto"

取消别名:

unalise cp

查看当前别名:

alise

国内源

教育网:http://mirrors.neusoft.edu.cn/

更多参考:http://wiki.ubuntu.org.cn/模板:16.04source