linux 常用的shell命令

linux curl post

curl -X POST -H 'Content-Type: application/json' -i  http://localhost:8080/xxsx --data '{}' -H "token:"

先大概列一下常用的命令

cd、ls、ll、grep、less、tail、vi、vim、touch等,我就不一一列举了

查看硬盘空间情况df -l
[root@localhost dev]# df -l
查看内存:free -m
[root@localhost bin]# free -m
查看cpu型号:cat /proc/cpuinfo
[root@localhost bin]# cat /proc/cpuinfo 
查看内核版本:uname -a
[root@localhost bin]# uname -a
查看系统版本:lsb_release -a
[root@localhost /]# lsb_release -a

查看端口占用情况:
lsof -i :port

查看是否有某些文件:
find ~/develop -name filename 查找develop 目录下的文件名为某某的

rpm -qa|grep -i  mysql  检查是否安装过mysql
rpm -ivh:安装显示安装进度--install--verbose--hash

#注释
#单行用#多行用:<<!....!
#在bash中,$( )与` `(反引号)都是用来作命令替换的
#$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的
#一般情况下,$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围

#linux中shell变量$#,$@,$0,$1,$2的含义解释: 


#变量说明: 
$$ 
#Shell本身的PID(ProcessID) 
$! 
#Shell最后运行的后台Process的PID 
$? 
#最后运行的命令的结束代码(返回值) 
$- 
#使用Set命令设定的Flag一览 
$* 
#所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 
$@ 
#所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 
$# 
#添加到Shell的参数个数 
$0 
#Shell本身的文件名 
$1~$n 
#添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

 

我大概列举一下简单的一些

#解压
tar -zxvf fileName
unzip FileName.zip
#查系统版本:
cat /etc/redhat-release 
sudo vim #操作命令 回车输入密码就root用户权限
df -h #磁盘命令
du -sh #查文件大小
#查看某一端口的占用情况: lsof -i:端口号
#linux端口状态查看相关命令
netstat -an|grep 8080
#获取某个文件的内容,通过名字过滤、再通过:剪切,再去重
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

#后台启动某个进程
nohup sh xx.sh >./nxx.log 2>&1 &
#再如:
nohup java -jar ./springbootjardemo.jar > springbootjardemo.log 2>&1 &

shell运算

#!/bin/bash
#第一方式$()
RESULT1=$(((2+3)*4));

echo "result1=$RESULT1"
#第二种方式[]
RESULT2=$[(2+3)*4]
echo "result2=$RESULT2"

#使用expr 运算号与数据之间必须要有空格符号
#expr  + , - , \*,  /,  %    加,减,乘,除,取余
#注意:expr运算符间要有空格
TEMP=`expr 2 + 3`;
RESULT3=`expr $TEMP \* 4`
echo "result3=$RESULT3"

#$((运算式))”或“$[运算式]
#求出两个参数的和
SUM=$[$1+$2]
echo "SUM=$SUM"

if语句

#!/bin/bash
#案例1:"ok"是否等于"ok"
#if和[ ]之间要空格
#[ ]和“ ”之间要空格
# ”和=之间要空格 
#否则都会报错
if [ “ok” = “ok” ]; then
        echo "equal"
else
        echo "not equal"
fi

#案例2:20是否大于等于20
#大于 -gt (greater than) 
#小于 -lt (less than) 
#大于或等于 -ge (greater than or equal) 
#小于或等于 -le (less than or equal) 
#不相等 -ne (not equal)
if [ 25 -ge 25 ]; then
        echo "equal"
else
        echo "not equal"
fi

#案例3:/opt/tmp/aaa.txt 目录中的文件是否存在
if [ -e /opt/tmp/aaa.txt ]; then
        echo "exist"
fi

$的用法

#!/bin/bash

#$$ Shell本身的PID(ProcessID)
#$! Shell最后运行的后台Process的PID
#$? 最后运行的命令的结束代码(返回值)
#$- 使用Set命令设定的Flag一览  
#$* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
#$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
#$# 添加到Shell的参数个数
#$0 Shell本身的文件名
#$1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

#获取到各个参数
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数=$#"


echo "当前的进程号=$$"
#后台的方式运行 myShell.sh
sh myshell.sh &
echo "最后的进程的号=$!"
echo "执行的值=$?"

function

#!/bin/bash

function sum(){
        S=0
        S=$[$n1+$n2]
        echo "s=$S"
}

read -p "请输入第一个数n1=" n1
read -p "请输入第一个数n2=" n2

sum $n1 $n2

for的用法

#!/bin/bash
#案例1 :打印命令行输入的参数
#使用 $*
for i in "$*"
do
        echo "the num is $i"
done
echo "==============================="
#使用 $@
for j in "$@"
do
        echo "the num is $j"
done

#案例2 :从1加到100的值输出显示
#定义一个变量
SUM=0
for((i=1;i<=100;i++))
do
        SUM=$[$SUM+$i]
done
echo "sum=$SUM"

while的用法

#!/bin/shell
#案例1 :从命令行输入一个数n,统计从 1+..+ n 的值是多少
SUM=0
i=0
while [ $i -le $1 ]
do
        SUM=$[$SUM+$i]
        i=$[$i+1]
done

echo "sum=$SUM"

case的用法

#!/bin/bash
#案例1 :当命令行参数是 1 时,输出 "周一", 是2 时,就输出"周二", 其它情况输出  "other"
case $1 in
"1")
        echo "周一"
        ;;
"2")
        echo "周二"
        ;;
"3")
        echo "周三"
        ;;
*)
        echo "other"
        ;;
esac

同步脚本的Demo

#!/bin/shell
#1 获取输入参数个数, 如果没有参数,直接退出
paramCount=$#
if [ $paramCount -eq 0 ]; then
        echo "no args"
        exit
fi
#2 获取文件名称
p1=$1
#filename=$(basename $p1)和fname=`basename $p1`是一样的
filename=$(basename $p1)

echo filename=$filename
#3 获取上级目录到绝对路径
#$(cd -P $(dirname $p1); pwd) 和`cd -P $(dirname $p1); pwd` 即$() 和``反向引号是一样的
pdir=$(cd -P $(dirname $p1); pwd)
echo pdir=$pdir
#4 获取当前用户名称
#user=`whoami`
user=$(whoami)
#echo user=$user
for((hosts=2; hosts<5; hosts++)); do
        #rsync -rvl $pdir/$fname $user@weisg00$host:$pdir

        echo $pdir/$fname $user@weisg00$hosts:$pdir
done

进程监控的Demo

top   //每隔5秒显式所有进程的资源占用情况
top -d 2  //每隔2秒显式所有进程的资源占用情况
top -c  //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数

pmap  pmap - report memory map of a process(查看进程的内存映像信息)
选项含义
       -x   extended       Show the extended format. 显示扩展格式
       -d   device         Show the device format.   显示设备格式
       -q   quiet          Do not display some header/footer lines. 不显示头尾行
       -V   show version   Displays version of program. 显示版本

#!/bin/shell
#进程号
input_process_id=$1
while true
do
        pmap -d ${input_process_id}|tail -1
        sleep 3
done

 

我用springboot开发,所以看下一下springboot.jar的启动及停止,只要你看懂了启动,停止就懂了

不多说,直接上代码:

#!/bin/sh
RESOURCE_NAME=springbootjardemo.jar
 
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
	echo 'Stop Process...'
	kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
	echo 'Kill Process!'
	kill -9 $tpid
else
	echo 'Stop Success!'
fi
 
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
	echo 'App is running.'
else
	echo 'App is NOT running.'
fi
 
#rm -f tpid
nohup java -jar ./$RESOURCE_NAME --spring.profiles.active=test >> demo.out &
#echo $! > tpid
if [ $! -gt ${tpid} ]; then
	echo Start Success!
fi

 

如果是写接口的,有linux上可以了解一下压力测试工具siege的用法

 

在Linux上搞集群,自然少不了时间同步设置问题

llinux下时间同步的方法
ntpdate time.nist.gov
其中 time.nist.gov 是一个时间服务器.
删除本地时间并设置时区为上海
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

 

Linux(CentOS) 如何查看当前占用CPU或内存最多的K个进程

可以使用以下命令查使用内存最多的K个进程
ps -aux | sort -k4nr | head -K
如果是10个进程,K=10,如果是最高的三个,K=3
说明:ps -aux中(a指代all——所有的进程,u指代userid——执行该进程的用户id,x指代显示所有程序,不以终端机来区分)
sort -k4nr中(k代表从第几个位置开始,后面的数字4即是其开始位置,结束位置如果没有,则默认到最后;n指代numberic sort,根据其数值排序;r指代reverse,这里是指反向比较结果,输出时默认从小到大,反向后从大到小。)。本例中,可以看到%MEM在第4个位置,根据%MEM的数值进行由大到小的排序。

 head -K(K指代行数,即输出前几位的结果)

 |为管道符号,将查询出的结果导到下面的命令中进行下一步的操作。

可以使用下面命令查使用CPU最多的K个进程
ps -aux | sort -k3nr | head -K

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。

一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

vmstat 2 1

2表示每个两秒采集一次服务器状态,1表示只采集一次。

vmstat 2 #2表示每个两秒采集一次服务器状态

每个参数的意思:

r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

free   空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

buff   Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi  块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么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 等待IO CPU时间。

 

 

其他命令:

dump分析工具:tda.bat
jstack -l

jstat jstatd jstack

使用vmstat命令来查看上下文切换的次数

看看是不是context switching导致的overhead过高。常用命令: pidstat vmstat

 

mysql备份脚本

#!/bin/bash
DBUser=root
DBPasswd=root123@#
DBName=db_name
SERVER=localhost
save_dir=/dbbackup/
LogFile="$save_dir"backup.log
NewFile="$save_dir"$DBName'_'$(date +%Y%m%d).sql
OldFile="$save_dir"$DBName'_'$(date +%Y%m%d --date='7 days ago').sql


if [ -f $OldFile ] 
then 
rm -f $OldFile >> $LogFile 2>&1 
echo "[$OldFile]Delete Old File Success!" >> $LogFile
else
echo "[$OldFile]No Old Backup File!" >> $LogFile
fi

if [ -f $NewFile ]
then
echo "[$NewFile]The Backup File is exists,Can't Backup!" >> $LogFile 
echo "Begin ro recover the data...." 
echo "Data has been restored!" >>$LogFile 
else 
mysqldump -h$SERVER -u$DBUser -p$DBPasswd --default-character-set='utf8' --quick --single-transaction -R $DBName >$NewFile 
echo "[$NewFile]Backup Success!" >> $LogFile 
fi

 

scp密码免输入ssh配置

yum install expect

#!/bin/bash/expect
set domain_name [lindex $argv 0]
#user_name=`echo $line | cut -d " " -f2`      # 提取文件中的用户名
#pass_word=`echo $line | cut -d " " -f3`      # 提取文件中的密码
spawn scp /home/weisg/.ssh/authorized_keys weisg@$domain_name:~/.ssh/
expect "yes/no" { send "yes\r"}     # expect 实现自动输入密码
expect "password" { send "wbsj123456!\n"}
interact

执行方式:

expect  ssh_auto.sh weisg007

升级内核到4.4版本

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装
一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
# 设置开机从新内核启动
grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'

在目录中找到且永久删除文件(xargs命令详解,xargs与管道的区别):

find / -name *gitlab*|xargs rm -rf

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值