虽然平时大部分工作都是Java开发相关,但是我每天都会接触Linux系统,尤其是在使用了Mac之后,每天都是在黑色背景的命令行环境下工作。本人记性不好,很多有用的linux命令都记不太清楚了,慢慢总结一下,方便后续查看。基本操作Linux关机,重启#shutdownshutdown-hnow#restartshutdown-rnow查看系统,CPU信息#查看系统内核信息uname-a#查看系统内核版本cat/proc/version#查看当前用户环境变量envcat/proc/cpuinfo#查看有多少个逻辑CPU,包括CPU型号cat/proc/cpuinfo|grepname|cut-f2-d:|uniq-c#查看有多少个cpu,每个有多少核cat/proc/cpuinfo|grepphysical|uniq-c#查看当前CPU是运行在32bit还是64bit模式,如果运行在32bit,并不代表CPU不支持64bitgetconfLONG_BIT#结果大于0,说明它支持64位计算。lm指的是longmode,lm是64bit的cat/proc/cpuinfo|grepflags|grep'lm'|wc-l建立软连接ln-s/usr/local/jdk1.8/jdkrpmrelated#查看是否安装通过rpm软件rpm-qa|grep软件名sshkey#createsshkeyssh-keygen-trsa-cyour_email@example.com#id_rsa.pub将内容复制到被控服务器的home/username/.ssh/authorized_keys,如果notthenNew(.sshpermissionis700,authorized_keyspermissionis600)commandrenaming#添加重命名配置aliasll='ls-alF'在每个用户的.bash_profile中同步服务器时间sudontpdate-untp.api.bz后台运行命令#后台运行,并且有nohup.out输出nohupxxx#后台运行,没有日志输出nohupxxx>/dev/null#后台运行,错误信息标准输出到日志nohupxxx>out.log2>&1&forceactiveuserexit#command完成强制活动用户退出。其中TTY表示终端名称pkill-kill-t[TTY]查看命令路径查看进程全部开启maximumfdulimit-n配置dnsvim/etc/resolv.confnslookup,查看域名路由表nslookupgoogle.comlast,最近登录信息列表#5最近登录账号last-n5setfixedipifconfigem1192.168.5.177netmask255.255.255.0查看进程加载的环境变量#也可以到cd/proc目录下,查看进程加载的东西memorypseww-pXXXXX(进程号)查看进程树找到服务器进程psauwxf查看进程启动路径cd/proc/xxx(进程号)ls-all#cwd对应启动路径添加用户,配置sudo权限#添加新用户useradd用户名passwdusername#添加sudo权限vim/etc/sudoers#修改文件#rootALL=(ALL)ALL#usernameALL=(ALL)ALL强制关闭进程名包含xxx的所有进程psaux|grepxxx|grep-vgrep|awk'{print$2}'|xargskill-9磁盘、文件、目录y相关操作vim操作#普通模式g表示全局,x表示搜索内容,y表示替换内容:%s/x/y/g#普通模式下0#移动光标到行首(数字0)$#移动光标到行尾shift+g#跳到文件末尾gg#跳到文件开头#显示行号:setnu#去掉行号:setnonu#Search/xxx(retrievexxx(retrievecontent)#从头检索,按n查找下一个?xxx(retrievecontent)#从尾检索打开只读文件,修改后需要保存时(可以不用切换用户方式保存)#在正常模式下:w!sudotee%查看磁盘、文件目录基本信息#查看磁盘挂载状态mount#查看磁盘分区信息df#查看目录及子目录大小du-H-h#查看当前目录下的每个文件,文件夹占用了多少空间,会不是递归的du-sh*wccommand#查看文件有多少行wc-lfilename#查看文件有多少个单词wc-wfilename#文件中最长的一行有多少个单词wc-Lfilename#统计字节数wc-c常用压缩、解压命令压缩命令tarczvfxxx.tar压缩目录zip-rxxx.zip压缩目录解压命令tarzxvfxxx.tar#unzip到指定文件夹tarzxvfxxx.tar-C/xxx/yyy/unzipxxx.zip更改文件所属用户和用户组chowneagleye.eagleyexxx.logcp,scp,mkdir#复制cpxxx.log#复制并覆盖同名文件cp-fxxx.log#复制文件夹cp-rxxx(源文件夹)yyy(目标文件夹)#远程复制scp-Pssh端口username@10.10.10.101:/home/username/xxx/home/xxx#级联创建目录mkdir-p/xxx/yyy/zzz#批量创建文件夹,test下会创建java和resources文件夹mkdir-psrc/{test,main}/{java,resources}比较两个文件diff-u1.txt2.txt日志输出的字节数,可以作为性能测试#如果做性能测试,可以输出"."每次执行到日志中,这样日志中的字节数就是实际性能测试运行的次数,还可以看到实时率。tail-fxxx.log|pv-bt查看,去除特殊字符#查看特殊字符cat-vxxx.sh#去除特殊字符sed-i's/^M//g'env.sh去除文件的特??殊字符,如^M:需要这样输入:ctrl+v+enter处理系统引起的文件特殊字符问题#可以转换为本系统以下文件格式catfile.sh>file.sh_bak#First复制file.sh中的文件内容并运行,然后粘贴内容,最后ctrl+d保存退出cat>file1.sh#在vim中,设置文件编码和文件格式:setfileencodings=utf-8,然后w(save)转为utf8格式,:setfileformat=unix#mac下使用dos2unix进行文件格式化find.-name"*.sh"|xargsdos2unixtee,redirect同时输出到屏幕awk'{print$0}'xxx.log|teetest.log检索相关的grep#反向匹配,找到不包含xxx的grep-vxxx#排除所有空行grep-v'^/pre>#返回结果2,表示第二行是空行grep-n"^$"111.txt#查询以abc开头的行grep-n"^abc"111.txt#同时列出该词出现的文章前几行grep'xxx'-nxxx.log#计算该词串出现的次数grep'xxx'-cxxx。log#比较时,忽略大小写差异grep'xxx'-ixxx.logawk#用':'作为分隔符,如果第五个字段有user,则输出这一行awk-F':''{if($5~/user/)print$0}'/etc/passwd#统计单个文件中某个字符(字符串)(中文无效)出现的次数awk-vRS='character''END{print--NR}'xxx.txtfind搜索命令#在目录中查找后缀为.mysql的文件find/home/eagleye-name'*.mysql'-print#会从/usr目录开始搜索,查找里面访问过的文件thelast3daysfind/usr-atime3–print#会直接从/usr开始往下看ory,查找最近5天内修改过的文件。find/usr-ctime5–print#会从/doc目录开始,查找文件名以j开头的jacky文件。find/doc-userjacky-name'j*'–print#将从/doc目录开始,查找文件名以ja或ma开头的文件。find/doc\(-name'ja*'-o--name'ma*'\)–print#会从/doc目录开始向下查找,找出所有文件名以bak结尾的文件,并删除。-exec选项表示执行,rm是删除命令,{}表示文件名,"\;"是指定命令的结尾。查找/文档名称'*bak'-execrm{}\;网络相关查看是什么进程使用了??这个端口lsof-i:port获取本地ip地址/sbin/ifconfig-a|grepinet|grep-v127.0.0.1|grep-vinet6|awk'{print$2}'|tr-d"addr:"iptables#查看iptables状态serviceiptablesstatus#Toblockaniptables-IINPUT-s***.***.***.***-jDROP#TounblockanIP,usethefollowingcommand:iptables-DINPUT-s***.***.***.***-jDROP注:参数-I表示Insert(添加),-D表示Delete(删除)。遵循规则,INPUT表示入站,***.***.***.***表示要屏蔽的IP,DROP表示放弃连接。#开放访问9090端口/sbin/iptables-IINPUT-ptcp--dport9090-jACCEPT#防火墙开启、关闭、重启/etc/init.d/iptablesstatus/etc/init.d/iptablesstart/etc/init.d/iptablesstop/etc/init.d/iptablesrestartnccommand,tcpdebuggingtool#向端点发送TCP请求,并将数据内容发送给对端nc192.168.0.118000received_data#只监听一次,如果可以多次加-k参数-wabc.pcap跟踪网络路由路径#traceroute使用udp方式通过默认,如果是-I,则改为icmp模式traceroute-Iwww.163.com#Tracefromthe3rdhopofttltraceroute-M3www.163.com#Addporttrackingtraceroute-p8080192.168.10.11ss#Displayallportsopenedlocallyss-l#显示每个进程专门打开的socketsss-pl#显示所有tcpsocketss-t-a#显示所有UDPSocektss-u-a#显示所有已建立的SMTP连接ss-ostateestablished'(dport=:smtporsport=:smtp)'#显示所有建立的HTTP连接ss-ostateestablished'(dport=:httporsport=:http)'找出所有连接到X服务器的进程ss-xsrc/tmp/。x11-unix/*列出当前socket统计信息ss-s解释:netstat遍历/proc下的各个PID目录,ss直接读取/proc/net下的统计信息。所以ss在执行的时候,比netstat消耗的资源和时间要少很多。netstat#输出每个ip的连接数,以及每个状态的连接总数netstat-n|awk'/^tcp/{n=split($(NF-1),array,":");if(n<=2)++S[数组[(1)]];else++S[数组[(4)]];++s[$NF];++N}END{for(ainS){printf("%-20s%s\n",a,S[a]);++I}printf("%-20s%s\n","TOTAL_IP",I);for(ains)printf("%-20s%s\n",a,s[a]);printf("%-20s%s\n","TOTAL_LINK",N);}'#所有连接的统计,#CLOSED:没有连接是活动的或正在进行中#LISTEN:服务器正在等待传入呼叫#SYN_RECV:连接请求已到达,等待确认#SYN_SENT:应用程序已启动,打开连接#ESTABLISHED:正常数据传输状态#FIN_WAIT1:Applicationsaysit'sdone#FIN_WAIT2:对方同意释放#ITMED_WAIT:等待所有数据包消亡#CLOSING:双方都试图同时关闭#TIME_WAIT:主动关闭connection一方还没有等到另一方反馈period#LAST_ACK的状态:等待所有数据包死亡netstat-n|awk'/^tcp/{++state[$NF]}END{for(keyinstate)printkey,"\t",state[key]}'#searchMoretime_waitconnectionsnetstat-n|grepTIME_WAIT|awk'{print$5}'|sort|uniq-c|sort-rn|head-n20监控Linux性能命令按对应列排序,回车。大写R键可以反转当前排序列名称含义PID进程idPPID父进程idRUSER真实用户名UID进程所有者用户idUSER进程所有者用户名GROUP进程所有者组名TTY启动进程终端名称。不是从终端启动的进程显示为?PR优先NInice值。负值表示高优先级,正值表示低优先级P最近使用的CPU,只在多CPU环境下有意义%CPU从上次更新到现在占用的CPU时间百分比进程,单位秒TIME+进程使用的CPU总时间,单位是1/100秒%MEM进程使用的物理内存百分比VIRT进程使用的虚拟内存总量,单位是kb。VIRT=SWAP+RES在SWAP进程使用的虚拟内存中,换出的大小以kb为单位。RES进程使用且未换出的物理内存大小,以kb为单位。RES=CODE+DATACODE可执行代码占用的物理内存大小,单位为kbDATA可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位为kbSHR共享内存大小,单位为kbnFLT缺页次数nDRT自上次写入以来已修改的页数。S过程状态。D=不间断睡眠状态,R=running,S=sleep,T=track/stop,Z=zombie进程COMMAND命令名/命令行WCHAN如果进程处于睡眠状态,会在sleepFlags任务中显示系统函数名flag,参考sched.hdmesg,查看系统日志dmesgiostat,磁盘IO状态监控iostat-xz1#r/s,w/s,rkB/s,wkB/s:分别表示每秒读写次数和每秒读取和写入的数据量(千字节)。过多的读写可能会导致性能问题。#await:IO操作的平均等待时间,单位毫秒。这是应用程序在与磁盘交互时需要消耗的时间,包括IO等待和实际操作所花费的时间。如果这个值太大,可能是硬件设备遇到了瓶颈或者出现了故障。#avgqu-sz:对设备发出的平均请求数。如果该值大于1,则可能是硬件设备饱和(部分前端硬件设备支持并行写入)。#%util:设备利用率。该值表示设备的繁忙程度。经验值是如果超过60,可能会影响IO性能(可以参考IO操作的平均等待时间)。如果达到100%,说明硬件设备已经饱和。#如果显示逻辑设备的数据,设备利用率不代表后端实际硬件设备饱和。值得注意的是,即使IO性能不理想,也不代表应用性能一定会差。可以使用预读和写缓存等策略来提高应用程序性能。free,memoryusagefree-meg:totalusedfreesharedbufferscachedMem:1002769232062421-/+buffers/cache:286715Swap:115301153Memline1:totalmemorytotal:1002Musedusedmemory:769Mfreeidlememory:232Msharediscurrentlyobsolete,Always0buffersBuffercache缓存内存:62Mcachedmemory:421M关系:total(1002M)=used(769M)+free(232M)第二部分(-/+buffers/cache):(-buffers/cache)usedmemory:286M(指used–buffers–cached在Mem行的第一部分)(+buffers/cache)freememory:715M(指的是Mem行第一部分的free+buffers+cached)visible-buffers/cachereflected是实际吃掉的内存程序,+buffers/cache反映了可以被盗用的内存总量。第三部分是指swap分区sar,查看网络吞吐量状态#sar命令这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量来判断网络设备是否饱和。这里使用sar-nDEV1##sar命令查看TCP连接状态,包括:#active/s:每秒本地发起的TCP连接数,即connect调用创建的TCP连接数;#passive/s:每秒远程发起的TCP连接数,即accept调用创建的TCP连接数;#retrans/s:每秒TCP重传次数;#TCP连接数可以用来判断性能问题是否是因为建立的连接太多,进一步可以用来判断连接是主动发起还是被动接受。TCP重传可能是网络环境差或者服务器压力过大导致丢包sar-nTCP,ETCP1vmstat,监控CPU使用率,内存使用率,给定时间的虚拟内存交互,IO读写#2表示每2收集一次seconds状态信息,1表示只采集一次(忽略既是一直采集)vmstat21eg:rbswpdfreebuffcachesisobiboincsussyidwa10034998403158363819660000120001000000349958431583638196600000881580010000003499708315836381966000028616200100000034997083158363819660000108115100100010034997323158363819660000283154001000r表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值如果超过了CPU的数量,就会出现CPU瓶颈。这也和top的负载有关。一般负载超过3就比较高,超过5就高,超过10就异常,服务器的状态很危险。top的负载类似于每秒运行队列。如果运行队列太大,说明你的CPU很忙,一般会导致CPU占用率高。b表示阻塞的进程。这个我就不多说了。大家都知道一个进程被阻塞了。swpd虚拟内存的已用大小。如果大于0,说明你的机器物理内存不足。如果不是程序内存泄漏的原因,那么就应该升级内存或者将耗内存的任务迁移到其他机器上。Free空闲物理内存的大小,我的机器内存总计8G,剩余3415M。bufflinux/unix系统用来存储、缓存目录里有什么内容,权限等,我的机器大概占了300多M的缓存。缓存直接用来记住我们打开的文件,对文件进行缓冲。我的机器大概占用了300多M(这里是Linux/Unix的巧妙之处,将一部分空闲的物理内存用作文件和目录缓存是为了提高程序执行的性能。当程序使用内存时,buffer/cached会quickly被使用。)si每秒从磁盘读取的虚拟内存的大小。如果这个值大于0,说明物理内存不够或者内存泄露,需要找到耗内存的进程解决。我的机器有足够的内存,一切正常。so每秒写入磁盘的虚拟内存大小,如果这个值大于0,同上。bi块设备每秒接收的块数。这里的块设备是指系统中的所有磁盘和其他块设备。默认块大小为1024字节。我在这台机器上没有IO操作,所以一直是0,但是我一直在处理在一台复制大量数据(2-3T)的机器上看到它可以达到140000/s,并且磁盘写入速度几乎是每秒140M。bo块设备每秒发送的块数。比如我们读一个文件,bo必须大于0,bi和bo一般都接近0,否则IO太频繁,需要调整。in每秒CPU中断次数,包括时间中断cs每秒上下文切换次数,比如我们调用系统函数时,需要进行上下文切换,线程切换,进程上下文切换。值越小越好,太大了现在考虑减少线程数或进程数。比如在apache、nginx等web服务器中,我们在做性能测试的时候一般会进行几千甚至几万的并发测试。选择web服务器的过程可以根据进程或线程的峰值是否已经降低,进行压力测试,直到cs达到一个比较小的值。这个进程数和线程数是一个比较合适的值。系统调用也是如此。每调用一次系统函数,我们的代码就会进入内核空间,从而产生上下文切换。这是非常耗费资源的,我们应该尽量避免频繁调用系统函数。太多的上下文切换意味着你的大部分CPU都浪费在上下文切换上,导致CPU做正事的时间变少,CPU没有得到充分利用,这是不可取的。us用户CPU时间,我以前很频繁的在一台服务器上做加解密,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能不好).sy系统CPU时间,如果太高说明系统调用时间长,比如频繁的IO操作。id空闲CPU时间,一般来说,id+us+sy=100,一般我认为id是空闲CPU占用率,us是用户CPU占用率,sy是系统CPU占用率。wt等待IOCPU时间。