Linux常用命令总结
以下是平时用到的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
Spring Boot“内存泄漏”?看看美团大牛是如何排查的
内核调优
修改内核的拥塞控制算法
$ echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
$ sysctl -p
net.ipv4.tcp_congestion_control = bbr
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
哈希值
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§ion=all
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