linux 命令
Linux 相关操作
查看系统信息
cat /proc/version 查看系统版本
uname -a
cat /proc/cpuinfo
cat /etc/redhat-release
getconf -a 查看系统所有变量
getconf LONG_BIT 查看系统位数
# uname -a # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue # 查看操作系统版本
# cat /proc/cpuinfo # 查看CPU信息
# hostname # 查看计算机名
# lspci -tv # 列出所有PCI设备
# lsusb -tv # 列出所有USB设备
# lsmod # 列出加载的内核模块
# env # 查看环境变量资源
# free -m # 查看内存使用量和交换区使用量
# df -h # 查看各分区使用情况
# du -sh <目录名> # 查看指定目录的大小
# grep MemTotal /proc/meminfo # 查看内存总量
# grep MemFree /proc/meminfo # 查看空闲内存量
# uptime # 查看系统运行时间、用户数、负载
# cat /proc/loadavg # 查看系统负载磁盘和分区
# mount | column -t # 查看挂接的分区状态
# fdisk -l # 查看所有分区
# swapon -s # 查看所有交换分区
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE # 查看启动时IDE设备检测状况网络
# ifconfig # 查看所有网络接口的属性
# iptables -L # 查看防火墙设置
# route -n # 查看路由表
# netstat -lntp # 查看所有监听端口
# netstat -antp # 查看所有已经建立的连接
# netstat -s # 查看网络统计信息进程
# ps -ef # 查看所有进程
# top # 实时显示进程状态用户
# w # 查看活动用户
# id <用户名> # 查看指定用户信息
# last # 查看用户登录日志
# cut -d: -f1 /etc/passwd # 查看系统所有用户
# cut -d: -f1 /etc/group # 查看系统所有组
# crontab -l # 查看当前用户的计划任务服务
# chkconfig –list # 列出所有系统服务
# chkconfig –list | grep on # 列出所有启动的系统服务程序
# rpm -qa # 查看所有安装的软件包
iostat 显示存储细节
cat /proc/meminfo 显示内存使用
mpstat -P ALL 显示每个CPU状态
pmap 显示进程占用内存量
pstree -p 显示进程父子关系
16 个 Linux 服务器监控命令 https://roclinux.cn/?p=2549
tail
tail -f catalina.out|grep --color -B 20 'com.ync365.seed.service.user.impl'
关闭 selinux
打开/etc/selinux/config,把SELINUX=enforcing改为SELINUX=disabled
vi /etc/selinux/config
epel 源
https://dl.fedoraproject.org/pub/epel/6/x86_64/
rpm -ivh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
pushd popd 切换目录
让切换目录更方便: pushd,popd,dirs,cd -
一,为何要使用这几个命令?
可能大家会有疑问,为何要使用这几个命令,
难道用cd不就可以切换目录了吗?
没错,使用cd就可以切换到需要访问的目录,
但是有时会是一个路径很长,层次很多的目录,进到此目录下后,这时我们不小心运行了 cd命令,
理所当然,我们回到了自己的home目录,这时如果想回去怎么办?
还有:因为工作的需要,我们需要不停在几个很深层的目录之间切换,不止一个,
那么即使有tab键帮忙,我们也会因为一个cd命令花费很多时间,如何在多个目录之间切换时能更方便些
pushd,popd是我们的好帮手
说明: pushd,popd,dirs这几个我们讲到的命令是bash内建的命令,
所以只要登录到了bash,这几个命令就可以使用了
二,如何在两个目录之间切换?
如果只是在两个目录之间切换,那么还不必使用pushd,
这时只需使用 cd -就可以了
cd -的作用是可以回到前一个目录,
看例子:
[root@localhost ~]# cd /usr/share/kde4/apps/kget/pics/
[root@localhost pics]# cd -
/root
[root@localhost ~]# cd -
/usr/share/kde4/apps/kget/pics
[root@localhost pics]#
怎么样?在两个目录之间切换非常方便,无需再输入很长的路径
说明:
为何cd -能够回到前一个目录?
这是因为 -在此处等同于 $OLDPWD变量,
此问题可以参见bash的info信息,
cd 一项有相关的说明: An argument of - is equivalent to $OLDPWD.
$OLDPWD变量就是bash所记录的前一个目录
也就是说:$OLDPWD和-相等
下面我们再看一个例子:
[root@localhost ~]# cd /usr/share/kde4/apps/kget/pics/
[root@localhost pics]# echo $OLDPWD;
/root
[root@localhost pics]# cd $OLDPWD
[root@localhost ~]# echo $OLDPWD;
/usr/share/kde4/apps/kget/pics
[root@localhost ~]# cd $OLDPWD;
[root@localhost pics]# echo $OLDPWD;
/root
我们可以得到结构: 用cd -和cd $OLDPWD都可以在最近所操作的两个目录之间进行切换
三,如何在多个目录之间切换?
因为 cd -和 cd $OLDPWD都是只支持最近操作的两个目录,所以要在多个目录之间操作时,
我们需要使用 pushd
1,
先来介绍我们会用到的3条命令
pushd:切换到作为参数的目录,并把原目录和当前目录压入到一个虚拟的堆栈中
如果不指定参数,则会回到前一个目录,并把堆栈中最近的两个目录作交换
popd: 弹出堆栈中最近的目录
dirs: 列出当前堆栈中保存的目录列表
看例子:
[root@localhost ~]# pushd /usr/local/sbin/
/usr/local/sbin ~
[root@localhost sbin]# dirs
/usr/local/sbin ~
[root@localhost sbin]# dirs -p -v
0 /usr/local/sbin
1 ~
[root@localhost sbin]# pushd /usr/share/kde4/apps/kget/
/usr/share/kde4/apps/kget /usr/local/sbin ~
[root@localhost kget]# dirs -p -v
0 /usr/share/kde4/apps/kget
1 /usr/local/sbin
2 ~
说明: dirs的 -p参数可以每行一个目录的形式显示堆栈中的目录列表
-v参数可以在目录前加上编号
注意:有 -v时,不添加 -p也可以每行一个目录的形式显示
说明之二:我们可以看到:最近压入堆栈的目录位于最上面
2,如何在最近的两个目录之间切换?
在最近的两个目录之间切换:用pushd不加参数即可
[root@localhost kget]# pushd /boot/grub/
/boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~
[root@localhost grub]# dirs -v
0 /boot/grub
1 /usr/share/kde4/apps/kget
2 /usr/local/sbin
3 ~
[root@localhost grub]# pushd
/usr/share/kde4/apps/kget /boot/grub /usr/local/sbin ~
[root@localhost kget]# dirs -v
0 /usr/share/kde4/apps/kget
1 /boot/grub
2 /usr/local/sbin
3 ~
[root@localhost kget]# pushd
/boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~
[root@localhost grub]# dirs -v
0 /boot/grub
1 /usr/share/kde4/apps/kget
2 /usr/local/sbin
3 ~
说明:可以看到,用pushd不加参数在最近的两个目录之间切换时,
当前目录总是位于堆栈的最上面
3,如何在多个目录之间切换?
用 pushd +n即可
说明:
n是一个数字,有此参数时,是切换到堆栈中的第n个目录,并把此目录以堆栈循环的方式推到堆栈的顶部
需要注意: 堆栈从第0个开始数起
看例子:
[root@localhost grub]# dirs -v
0 /boot/grub
1 /usr/share/kde4/apps/kget
2 /usr/local/sbin
3 ~
[root@localhost grub]# pushd +2
/usr/local/sbin ~ /boot/grub /usr/share/kde4/apps/kget
[root@localhost sbin]# dirs -v
0 /usr/local/sbin
1 ~
2 /boot/grub
3 /usr/share/kde4/apps/kget
4,如何把目录从堆栈中删除?
用popd即可
看例子:
[root@localhost sbin]# dirs -v
0 /usr/local/sbin
1 ~
2 /boot/grub
3 /usr/share/kde4/apps/kget
[root@localhost sbin]# popd
~ /boot/grub /usr/share/kde4/apps/kget
[root@localhost ~]# dirs -v
0 ~
1 /boot/grub
2 /usr/share/kde4/apps/kget
[root@localhost ~]# popd +1
~ /usr/share/kde4/apps/kget
[root@localhost ~]# dirs -v
0 ~
1 /usr/share/kde4/apps/kget
说明:可以看到popd不加参数的运行情况:
popd把堆栈顶端的目录从堆栈中删除,并切换于位于新的顶端的目录
说明之二: popd 加有参数 +n时,
n是堆栈中的第n个目录,表示把堆栈中第n个目录从堆栈中删除
四,多学一点知识
1,pushd和popd都可以只影响堆栈而不切换目录
用 -n参数即可
看例子:
[root@localhost ~]# dirs -v
0 ~
1 /usr/share/kde4/apps/kget
[root@localhost ~]# pushd -n /boot/grub
~ /boot/grub /usr/share/kde4/apps/kget
[root@localhost ~]# dirs -v
0 ~
1 /boot/grub
2 /usr/share/kde4/apps/kget
2, dirs可以清空目录堆栈
用 -c参数即可
看例子:
[root@localhost ~]# dirs -v
0 ~
1 /boot/grub
2 /usr/share/kde4/apps/kget
[root@localhost ~]# dirs -c
[root@localhost ~]# dirs -v
0 ~
说明: 位于堆栈顶部的目录是当前目录,它不能被pop出去的
cp 实现强行覆盖
alias
[root@localhost storage]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost storage]#
方法一
unaslias cp(这只是临时取消 cp 的别名,不是永久的)
[root@localhost ~]#unaslias cp
方法二
输入\cp 命令,作用也是取消 cp 的别名。
[root@localhost ~]#\cp -fr src dest
方法三
输入yes|cp -fr src dest,使用管道自动输入 yes。
[root@localhost ~]#yes | cp cp -fr src dest
让管道自动输入一大堆得 yes,就可以完成了强行复制了。
那有人会问 dos 的 copy 命令怎么实现强行复制的呢?答案是
用来 xcopy /y src dest 来实现强行复制。
pkill 命令
来自: https://man.linuxde.net/pkill
pkill 命令可以按照进程名杀死进程。pkill 和 killall 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用 kill 来杀掉。
语法
pkill(选项)(参数)
选项
-o:仅向找到的最小(起始)进程号发送信号;
-n:仅向找到的最大(结束)进程号发送信号;
-P:指定父进程号发送信号;
-g:指定进程组;
-t:指定开启进程的终端。
参数
进程名称:指定要查找的进程名称,同时也支持类似 grep 指令中的匹配模式。
实例
pgrep -l gaim
2979 gaim
pkill gaim
也就是说:kill 对应的是 PID,pkill 对应的是 command。
nohup
nohup 的用途就是让提交的命令忽略 hangup 信号。
在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&“来将命令同时放入后台运行,也可用”>filename 2>&1"来更改缺省的重定向文件名。
nohup 示例
[root@xx ~]# nohup ping www.ibm.com &
[1] 3059
nohup: appending output to `nohup.out'
[root@pvcent107 ~]# ps -ef |grep 3059
root 3059 984 0 21:06 pts/3 00:00:00 ping www.ibm.com
root 3067 984 0 21:06 pts/3 00:00:00 grep 3059
[root@xx ~]#
时间设置
linux 时间快 8 小时解决办法
要解决这个问题,首先要确认当前 CMOS 显示的时间是否是当前的时间,如果是则你的 CMOS 是非 UTC 时间(即 CST 当地时间),要修改/etc/sysconfig/clock文件,将里面的 UTC=true 改为 UTC=false (告诉 Linux 硬件设置的是当地时间)
这个是多数快 8 小时的原因,因为安装 Linux 时默认选项是使用 UTC 时间(可能国外电脑的 CMOS 都是设置的 UTC 时间),系统误认为你的 CMOS 是 UTC 时间,而你又选择了+ 8 的时区,所以 Linux 在 CMOS 时间上加了 8 小时作为系统的时间
更改时区
rm /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
读取硬件时间到系统
clock --hctosys
输入 Date 查看当前是否为 CST 时间(CST 表示当地时间,如我们设置的 Shanghai ),如果时间不正确用以下方式修改时间
date -s 2010-02-03 12:00:00
将系统时间写入硬件
clock --systohc
ntp 安装
yum install -y ntp
设置 ntp 服务器
vim /etc/ntp.conf
# Hosts on local network are less restricted.
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.0.0 mask 255.255.0.0 nomodify notrap
启动 ntp 服务
service ntpd start
设置客户端
vim /etc/ntp.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (https://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 192.168.100.10
设置 ntpd 随机启动
chkconfig ntpd on
chkconfig ntpd --list
检查 ntp 状态
ntpstat
[root@localhost ~]# ntpstat
synchronised to NTP server (192.168.100.10) at stratum 4
time correct to within 7968 ms
polling server every 64 s
[root@localhost ~]#
watch ntpq -p
ifconfig
centos mini 安装桌面环境
https://cnzhx.net/blog/centos-yum-install-desktop/
netstat
netstat -rn 路由表
查看文件占用
du -sh 文件大小
df 磁盘信息
查看内存使用
free 内存信息 -m 以M为单位
查看操作系统
getconfig LONG_BIT 64/32位
xargs 命令
xargs find /sbin -perm +700 |ls -l 这个命令是错误的
find /sbin -perm +700 |xargs ls -l 这样才是正确的
xargs 可以读入 stdin 的资料,并且以空白字元或断行字元作为分辨
find 命令
find . -name '.project' -print -exec rm -rf {} \; 递归删除
查看路由信息(经过网关)
route -n get default
route -n get www.google.com
追踪路由
traceroute www.google.com
linux serf
Serf is a tool for cluster membership, failure detection, and orchestration that is decentralized, fault-tolerant and highly available. Serf runs on every major platform: Linux, Mac OS X, and Windows. It is extremely lightweight: it uses 5 to 10 MB of resident memory and primarily communicates using infrequent UDP messages. https://www.serfdom.io/intro/index.html
lsof 文件相关信息 pid 端口
lsof `which httpd` //那个进程在使用apache的可执行文件
lsof /etc/passwd //那个进程在占用/etc/passwd
lsof /dev/hda6 //那个进程在占用hda6
lsof /dev/cdrom //那个进程在占用光驱
lsof -c sendmail //查看sendmail进程的文件使用情况
lsof -c courier -u ^zahn //显示出那些文件被以courier打头的进程打开,但是并不属于用户zahn
lsof -p 30297 //显示那些文件被pid为30297的进程打开
lsof -D /tmp 显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列
lsof -u1000 //查看uid是100的用户的进程的文件使用情况
lsof -utony //查看用户tony的进程的文件使用情况
lsof -u^tony //查看不是用户tony的进程的文件使用情况(^是取反的意思)
lsof -i //显示所有打开的端口
lsof -i:80 //显示所有打开80端口的进程
lsof -i -U //显示所有打开的端口和UNIX domain文件
lsof -i UDP@[url]www.akadia.com:123 //显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的链接
lsof -i tcp@ohaha.ks.edu.tw:ftp -r //不断查看目前ftp连接的情况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新)
lsof -i tcp@ohaha.ks.edu.tw:ftp -n //lsof -n 不将IP转换为hostname,缺省是不加上-n参数
SystemPerformance.sh
#!/bin/sh
# add System paramter to /etc/sysctl.conf
fileDesc=`grep "fs.file-max" /etc/sysctl.conf | awk '{print $1}'`
if [ "fs.file-max" != "${fileDesc}" ];then
echo "file.max not added"
cat << EOF >> /etc/sysctl.conf
#enhance system performance ,add by ChinaEdustar
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 2048
net.core.netdev_max_backlog = 4096
net.core.dev_weight = 64
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.core.rmem_default = 110592
net.core.rmem_max = 262141
net.ipv4.tcp_rmem = 4096 98304 349520
net.core.wmem_default = 262141
net.core.wmem_max = 8388608
net.ipv4.tcp_wmem = 4096 65535 8388608
net.ipv4.tcp_mem = 8388608 8388608 8388608
net.core.optmem_max = 20480
fs.file-max = 209708
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
kernel.panic = 1
EOF
else
echo "added"
fi
echo 209708 >/proc/sys/fs/file-max
fileDesc=`grep "nofile" /etc/security/limits.conf | awk '{print $1}'`
if [ "*" != "${fileDesc}" ];then
echo "* - nofile 209708" >> /etc/security/limits.conf
else
echo "limits.conf has added"
fi
if [ -f /etc/security/limits.d/90-nproc.conf ]; then
sed -i 's/nproc.*1024/nproc 209708/g' /etc/security/limits.d/90-nproc.conf
fi
if [ "`rpm -qa | grep crontabs`" == "" ]; then
yum install -y crontabs
fi
chkconfig crond --level 345 on
if [ "`rpm -qa | grep ntpdate`" == "" ]; then
yum install -y ntpdate
fi
if [ "`grep "ntpdate" /etc/crontab`" == "" ]; then
echo ntpdate not added
echo "15 5 * * * root ntpdate -u time.ustc.edu.cn" >> /etc/crontab
echo "16 5 * * * root ntpdate -u 192.43.244.18 210.72.145.44 210.0.235.14 59.124.196.84" >> /etc/crontab
fi
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel wget lrzsz openssh-clients ntpdate apr-devel telnet
Jenkins 重启 dubbo 服务脚本
service-restart.sh
#!/bin/sh
## java env
source /etc/profile
export JAVA_HOME=/usr/local/jdk1.7.0_75
export JRE_HOME=$JAVA_HOME/jre
if [ $# != 3 ] ; then
echo "USAGE: $0 SERVICE_DIR SERVICE_NAME_PRE DISCONF_ENV"
echo " e.g.: $0 /opt/ync-goods ync-goods rd"
exit 1;
fi
SERVICE_DIR=$1
SERVICE_NAME_PRE=$2
DISCONF_ENV=$3
DISCONF_HOST=192.168.88.30:8080
DISCONF_APP=cwang
DISCONF_VERSION=1.0.0
cd $SERVICE_DIR
# P_ID=`ps -ef | grep -w "$SERVICE_NAME_PRE" | grep -v "grep" | awk '{print $2}'`
P_ID=`jps -ml|grep "$SERVICE_NAME_PRE"|awk '{print $1}'`
if [ "$P_ID" == "" ]; then
echo "=== $SERVICE_NAME process not exists or stop success"
else
echo "=== begin kill $SERVICE_NAME process, pid is:$P_ID"
kill -9 $P_ID
fi
sleep 3
JAR_NAME=`ls -rt *.jar|grep -v 'sources'|tail -1`
echo "START JAR_NAME "$JAR_NAME
nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar -Ddisconf.env=$DISCONF_ENV -Ddisconf.conf_server_host=$DISCONF_HOST -Ddisconf.app=$DISCONF_APP -Ddisconf.version=$DISCONF_VERSION -Ddisconf.user_define_download_dir=.classes -Ddisconf.enable.remote.conf=true $JAR_NAME >$SERVICE_NAME_PRE.log 2>&1 &
ls *.jar|grep -v $JAR_NAME|xargs rm -rf
exit 0
service-region.sh
#!/bin/sh
## java env
export JAVA_HOME=/usr/local/jdk1.7.0_75
export JRE_HOME=$JAVA_HOME/jre
## service name
APP_NAME=region
SERVICE_DIR=/opt/ync-region
FILE_NAME=`ls /opt/ync-region| grep '.[0-9]'.jar`
SERVICE_NAME=$FILE_NAME
JAR_NAME=$SERVICE_NAME
PID=$SERVICE_NAME\.pid
cd $SERVICE_DIR
case "$1" in
start)
nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -Ddisconf.env=qa -Ddisconf.conf_server_host=192.168.88.30:8080 -Ddisconf.app=cwang -Ddisconf.version=1.0.0 -Ddisconf.user_define_download_dir=.classes -Ddisconf.enable.remote.conf=true -jar $JAR_NAME >/dev/null 2>&1 &
echo $! > $SERVICE_DIR/$PID
echo "=== start $SERVICE_NAME"
;;
stop)
#kill `cat $SERVICE_DIR/$PID`
#rm -rf $SERVICE_DIR/$PID
#echo "=== stop $SERVICE_NAME"
sleep 5
P_ID=`ps -ef | grep -w "$SERVICE_NAME" | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "=== $SERVICE_NAME process not exists or stop success"
else
echo "=== $SERVICE_NAME process pid is:$P_ID"
echo "=== begin kill $SERVICE_NAME process, pid is:$P_ID"
#kill -9 $P_ID
fi
;;
restart)
$0 stop
sleep 2
$0 start
echo "=== restart $SERVICE_NAME"
;;
*)
## restart
$0 stop
sleep 2
$0 start
;;
esac
exit 0
service-region-tag.sh
#!/bin/sh
## java env
export JAVA_HOME=/usr/local/jdk1.7.0_75
export JRE_HOME=$JAVA_HOME/jre
## service name
APP_NAME=region
#find filename
FILE_NAME=`ls /opt/ync-region | grep '.[0-9]'.jar`
echo "FILE_NAME=====================$FILE_NAME"
SERVICE_DIR=/opt/ync-region
SERVICE_NAME=$FILE_NAME
echo "SERVICE_NAME------------------:$SERVICE_NAME"
JAR_NAME=$SERVICE_NAME\.jar
PID=$SERVICE_NAME\.pid
cd $SERVICE_DIR
if ["$FILE_NAME" == ""];then
exit 0;
fi
sleep 5
P_ID=`ps -ef | grep -w "$SERVICE_NAME" | grep -v "grep" | awk '{print $2}'`
echo "P_ID---------------------------:$P_ID"
if [ "$P_ID" == "" ]; then
echo "=== $SERVICE_NAME process not exists or stop success"
else
echo "=== $SERVICE_NAME process pid is:$P_ID"
echo "=== begin kill $SERVICE_NAME process, pid is:$P_ID"
kill -9 $P_ID
fi
`rm -rf $FILE_NAME`
exit 0