苏苏的博客

简约至极

linux相关操作

读取文件的前几字节

head 或 tail 以字节而不是以行为单位,那该怎么办呢?您可以用 -c 选项代替 -n 选项

前100字节,并以hex格式显示 head -c 100 file | hexdump

后100字节tail -c 100 file | hexdump

还可以使用管道交给 md5sum,可比较前100字节或后100字节是否相同

head -c 100 file | hexdump | md5sum

取文件1G(1073741824)至+819200处的md5值

head -c 1074561024 file | tail -c 819200 |md5sum

使用dd会更加方便,也更高效

dd if=file bs=1 skip=1073741824 count=819200 | md5sum

拆分文件 split -b 1kb /tmp/file sfile

拆分文件大小为1k,也可以是1b,或者1m之类的单位

xxd hexdump od https://www.zhihu.com/question/40441308/answer/86637730

使用 sed 修改二进制文件

先找到查找的目标

例如/opt/local则对应echo /opt/local | xxd

0000000: 2f6f 7074 2f6c 6f63 616c 0a              /opt/local.

要替换为/usr/local,则目标为echo /usr/local | xxd

0000000: 2f75 7372 2f6c 6f63 616c 0a              /usr/local.

使用sed替换

xxd file | sed 's/2f6f 7074/2f75 7372/g' | xxd -r > newfile

echo /lib/ld-linux.so.3 | xdd

0000000: 2f6c 6962 2f6c 642d 6c69 6e75 782e 736f  /lib/ld-linux.so
0000010: 2e33 0a                                  .3.

echo ld.so | xxd

0000000: 6c64 2e73 6f0a                           ld.so.
xxd file | sed 's/\x2f\x6c\x69\x62\x2f\x6c\x64\x2d\x6c\x69\x6e\x75\x78\x2e\x73\x6f\x2e\x33\x0a/\x6c\x64\x2e\x73\x6f\x0a/g' | xxd -r > bb
sed 's/\x2f\x6c\x69\x62\x2f\x6c\x64\x2d\x6c\x69\x6e\x75\x78\x2e\x73\x6f\x2e\x33\x0a/\x6c\x64\x2e\x73\x6f\x0a/g' file > newfile

LD_LIBRARY_PATH=`pwd` ~/tmp/qemu-arm-static ~/aa/aa -v

Linux用户管理

添加用户adduser

假如用户名为work

adduser work -M

# add rslsync user without home dir and cannot login
sudo adduser --shell /bin/nologin --no-create-home --group rslsync

-M, –no-create-home 不创建用户的主目录 -s, –shell SHELL 新账户的登录 shell,nologin就是登陆不了 -G, –groups GROUPS 新账户的附加组列表

adduser -h查看完整帮助

用法:adduser [选项] 登录
      adduser -D
      adduser -D [选项]

选项:
  -b, --base-dir BASE_DIR	新账户的主目录的基目录
  -c, --comment COMMENT         新账户的 GECOS 字段
  -d, --home-dir HOME_DIR       新账户的主目录
  -D, --defaults		显示或更改默认的 useradd 配置
  -e, --expiredate EXPIRE_DATE  新账户的过期日期
  -f, --inactive INACTIVE       新账户的密码不活动期
  -g, --gid GROUP		新账户主组的名称或 ID
  -G, --groups GROUPS	新账户的附加组列表
  -h, --help                    显示此帮助信息并推出
  -k, --skel SKEL_DIR	使用此目录作为骨架目录
  -K, --key KEY=VALUE           不使用 /etc/login.defs 中的默认值
  -l, --no-log-init	不要将此用户添加到最近登录和登录失败数据库
  -m, --create-home	创建用户的主目录
  -M, --no-create-home		不创建用户的主目录
  -N, --no-user-group	不创建同名的组
  -o, --non-unique		允许使用重复的 UID 创建用户
  -p, --password PASSWORD		加密后的新账户密码
  -r, --system                  创建一个系统账户
  -R, --root CHROOT_DIR         chroot 到的目录
  -s, --shell SHELL		新账户的登录 shell
  -u, --uid UID			新账户的用户 ID
  -U, --user-group		创建与用户同名的组
  -Z, --selinux-user SEUSER		为 SELinux 用户映射使用指定 SEUSER

修改密码

passwd work

修改用户名

alarm为旧用户名

new_user=lao
# change user name
usermod -l $new_user -d /home/$new_user -m alarm
# chenge user group
groupmod -n $new_user alarm

http://www.cnblogs.com/xd502djj/archive/2011/11/23/2260094.html

Linux实用命令

w

w命令能容清晰的显示,服务器在线时间,负载以及当前登陆的用户

vmstat

vmstat 显示开机以来的平均值,而不是前一秒的值 vmstat 1命令指定一个参数 1 运行,来打印每一秒的统计摘要. 这些列代表的信息:

r:CPU 中正在运行和等待运行的进程的数量。其提供了一个比平均负载更好的信号来确定 CPU 是否饱和,因为其不包含 I/O。解释:”r”的值大于了 CPU 的数量就表示已经饱和了。 free:以 kb 为单位显式的空闲内存。如果数字位数很多,说明你有足够的空闲内存。”free -m” 命令,是下面的第七个命令,其可以更好的说明空闲内存的状态。 si, so:Swap-ins 和 swap-outs。如果它们不是零,则代表你的内存不足了。 us, sy, id, wa, st:这些都是平均了所有 CPU 的 CPU 分解时间。它们分别是用户时间(user)、系统时间(内核)(system)、空闲(idle)、等待 I/O(wait)、以及占用时间(stolen)(被其他访客,或使用 Xen,访客自己独立的驱动域)。

CPU 分解时间将会通过用户时间加系统时间确认 CPU 是否为忙碌状态。等待 I/O 的时间一直不变则表明了一个磁盘瓶颈;这就是 CPU 的闲置,因为任务都阻塞在等待挂起磁盘 I/O 上了。你可以把等待 I/O 当成是 CPU 闲置的另一种形式,其给出了为什么 CPU 闲置的一个线索。 对于 I/O 处理来说,系统时间是很重要的。一个高于 20% 的平均系统时间,可以值得进一步的探讨:也许内核在处理 I/O 时效率太低了。

SIZE(VIRT): 进程使用的地址空间, 如果进程映射了100M的内存, 进程的地址空间将报告为100M内存. 事实上, 这个大小不是一个程序实际使用的内存数.

RSS(RES): “Resident Set Size”, 实际驻留”在内存中”的内存数. 不包括已经交换出去的代码. 举一个例子: 如果你有一个程序使用了100K内存, 操作系统交换出40K内存, 那么RSS为60K. RSS还包括了与其它进程共享的内存区域. 这些区域通常用于libc库等.

SHARE(SHR): RSS中与其它进程共享的内存部分大小.

VMSIZE: 一个进程占用的总的地址空间大小. 它包括了没有映射到内存中的页面。

SZ(DATA): 映射到内存中的页面, 这些页面仅由进程单独使用. 这也是我们最关心地方: 进程实际占用的内存数。

top

top -b -n1 可以只执行一次,用于将结果重定向到文件.

可参考 http://liaoph.com/inux-process-management/

tload

tload

cat /proc/net/arp 查看连接到本机的远端ip的mac地址

free

free -m free -h

按内存占用排序


ps -eo rss,vsz,pid,ppid,time,etime,command --sort=rss   # 按内存
ps -eo rss,vsz,pid,ppid,time,etime,command --sort=time  # 按CPU时间,etime启动时间,comm等都可以.

# MAC无法使用`--sort`上需要使用`| sort -n`

ps -eo rss,vsz,pid,ppid,time,etime,command |sort -n

# alpine 里这样用,不支持--sort, 同样也可以 `top -b -n1`
ps -o rss,vsz,pid,ppid,time,etime,args

ssh

配置无密码登陆 ssh-copy-id -i ~/.ssh/id_rsa.pub root@host

如果是其他端口可以-p指定端口 ssh-copy-id -i ~/.ssh/id_rsa.pub -p 26671 root@host

此过程相当于

ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

默认会使用~/.ssh/id_rsa 私钥文件,也可以指定 使用指定私钥登陆 ssh –i id_rsa root@host

针对无效问题,可以检查服务端

chmod 700 ~/.ssh ; chmod 600 ~/.ssh/authorized_keys ; chmod g-w,o-w ~

/etc/ssh/sshd_config文件配置

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  %h/.ssh/authorized_keys

必要时可禁止密码登陆

passwordAuthentication no

/var/log/secure文件中,查找IP地址

grep -E -o "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/secure

-E选项表示使用grep扩展的正则表达式 -o选项是只显示匹配到的字符串

统计这些IP的数量,并排序,查看哪些IP登陆错误次数较多

grep -E -o "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/secure|sort|uniq -c|sort -nr | head -30

pgrep

根据名字或其他属性查询出进程的PID

pidof 命令也有类似用法

如:pgrep nginx -fl

pkill

pgrep类似,不同的是向进程发送信号,默认发送SIGTERM信号,查看都有哪些信号可用,可以使用kill -l查看

pkill -f “php index.php em”

类似pkill的命令是killall,后面都是可以直接加进程名字批量杀死进程

pstree

用树的形式显示正在运行的进程,树的节点为指定的PID(忽略则为init进程)

ss

用于显示socket的统计信息,-s用于显示汇总

-l用于列出正在监听的socket

-p显示进程信息,ss -pl 可以查看使用网络端口的进程名字

磁盘相关

dd

dd把指定的输入文件拷贝到指定的输出文件中,并且在拷贝的过程中可以进行格式转换。

if =输入文件(或设备名称) of =输出文件(或设备名称) bs = bytes 同时设置读/写缓冲区的字节数(等于设置obs和obs) count = blocks 只拷贝输入的blocks块

创建一个100M的空文件 dd if=/dev/zero of=hello.txt bs=100m count=1

查看当前目录下所有一级子目录文件夹大小

du -h --max-depth=1

查看当前目录下所有一级子目录文件夹大小 并排序

du -h --max-depth=1 |sort

以上两条命令不适用于MacOs,可以使用du -sh *

ps

ps ef 查看进程的状态

ps auxw 查看进程的CPU,内存占用

ps 默认是按照PID排序的,若要按内存使用排序ps auxw --sort=rss,同理按虚拟内存排序ps auxw --sort=vsz

mac上无法使用--sort,可以采用sort排序,如rss在第六列,则ps auxw | sort -k6,6n

linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) 5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

 D    uninterruptible sleep (usually IO)
 R    running or runnable (on run queue)
 S    interruptible sleep (waiting for an event to complete)
 T    stopped by job control signal
 t    stopped by debugger during the tracing
 W    paging (not valid since the 2.6.xx kernel)
 X    dead (should never be seen)
 Z    defunct ("zombie") process, terminated but not reaped by its parent

For BSD formats and when the stat keyword is used, additional characters may be displayed:

 <    high-priority (not nice to other users)
 N    low-priority (nice to other users)
 L    has pages locked into memory (for real-time and custom IO)
 s    is a session leader
 l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
 +    is in the foreground process group

lscpu

mpstat

监视每隔CPU的负载

mpstat -P ALL 2

dig

sudo apt-get install dnsutils 或者 yum install bind-utils -y

DNS域名查询

dig www.baidu.com

查询的dns服务器将采用系统配置的服务器,即/etc/resovle.conf 中的

如果要查询其他类型的记录,比如MX,CNAME,NS,PTR等,只需将类型加在命令后面即可

dig www.baidu.com mx
dig www.baidu.com ns

nslookup 采用-q参数

nslookup -q=CNAME blog.suconghou.cn

nslookup -q=A blog.suconghou.cn

可以查看使用的DNS服务器及端口,域名对应的IP,查询耗时等.

默认情况下dig将采用udp协议进行查询,如果要采用tcp方式,可以加上 +tcp参数 dig www.baidu.com +tcp

如果你是一个系统管理员,部署好了一台dns服务器之后想对它进行解析测试,就必须要显式指定待测试的dns服务器地址了,例如 dig @202.106.0.20 www.baidu.com a

另外一个重要的功能是+trace参数,使用这个参数之后将显示从根域逐级查询的过程 dig www.baidu.com a +trace

dig @223.6.6.6 blog.suconghou.cn +short 简介模式列出IP

nslookup 也可以获取域名对应的IP

nslookup www.baidu.com

还可以指定DNS SERVER查询 nslookup www.baidu.com 8.8.8.8

nc

nc 命令默认没有安装,需要自己安装,yum install nc

传送字符与文件

一端nc -l 9090监听端口9090

一端nc host 9090连接host的9090端口,通信建立后,可以双向通信,实现文字聊天等,也可以传送文件

一端nc -l 9090 > file ,另一端发送文件nc host 9090 < file

传送文件夹(压缩文件) nc -l 9090 |tar xzvf - , 另一端发送文件tar czvf - dir | nc host 9090

同样可以拷贝硬盘 nc -l 9090 | dd of=/dev/sda,另一端发送dd if=/dev/sda | nc host 9090

有个高性能的方法: 1.先在接收方执行: nc -l 6677 | tar -C 接收文件的目录 -zxvf - #接收目录最好是个空目录,防止覆盖的风险

2.再在发送方执行: tar -czvf - 要发送的目录 | nc 接收方ip 6677

pv < big.sql.xz | nc x.x.x.x 9090 在发送数据段显示进度条.

ssh 也可以使用 pipe 传送 tar zcf - attaches | ssh root@ip "tar zxf - -C /path/to/"

使用端口如 tar czf - public_html | ssh root@ip -p 5678 tar xzf - -C /www/web/myweb/public_html

边打包边传输边解压,一条命令解决

传送大量大文件 使用 lftp也是一个好方案

Use lftp, its much faster than rsync and its best for mirroring websites (many small files). It can also transfer in parallel using multiple connections:

lftp -u username,password sftp://ip-address -e 'mirror --only-newer --no-dereference --parallel=5 /remote/path/ /destination/;quit'
If one connection breaks it will reconnect and continue. If you break the transfer it will skip existing files and continue.

端口扫描

nc -vz -w 1 someIp 1-1000

模拟调试http请求

GET / HTTP/1.0

端口转发

mknod tunnel p #创建一个临时的管道文件tunnel 或者下面的
mkfifo tunnel
nc -l -p 8081  < tunnel | nc 127.0.0.1 9090 | tee tunnel

或者

cat tunnel | nc 127.0.0.1 9090 | nc -l -p 8081 > tunnel

使用之前需要了解其他的命令

tee命令将标准输入的数据写入标准输出和tee命令指定的文件参数

mkfifo命令用于创建一个FIFO(先进先出)方式的命名管道

标准流:

stdin	0
stdout	1
stderr	2

这样的转发只能接受单次请求 可以改写,这里使用 busybox 里的nc

busybox  nc -ll -p 18081 -e busybox nc 127.0.0.1 9097

监听 18081 , 转发到 9097

使用nc建立一个简易webserver

while true;do sudo nc -l 8080 < index.html;done

用curl/wget可以访问,浏览器访问可能存在问题.

nc 建立的server,比用 busybox 建立的server内存占用稍大,约2MB busybox httpd -p 9797 -h /home/

根据pid查看进程的stdout

yum install -y strace

strace -ewrite -p $PID

reptyr 更加容易做到

yum install reptyr (relp源)

reptyr -s $PID

history

不记录本次会话的history

HISTFILE=/dev/null; HISTSIZE=0; HISTFILESIZE=0;

执行的任何命令都不会写入 ~/.bash_history , 按上键也不可复用执行过的命令. 这条设置会被记录到对应的.history文件里,但你可以修改这个文件.

一份Linux别名和函数库

alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g' ";
alias cls="cd $1;ls -lh;";
# 获得你的公网IP地址和主机名。
alias ipinfo="curl ifconfig.me && curl ifconfig.me/host";
# 显示出哪个应用程序连接到网络。
alias listen="lsof -P -i -n";
# 显示出活动的端口。
alias port='netstat -uanltp'
# 统计TCP连接个数
alias tcpstatus="netstat -n|awk '/^tcp/{++S[\$NF]} END {for(a in S) print a,S[a]}'"
# 回到上层目录
alias ..='cd ..'
# 去到上两层目录
alias ...='cd ../..'
# 按列格式化输出mount信息。
alias cmount="mount | column -t"
# 查看你还有剩下多少内存
alias meminfo='free -m -l -t'
# 按照文件在磁盘存储的大小排序,显示当前目录的文件列表。
sbs() { du -b --max-depth 1 | sort -nr | perl -pe 's{([0-9]+)}{sprintf "%.1f%s", $1>=2**30? ($1/2**30, "G"): $1>=2**20? ($1/2**20, "M"): $1>=2**10? ($1/2**10, "K"): ($1, "")}e';}
# 找出指定目录中最大的10个文件
largefile() { find . -type f -exec du -k {} \; | sort  -nrk 1 | head; }
# 查看当前目录大于[多少]kb的文件,速度更快
bigthan() { size=${1:-100}; find . -type f -size +"$size"k |xargs  ls  -lhS ; }
# 返回你的当前IP地址的地理位置。
getlocation() { lynx -dump http://www.ip-adress.com/ip_tracer/?QRY=$1|grep address|egrep 'city|state|country'|awk '{print $3,$4,$5,$6,$7,$8}'|sed 's\ip address flag \\'|sed 's\My\\';}
# 删除.log.1.gz 或者 .log.1.bz2
delog(){ ls | grep "log.\d\+.\(bz2\|gz\)" | xargs rm}

# 查看最占用内存的前五个进程(根据第几列可修改k6)
topmem()
{
	ps aux | sort -k6nr | head -n5;
}

当内存不足,最先被杀死的进程 http://www.vpsee.com/2013/10/how-to-configure-the-linux-oom-killer/

oomscore()
{
  for proc in $(find /proc -maxdepth 1 -regex '/proc/[0-9]+'); do printf "%2d %5d %s\n" "$(cat $proc/oom_score)" "$(basename $proc)" "$(cat $proc/cmdline | tr '\0' ' ' | head -c 50)" ;done 2>/dev/null | sort -nr | head -n 10
}

Linux 还可以使用 bind 定义快捷键执行的命令

如让 Ctrl+a 执行 ls bind -x '"\C-a": ls -lh'

使用unalias取消alias

内存增序 ps aux --sort rss

内存减序 ps aux --sort -rss

cpu增序 ps auxw --sort=%cpu

cpu减序 ps auxw --sort=-%cpu

可写为alias alias mem="ps aux --sort -rss | head -n20 && ps auxw --sort=-%cpu,-time | head -n5"

netstat -anltupss -ln 都能查看网络链接信息

部分快捷键


CTRL + U -剪切光标前的内容

CTRL + K -剪切光标至行末的内容

CTRL + Y -粘贴

CTRL + E -移动光标到行末

CTRL + A -移动光标到行首

ALT + F -跳向下一个空格

ALT + B -跳回上一个空格

ALT + Backspace -删除前一个单词

CTRL + W -剪切光标后一个单词

Shift + Insert -向终端内粘贴文本

压缩率 xz > 7z > bzip2 > gzip > zip

xz > zstd > gzip

默认配置 zstd 比 gzip 快4倍, 并且比gzip更小.

gzexe 创建自解压文件

xz5.2以上版本支持多线程压缩,xz -T0 就可以自动按机器核心数多线程执行了,xz 支持 env 环境变量,XZ_OPT=-T0 xz xxx.file 就行啦

xz -T8 big.sql 使用8线程压缩.

多线程的压缩速度几乎与gzip相当

# 查看你机器的CPU个数,超线程信息
sysinfo() {
physicalNumber=0
coreNumber=0
logicalNumber=0
HTNumber=0
logicalNumber=$(grep "processor" /proc/cpuinfo|sort -u|wc -l)
physicalNumber=$(grep "physical id" /proc/cpuinfo|sort -u|wc -l)
coreNumber=$(grep "cpu cores" /proc/cpuinfo|uniq|awk -F':' '{print $2}'|xargs)
HTNumber=$((logicalNumber / (physicalNumber * coreNumber)))
echo "****** CPU Information ******"
echo "Logical CPU Number  : ${logicalNumber}"
echo "Physical CPU Number : ${physicalNumber}"
echo "CPU Core Number     : ${coreNumber}"
echo "HT Number           : ${HTNumber}"
echo "*****************************"
}

lscpu 命令也能简单查看CPU信息

使用脚本清理一些文件

查看XX多少天未变动过且大于XX的文件

oldfiles() { day=${1:-30}; size=${2:-100}; find . -mtime +"$day" -type f -size +"$size"k |xargs  ls  -lhS ; }

删除当前目录超过30天未变动过的log文件

find . -mtime +30 -type f -name '*.log*' | xargs rm

或者

find . -mtime +30 -type f -name '*.log*' -exec rm -i {} \;

所有的操作都包含子目录

-exec 参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。

{} 花括号代表前面find查找出来的文件名。

find . -type f -exec ls -l {} \;

使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。

find . -name "*.log" -mtime +60 -ok rm {} \;

-mtime +30 设定时间为30天前

-type f 查找的类型为文件

-name 文件路径需要匹配的

使用全文查找

grep -lr ‘string’ /etc/

这个命令就可以搞定。搜索etc下面的文件,包含所有目录下的文件。这样就搞定了。

-i,乎略大小写 -l,找出含有这个字符串的文件 -r,不放过子目录

解决can’t set the locale; make sure $LC_* and $LANG are correct

https://www.thomas-krenn.com/en/wiki/Perl_warning_Setting_locale_failed_in_Debian 照着全部做下来

sed使用

更新版本号

sed -i "s/?ver=\w\+/?ver=`date +%s`/g" *.html
o=http://cdn.ourwill.cn/fed-static r=http://cdn.ourwill.cn/fed-static/fedv2 sed -i "s#$o#$r#g" *.html

以当前时间命名

filename=html`date +"%Y%m%d%H%M%S"`.tar.gz

Vim乱码解决

vim ~/.vimrc

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8

开机启动的

检视和控制systemd的主要命令是systemctl

详细使用见https://wiki.archlinux.org/index.php/systemd_(简体中文)

CentOS7 用systemctl取代了service 旧版本的 service docker start 改为systemctl start docker 设置开机启动 旧版本的 chkconfig docker on 改为 systemctl enable docker

/usr/lib/systemd/system/ /etc/systemd/system/ 后者有较高优先级会覆盖前者

/etc/profile 和 ~/.bash_profile 是在启动 一个交互登陆shell的时候 被调用。 /etc/bashrc 和 ~/.bashrc 是在一个交互的非登陆shell启动 的时候 被调用。 ~/.bash_logout 在用户注销登陆的时候 被读取

系统脚本 可以放置在/etc/rc.d/init.d中并建立/etc/rc.d/rc?.d链接,也可以直接放置在/etc/rc.d/rc.local中。 init.d脚本 包含完整的start,stop,status,reload等参数,是标准做法,推荐使用。

Linux 家族

一般来说著名的linux系统基本上分两大类:

1.RedHat系列:Redhat、Centos、Fedora等

2.Debian系列:Debian、Ubuntu等

RedHat 系列

1 常见的安装包格式 rpm包,安装rpm包的命令是“rpm -参数”

2 包管理工具 yum

3 支持tar包

Debian系列 1 常见的安装包格式 deb包,安装deb包的命令是“dpkg -参数”

2 包管理工具 apt-get

3 支持tar包

soft rlimits too low. Number of files is 256, should be at least 1000

https://www.fdzh.org/slides/2015/06/20/linux-distr/

家族示意图

判断一个命令是否存在

如判断nc是否存在

command -v nc >/dev/null 2>&1 || { echo >&2 "I require nc but it's not installed.  Aborting."; exit 1; }

if ! command -v pip > /dev/null 2>&1;then
    echo "YES"
fi
PIP=$(which pip)
if [ ! -x "${PIP}" ];then
	echo "NO"
else
	echo "YES"
fi
[[ ! -x $(which pip) ]] && echo "No" || echo "Yes"

if (( ${+commands[pip]} )); then
	echo "YES"
fi

判断一个进程PID是否还存在

例如检查pid为143的进程 ps ax | awk '{ print $1 }' | grep -e "^143$"

时间同步

http://www.pool.ntp.org/zh/

cn.pool.ntp.org

http://www.ntp.org.cn/ 提供 ntp server

使用 sudo ntpdate us.ntp.org.cn 来同步时间.

time.pool.aliyun.com time.asia.apple.com time.apple.com

/usr/bin/tzselect 来设置时区

Alpine Linux 3.4 ntpd -d -n -q -p us.ntp.org.cn

还可以sudo date -s "2017-02-08 21:28:00"手动设置时间

alpine中设置时区执行

apk update && apk upgrade && apk add --no-cache tzdata
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone

会立即生效.

Linux 磁盘与MySQL性能测试

源码地址 : https://github.com/akopytov/sysbench

它主要包括以下几种方式的测试:

  1. cpu性能
  2. 磁盘io性能
  3. 调度程序性能
  4. 内存分配及传输速度
  5. POSIX线程性能
  6. 数据库性能(OLTP基准测试)

目前sysbench主要支持 MySQL,pgsql,oracle 这3种数据库。

Mtr网络线路测试

如果未安装可以yum info mtr安装

-n 不用主机解释 -c 发送多少个数据包 –report 结果显示,并不动态显示。

mtr --report www.baidu.com

Shell基本语法

声明数组

arr=(item1 item2 item3) 使用空格分开

使用echo ${arr[*]} 或者 echo ${arr[@]} 可以查看数组内的元素,echo $arr只能取得第一个元素

要取得数组长度,只需在名字前面加一个#,如echo ${#arr[*]} 或者 echo ${#arr[@]}

数组下标以0开始,取得第二个元素为echo ${arr[1]}

赋值使用arr[5]=5555

for in

for in 遍历文件 for i in *.less ; do echo $i;done;


while true;do for i in *.less ; do echo $i;done; sleep 6 ;done;

# 压缩所有LESS
while true;do for i in *.less ; do air compress $i -r;done; sleep 6 ;done;

shell 命令查询 https://explainshell.com/

常用 Linux命令 一览 https://github.com/Idnan/bash-guide

shell多行转化为一行

例如当前目录下所有less,但排除指定文件,按字母排序成一行

ls *.less | grep -v "base.less\|config.less\|mixins.less" |  xargs echo

直接执行

air compress ` ls *.less | grep -v "base.less\|config.less\|mixins.less" | xargs echo`

来合并这些文件.

http://blog.csdn.net/hjxhjh/article/details/17264739

http://blog.sina.com.cn/s/blog_4a3c301c0100lqbm.html

DNS配置

/etc/resolv.conf内配置

国外可以配置

nameserver 8.8.8.8
nameserver 4.2.2.1
nameserver 8.8.4.4
nameserver 4.2.2.2

国内

nameserver 1.2.4.8
nameserver 119.29.29.29
nameserver 119.28.28.28
nameserver 114.114.114.114
nameserver 223.5.5.5
nameserver 223.6.6.6

测试VPS宽带

https://github.com/sivel/speedtest-cli

http://man.linuxde.net/speedtest-cli

还可以使用wget下载各大型机房的测试文件

芝加哥机房/100M测试包

wget http://cachefly.cachefly.net/100mb.test

wget http://cachefly.cachefly.net/10mb.test

directspace机房/10M.100M测试包

Portland, Oregon Data Center

wget http://bandwidth.directspace.net/100MBtest.zip

wget http://bandwidth.directspace.net/10MBtest.zip

Los Angeles, California Data Center

wget http://45.34.158.82/speedtest/100MBtest.zip

访问 cachefly.cachefly.net 可以测试你电脑当前的网络速度

枫叶主机 http://www.fyzhuji.com/speed.html 提供的测速文件.

香港SV新力讯机房,测试20M光纤能跑满2.6MB/s

星光互联 https://www.starrydns.com/tc/speedtest 提供的测速文件

Mega-I, Hong Kong,测试能跑到3MB/s

LVM

使用pvcreate创建PV

pvcreate 物理分区名字

使用vgcreate创建VG

vgcreate vgname pv1 pv2 pv3

pvdisplay 查看当前的PV

vgdisplay 查看VG

lvdisplay 查看LV

pvscan vgscan lvscan fdisk -l

-L:指定LV的大小 -n:指定LV的名。Vo1Group00:表示从这个VG中划分LV;

LV创建好后格式化为想要的格式,然后挂载指定目录,就能使用了.(可以使用df -lhT查看了)

lsblk

[root@will ~]# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0 931.5G  0 disk
├─sda1            8:1    0   200M  0 part /boot/efi
├─sda2            8:2    0   500M  0 part /boot
└─sda3            8:3    0 930.8G  0 part
  ├─centos-root 253:0    0    50G  0 lvm  /
  ├─centos-swap 253:1    0   5.9G  0 lvm  [SWAP]
  └─centos-home 253:2    0 874.9G  0 lvm  /home
sr0              11:0    1  1024M  0 rom

编译lua

http://home.tiscali.cz/~cz210552/webbench.html

http://www.cppblog.com/merlinfang/archive/2014/12/26/209311.html

http://cloudwu.github.io/lua53doc/

cd /tmp
LUA_VERSION=lua-5.3.3
CPU_NUM=`cat /proc/cpuinfo | grep processor | wc -l`
wget http://www.lua.org/ftp/${LUA_VERSION}.tar.gz
tar zxf ${LUA_VERSION}.tar.gz
cd ${LUA_VERSION}
make linux

http://webserver2.tecgraf.puc-rio.br/~lhf/ftp/lua/#srlua

http://luabinaries.sourceforge.net/download.html

http://cloudwu.github.io/lua53doc/manual.html

socat是一個netcat(nc)的替代產品,可以稱得上nc++。 http://www.dest-unreach.org/socat/

http://www.dest-unreach.org/socat/download/

iotop htop mtr

netpipes 和socat一样,主要是用来在命令行来进行socket操作的命令,这样你就可以在Shell脚本下行进socket网络通讯了。

查看网络流量

统计连接某服务端口最多的的IP地址

netstat -nat | grep "192.168.1.3:443" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20

iftop和iptraf可以用来查看当前网络链接的一些流量情况。

ifstat 能查看系统大致的网络流量,直接执行ifstat即可

ifstat -v打印版本并退出

ifstat -a显示所有的网卡统计,-bKbps为单位.-S持续更新而不滚动更新,直接加上数字可控制计算的间隔ifstat -tT 5

iftopepel源中,系统不自带,功能更加全面, 同样功能全面的还有 https://github.com/tgraf/bmon

yum install iftop -ysudo apt-get install iftop

iftop -N -n -i eth1

-n直接显示IP, 不进行DNS反解析 -N直接显示连接埠编号, 不显示服务名称

进入iftop画面后的一些操作命令(注意大小写)

按h切换是否显示帮助;

按n切换显示本机的IP或主机名;

按s切换是否显示本机的host信息;

按d切换是否显示远端目标主机的host信息;

按t切换显示格式为2行/1行/只显示发送流量/只显示接收流量;

按N切换显示端口号或端口服务名称;

按S切换是否显示本机的端口信息;

按D切换是否显示远端目标主机的端口信息;

按p切换是否显示端口信息;

按P切换暂停/继续显示;

按b切换是否显示平均流量图形条;

按B切换计算2秒或10秒或40秒内的平均流量;

按T切换是否显示每个连接的总流量;

按l打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;

按L切换显示画面上边的刻度;刻度不同,流量图形条会有变化;

按j或按k可以向上或向下滚动屏幕显示的连接记录;

按1或2或3可以根据右侧显示的三列流量数据进行排序;

按<根据左边的本机名或IP排序;

按>根据远端目标主机的主机名或IP排序;

按o切换是否固定只显示当前的连接;

按f可以编辑过滤代码,这是翻译过来的说法,我还没用过这个!

按!可以使用shell命令,这个没用过!没搞明白啥命令在这好用呢!

按q退出监控。

iostat, vmstat, ifstat 三合一的工具,用来查看系统性能。

rtorrent aria2c lftp ack是一个perl脚本,是grep的一个可选替换品

Linux 上的log文件

系统log

/var/log/boot.log 系统启动的log

/var/log/yum.log yum执行的log

/var/log/messages 系统报错日志

/var/log/cron crontab 的log

/var/log/dmesg 内核日志

关于ssh登陆的.

/var/log/secure sshd 的log,记录所有成功登陆,失败登陆的日志.

/var/log/wtmp 二进制文件(DBase 3 index file), 记录每个用户的登录次数,IP和持续时间等信息.用last命令获取这些信息.

/var/log/btmp 二进制文件(DBase 3 index file), 记录登陆失败的用户,IP,日期等.用lastb命令来获取这些信息.

/var/log/lastlog 记录每个用户最后的登录信息,用命令lastlog获取这些信息.

/var/run/utmp 记录着现在登陆的用户.utmp文件被各种 命令使用,包括who、w、users和finger。

ac命令根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连接的时间(小时),如果不使用标志,则报告总的时间

ac -d 将显示每天的总的连接时间

ac -p 将显示每个用户的总的连接时间

这些log的配置主要由/etc/rsyslog.conf配置

grep "Failed password for" /var/log/secure 查看最近登录失败的请求

grep -E -o "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/secure|sort|uniq -c|sort -nr | head -30

查看登录失败的统计,根据lastb命令 lastb | awk '{print $3}' | sort | uniq -c | sort -nr | head -30

可以将这些IP通过iptables禁用掉。

/var/log/journal/ 为系统systemd的日志,长期不清理可能会持续占用磁盘空间

vim /etc/systemd/journald.conf 可修改占用的最大磁盘空间等配置,例如需修改SystemMaxUse=100M

journalctl --vacuum-size=100M 手动执行修改也可以,仅仅保存最近100M的日志

使用journalctl命令可查看systemd服务的日志, -u指定unit,如查看sshd服务的日志:journalctl -u sshd

在rhel7系统中有两个日志服务,分别是传统的rsyslog和systemd-journal systemd-journald是一个改进型日志管理服务,可以收集来自内核、系统早期启动阶段的日志、系统守护进程在启动和运行中的标准输出和错误信息,还有syslog的日志。

该日志服务仅仅把日志集中保存在单一结构的日志文件/run/log中,由于日志是经历过压缩和格式化的二进制数据,所以在查看和定位的时候很迅速。默认情况下并不会持久化保存日志,只会保留一个月的日志。另外,一些rsyslog无法收集的日志也会被journal记录到。

rsyslog作为传统的系统日志服务,把所有收集到的日志都记录到/var/log/目录下的各个日志文件中。常见的日志文件如下: /var/log/messages 绝大多数的系统日志都记录到该文件 /var/log/secure 所有跟安全和认证授权等日志都会记录到此文件 /var/log/maillog 邮件服务的日志 /var/log/cron crond计划任务的日志 /var/log/boot.log 系统启动的相关日志。

测试网络丢包

apk update && apk upgrade
apk add curl make gcc g++
cd /tmp
curl -sSL https://github.com/esnet/iperf/archive/3.1.7.tar.gz | tar xz --strip 1
./configure && make LDFLAGS=-static && make install

alpine中编译失败

curl -sSL https://github.com/esnet/iperf/archive/3.1.7.tar.gz | tar xz --strip 1
./configure && make LDFLAGS="-L/lib64/libc.a -L/lib64/libm.a  -static-libstdc++ -static-libgcc -static" && make install

在centos上编译成功

下载iperf3.xz

服务器端: iperf3 -s -f M -V -p 3340

客户端: iperf3 -c 服务器IP -f M -V -R -k 1000 -b 3M -l 1400 -w 8192 -p 3340

查看进程的线程

在ps命令中,“-T”选项可以开启线程查看。 ps -T aux

ps -T -p

top -H

在top运行时,你也可以通过按“H”键将线程查看模式切换为开或关。

top -H -p <pid>

top -H -b -n1

性能测试

yum install -y sysbench bc htop

单核心CPU测试

计算5000位PI值,能使单核心跑满,只能测试单核心性能 time echo "scale=5000; 4*a(1)" | bc -l -q

MacBookPro 13年末13寸 Intel® Core™ i5-4258U CPU @ 2.40GHz : 23.977s

腾讯云 kvm Intel® Xeon® CPU E5-26xx v2 @2.60GHz : 24.017s

某OPENVZ单核VPS测试 Intel® Xeon® CPU X5675 @ 3.07GHz : 26.611s

阿里云 xen-hvm Intel® Xeon® CPU E5-2650 v2 @ 2.60GHz : 26.659s

搬瓦工OPENVZ单核VPS Intel® Xeon® CPU X5650 @ 2.67GHz : 31.821s

独享物理机 Intel® Xeon® CPU E5506 @ 2.13GHz : 37.454s

4核独享物理机 Intel® Xeon® CPU E7- 4820 @ 2.00GHz : 39.464s

某VMWARE虚拟化VPS Intel® Xeon® CPU X7560 @ 2.27GHz : 45.866s

独享物理机 Intel® Xeon® CPU E3-1230 v3 @ 3.30GHz : 1m12.240s

树莓派2 ARMv7 Processor rev 5 (v7l) : 2m12.017s

树莓派2的2000位计算时间是12.864s E3-1230 的是6.993s

sysbench测试

测试cpu性能

sysbench --test=cpu --cpu-max-prime=10000 --num-threads=4 run

测试计算素数直到某个最大值所需的时间

可跑满指定核心数,所有核心参与测试,测试出CPU整体性能

下面全部核心参与计算

独享物理机4核心4线程 Intel® Xeon® CPU E5506 @ 2.13GHz : 3.1261s

独享物理机4核心8线程 Intel® Xeon® CPU E3-1230 v3 @ 3.30GHz : 5.4672s

搬瓦工OPENVZ单核VPS Intel® Xeon® CPU X5650 @ 2.67GHz : 5.5206s

某OPENVZ单核VPS测试 Intel® Xeon® CPU X5675 @ 3.07GHz : 9.5783s

腾讯云 kvm 单核 Intel® Xeon® CPU E5-26xx v2 @2.60GHz : 12.5962s

阿里云 xen-hvm 单核 Intel® Xeon® CPU E5-2650 v2 @ 2.60GHz : 12.8241s

某VMWARE虚拟化VPS单核 Intel® Xeon® CPU X7560 @ 2.27GHz : 13.7159s

树莓派2全部核心运算 ARMv7 Processor rev 5 (v7l) : 81.7271s

树莓派2 系统是OSMC sysbench 0.4.12

E3单核性能不行;搬瓦工CPU性能不错,单核媲美E3四核;I5单核性能竟然比E3强那么多

不同日期测试,发现搬瓦工CPU性能波动5.5~11秒之间,但是上一步的单核性能测试基本一致,可能是母鸡CPU资源使用较多.

线程测试

sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run

测试fileio性能

sysbench --test=fileio --file-total-size=1G --file-test-mode=rnd rw --init-rng=on --max-time=30 --max-requests=0 run

参数指定了最大创建16个线程,创建的文件总大小为3G,文件读写模式为随机读。

sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw prepare
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw run
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw cleanup

内存测试

sysbench --test=memory --memory-block-size=8k --memory-total-size=4G run

磁盘性能测试还可以使用 ioping 使用 yum install ioping 安装

对搬瓦工1G的测试如下

[root@suconghou ~]# ioping -RL .

--- . (simfs /dev/simfs) ioping statistics ---
8.17 k requests completed in 2.45 s, 2.00 GiB read, 3.33 k iops, 833.0 MiB/s
generated 8.17 k requests in 3.00 s, 2.00 GiB, 2.72 k iops, 681.1 MiB/s
min/avg/max/mdev = 52.4 us / 300.1 us / 3.08 ms / 127.9 us
[root@suconghou ~]# ioping -R .

--- . (simfs /dev/simfs) ioping statistics ---
51.6 k requests completed in 2.05 s, 201.6 MiB read, 25.2 k iops, 98.3 MiB/s
generated 51.6 k requests in 3.00 s, 201.6 MiB, 17.2 k iops, 67.2 MiB/s
min/avg/max/mdev = 785 ns / 39.7 us / 2.87 ms / 60.4 us

VPS性能综合测试脚本

https://bench.sh/ 提供bash脚本测试

wget -qO- bench.sh | bash 或者 curl -Lso- bench.sh | bash 即可测试

资源下载

ArchLinux http://mirror.bit.edu.cn/archlinux/iso/latest/

CentOS http://mirror.bit.edu.cn/centos/7.3.1611/isos/x86_64/

Debian http://mirror.bit.edu.cn/debian-cd/8.7.1/amd64/iso-cd/

Ubuntu http://mirror.bit.edu.cn/ubuntu-releases/

https://mirrors.tuna.tsinghua.edu.cn/# 右侧也有直接选择下载地址

busybox

https://www.busybox.net/downloads/binaries/ 静态编译好的二进制可执行文件,包含各个平台,可作为急救用.

可在下载busybox_ASH存储为/usr/bin/ash,这样即使系统的bash无法运行,也能ssh进来使用指定的ash

不能Ctrl+C 或者运行 top htop 等交互式命令 ssh root@vpsip ash

不能Ctrl+C 或者运行 top htop 等交互式命令,可设置环境变量TERM=xterm-256color勉强运行htop ssh root@vpsip ash -i

分配tty,这样得到一个功能完备的终端,可以运行 Ctrl+C 和 top,htop等交互式命令 ssh -t root@vpsip ash

得出脚本存放的路径

linux: DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

mac: $(cddirname $0; pwd)

shell 统计 nginx 日志

统计共多少IP访问 awk '{print $1}' access.log 按IP计数 awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more

URL访问统计 awk '{print $7}' access.log | sort | uniq -c | sort 访问最频繁的URL awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more

~/.shell.sh

alias mem="ps aux --sort -rss  | head -n20 && ps auxw --sort=-%cpu,-time | head -n5"
alias topip='grep -E -o "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/secure|sort|uniq -c|sort -nr | head -30'

其他Linux 命令

ncdu

epel源中

yum install -y ncdu 安装.

ncdu -h 查看帮助 ncdu /usr 查看指定目录占用分布

Linux恢复已删除,但是仍被进程持有的文件

cp /proc/<pid>/fd/<fdno> /new/path/to/file

tail -c +0 -f /proc/PIDofProgram>/fd/# > /new/path/to/file

通过inode

find /path/to/check -inum 1023564 -exec cp {} recoveredfile \;

音乐标题
歌手