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
时间戳转时间日期
Mac: date -r 1514131200 GNU/Linux: date -d @1514131200
使用 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
另提供一个脚本可以快速处理 https://gist.github.com/suconghou/665dbf665437402f65ecee329ea2f517
使用 bbe https://sourceforge.net/projects/bbe-/ 同样可以很方便的替换二进制文件
https://stackoverflow.com/questions/2604964/binary-sed-replacement
其他架构CPU指令模拟器 https://github.com/multiarch/qemu-user-static 提供各平台二进制文件 可以用于模拟执行arm的二进制文件等
https://github.com/multiarch/qemu-user-static/releases
https://packages.debian.org/sid/qemu-user-static
https://www.qemu.org/download/#source
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
修改用户的uid和gid https://muffinresearch.co.uk/linux-changing-uids-and-gids-for-user/
将原文件夹宿主改为指定
/bin/chown --changes --silent --no-dereference --recursive --from=${src_uid}:${src_gid} ${dest_uid}:${dest_gid} /
给用户sudo 权限
sudo visudo
为想要的用户添加一行
builder ALL = (ALL) ALL
chsh
命令设置当前用户使用的shell
sudo -u user -g group "command"
使用其他用户身份执行命令
su -
su - root
su - root -c "ls -l /root"
su - oracle -c "ulimit -aHS"
su -s /bin/sh -c "/usr/local/nginx/sbin/nginx"
以www-data身份执行一个php文件
su - www-data -s /bin/bash -c "php -f /var/www/html/cron.php"
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地址
mv
有时候需要移动一个文件夹中的内容到另一个文件夹内,
但是当目标文件夹中存在内容时,mv会拒绝执行。也就是说mv不会为你合并这些内容。
只能使用 cp -r
然后再删除原文件夹。
类似的,还可以使用下面两个命令
rsync -a backup/ backupArchives/
(cd backup && tar c .) | (cd backupArchives && tar xf -)
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
how linux store metadata
https://superuser.com/questions/1160927/where-does-metadata-go-when-you-save-a-file
yum install strace -y
strace -v cp foo bar
vs strace -v cp -a foo bar
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
对比 ps aux | grep
,有时我们需要grep两次来排除grep进程自己,pgrep就没有这个问题。
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 faux
以树状查看
有些进程命令行太长无法查看全,可以使用 ps auxww
或者 ps -fwwp 2755
或者
xargs -0 printf '%s\n' < /proc/2755/cmdline
/usr/java/jdk1.8.0_144/bin/java -Xms256m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m -classpath /home/apache-maven-3.3.9/boot/plexus-classworlds-2.5.2.jar -Dclassworlds.conf=/home/apache-maven-3.3.9/bin/m2.conf -Dmaven.home=/home/apache-maven-3.3.9 -Dmaven.multiModuleProjectDirectory=/home/spoc-contract org.codehaus.plexus.classworlds.launcher.Launcher -U -Dmaven.test.skip jetty:run
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
ps 默认是按照PID排序的,若要按内存使用排序ps auxw --sort=rss
,同理按虚拟内存排序ps auxw --sort=vsz
mac上无法使用--sort
,可以采用sort
排序,如rss在第六列,则ps auxw | sort -k6,6n
linux上进程有5种状态:
- 运行(正在运行或在运行队列中等待)
- 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
- 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
- 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
- 停止(进程收到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
D 不可中断 Uninterruptible sleep (usually IO)
R 正在运行,或在队列中的进程
S 处于休眠状态
T 停止或被追踪
Z 僵尸进程
W 进入内存交换(从内核2.6开始无效)
X 死掉的进程
< 高优先级
N 低优先级
L 有些页被锁进内存
s 包含子进程
+ 位于后台的进程组;
l 多线程,克隆线程 multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
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
window 版 nc https://github.com/diegocr/netcat/
传送字符与文件
一端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
将当前目录的内容拷贝到远程指定的目录
tar cJvf - . | ssh root@ip "cd /tmp/ && mkdir -p a && cd a && tar xJvf -"
边打包边传输边解压,一条命令解决
传送大量大文件 使用 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
显示所有日志
nc -w 2 -n -z 127.0.0.1 6870-8990
只显示能接通的端口
模拟调试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的转发只能是单进程的,不支持并发。
使用socat,可以更方便的做端口转发, Linux 端口转发C语言实现代码 https://github.com/rssnsj/portfwd Mac上可直接编译使用,十分方便
C++ 实现的 适用于 Linux 等系统的 https://github.com/wangyu-/tinyPortMapper 并提供编译好的release
socat TCP-LISTEN:1935,fork TCP:10.18.18.102:1935
socat udp4-listen:1935,reuseaddr,fork UDP:10.18.18.102:1935
socat 还可以转发 unix socket
https://gist.github.com/ljjjustin/585e817d1d7ce4eb75b87076e5b7aa7e
使用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
端口转发
brook relay -l :5 -r 1.2.3.4:5
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() { size=${1:-100}; find . -type f -size +"$size"k -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
}
http://learning-kernel.readthedocs.io/en/latest/mem-management.html
oomps() { ps -eo pid,comm,pmem,rss –sort -rss | head -n 10 | awk ‘{“cat /proc/“$1”/oom_score” | getline oom; print $0”\t"oom}’ 2>/dev/null }
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 -anltup
与 ss -ln
都能查看网络链接信息
watch -n 1 -d netstat -ant
持续监控变化
部分快捷键
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更小, 并且解压也比gzip快一倍,默认配置完全碾压gzip
使用 tar czvf 是指定压缩比
env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory
BZIP2=-9 tar cvjf file.tar.bz2 /path/to/directory
或者使用管道
tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
https://github.com/facebook/zstd 编译
apk add --update curl make gcc g++
cd /tmp
curl -sSL https://github.com/facebook/zstd/archive/v1.3.5.tar.gz | tar xz
cd zstd-1.3.4
make
无依赖,可直接静态编译,也可以不静态编译.
还可以添加 gz / xz / lzma 支持
make CFLAGS="-O3 -ffunction-sections -fdata-sections" LDFLAGS="-static -Wl,--gc-sections" -j4
编译约需2分钟,当前目录下会生成zstd
可执行文件
zstd 对于文本文件的压缩率非常高,大幅优于 gzip;但是对于二进制类的文件压缩率不如 lzma。用 zstd 来压缩日志是个比较好的做法,zstd 压缩二进制文件也比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 文件路径需要匹配的
使用 find 的时候加上maxdepth限制搜索深度,可以加快进度
find jenkins/ -maxdepth 5 -type f -name "upload.py"
find . -type f -mmin +1 -exec rm -i {} ;
使用全文查找
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.xx.cn/fed-static r=http://cdn.xx.cn/fed-static/fedv2 sed -i "s#$o#$r#g" *.html
以当前时间命名
filename=html`date +"%Y%m%d%H%M%S"`.tar.gz
sleep forever
while true; do sleep 86400; done
sleep infinity
cat
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/
https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg
判断一个命令是否存在
如判断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$"
时间同步
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
会立即生效.
CentOS
ntpdate time.pool.aliyun.com
使用ntpdate
时,不能运行ntpd服务
/etc/ntp.conf
ntpd
Linux 磁盘与MySQL性能测试
源码地址 : https://github.com/akopytov/sysbench
它主要包括以下几种方式的测试:
- cpu性能
- 磁盘io性能
- 调度程序性能
- 内存分配及传输速度
- POSIX线程性能
- 数据库性能(OLTP基准测试)
目前sysbench主要支持 MySQL,pgsql,oracle 这3种数据库。
Mtr网络线路测试
如果未安装可以yum info mtr
安装
-n 不用主机解释 -c 发送多少个数据包 –report 结果显示,并不动态显示。
mtr --report www.baidu.com
Shell基本语法
http://blog.sina.com.cn/s/blog_64e166580100vwk2.html
判断一个变量是否为空
pid=$(ps aux | grep "process name" | grep "jetty:run" | awk '{print $2}')
[ -n "$pid" ] && echo $pid && kill $pid
不为空则输出,并杀死进程
声明数组
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
访问 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
磁盘挂载
-
fdisk -l
或者lsblk
查看磁盘 -
fdisk /dev/vdb
对指定磁盘分区,n
新建w
保存写入,q
放弃操作
分区完毕后 使用第一步的命令可以查看到变化
blkid
可以查看分区的uuid,类型, 后面也可更一个分区名,查看指定的
- 格式化分区
df -lhT
可以看到原有的磁盘格式
使用 mke2fs
格式化分区
e2fsck
检查文件、扇区是否有错误
mke2fs -t ext4 /dev/vdb1
#ext4创建文件系统
- 挂载
mount
可以查看目前已挂载的信息
vim /etc/fstab
永久性挂载配置
/dev/vdb1 /data ext4 defaults 1 1
第一个是分区, 第二个是路径 第三个是分区格式,
mount -a 自动挂载/etc/fstab文件没有挂载的设备,不管已挂载过的设备
如果想刷新修改过已挂载的设备,mount -o remount /dev/sdX(或挂载点)
swpon -a 自动激活/etc/fstab文件没有激活的交换(扩展)空间 ,不管已激活的扩展空间
如果想刷新修改过已激活的扩展设备,mount -o remount /dev/sdX(或挂载点)
挂载点必须是已经存在的目录。
参考 https://www.cnblogs.com/qiyebao/p/4484047.html
https://www.cnblogs.com/along21/p/7410619.html
编译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 查看谁在疯狂读写磁盘
dstat 用来替换 vmstat, iostat, netstat, nfsstat 和 ifstat 这些命令的工具,是一个全能系统信息统计工具。
htop 比top更好用
mtr
netpipes 和socat一样,主要是用来在命令行来进行socket操作的命令,这样你就可以在Shell脚本下行进socket网络通讯了。
htop 进度条的颜色
对于CPU显示条:
蓝色为:低优先级的线程
绿色为:正常优先级线程
红色为:内核线程
对于内存显示条:
蓝色为:缓冲区(buffers)
绿色为:已使用的内存
(橘)黄色为:高速缓存(cache)
怎么清除黄色部分的内存,即高速缓存呢?
只需在终端输入:
sync; sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
MemAvailable:可用内存数
应用程序可用内存数。系统中有些内存虽然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以MemFree不能代表全部可用的内存,这部分可回收的内存加上MemFree才是系统可用的内存,即:MemAvailable≈MemFree+Buffers+Cached,它是内核使用特定的算法计算出来的,是一个估计值。它与MemFree的关键区别点在于,MemFree是说的系统层面,MemAvailable是说的应用程序层面。
- Buffer不是缓存,国内常用的翻译是缓冲区。
- 其次,大部分场景中,Buffer是特指内存中临时存放的IO设备数据——包括读取和写入;而Cache的用处很多——很多IO设备(例如硬盘、RAID卡)上都有Cache,CPU内部也有Cache,浏览器也有Cache。
- Buffer并非用于提高性能,而Cache的目的则是提高性能。
- 涉及到IO设备读写的场景中,Cache的一部分本身就是Buffer的一种。如果说某些场合Buffer可以提升IO设备的读写性能,只不过是因为Buffer本身是Cache系统的一部分,性能提升来自于Cache机制。
- Buffer占用的内存不能回收,如果被强行回收会出现IO错误。Cache占用的内存,除实现Buffer的部分外都可以回收,代价则是下一次读取需要从数据的原始位置(通常是性能更低的设备)读取。
- 在IO读写过程中,任何数据的读写都必然会产生Buffer,但根据Cache算法,可能会有相当部分数据不会被Cache。
查看网络流量
统计连接某服务端口最多的的IP地址
netstat -nat | grep "192.168.1.3:443" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
统计在一台前端机上高峰时间TCP连接的情况,统计命令:
netstat -tn | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
sysctl net.ipv4.tcp_syncookies=1
sysctl net.ipv4.tcp_tw_reuse=1
sysctl net.ipv4.tcp_tw_recycle=1
sysctl net.ipv4.tcp_fin_timeout=30
iftop和iptraf可以用来查看当前网络链接的一些流量情况。
ifstat
能查看系统大致的网络流量,直接执行ifstat
即可
ifstat -v
打印版本并退出
ifstat -a
显示所有的网卡统计,-b
以Kbps
为单位.-S
持续更新而不滚动更新,直接加上数字可控制计算的间隔ifstat -tT 5
iftop
在epel
源中,系统不自带,功能更加全面, 同样功能全面的还有 https://github.com/tgraf/bmon
yum install iftop -y
或 sudo 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。
清空这些文件,最好使用 echo -n '' > /path/to/file
或者 cat /dev/null > /path/to/file
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
命令 -i
参数表示始终显示IP地址
lastb -i | 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 --vacuum-time=2d
按时间,仅保留最近2天 , 单位也可以换成s
使用journalctl
命令可查看systemd服务的日志, -u指定unit,如查看sshd服务的日志:journalctl -u sshd
若要像 tail -f
追踪使用 journalctl -f -u service
-n 指定数量
在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 -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
性能测试
virt-what
可查看本机使用的虚拟化技术
yum install -y sysbench bc htop
单核心CPU测试
计算5000位PI值,能使单核心跑满,只能测试单核心性能
time echo "scale=5000; 4*a(1)" | bc -l -q
某单核I7OPENVZ云服务器 Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz 15.040s
某单核OVH法国VPS Intel(R) Xeon(R) CPU E5-1630 v4 @ 3.70GHz 16.556s
MacBookPro 15年中15寸 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz 20.647s
Window上virtual虚拟机里的docker Intel(R) Xeon(R) CPU E3-1230 v5 @ 3.40GHz 22.84s
MacBookPro 13年末13寸 Intel(R) Core(TM) i5-4258U CPU @ 2.40GHz : 23.977s
腾讯云 kvm Intel(R) Xeon(R) CPU E5-26xx v2 @2.60GHz : 24.017s
某OPENVZ单核VPS测试 Intel(R) Xeon(R) CPU X5675 @ 3.07GHz : 26.611s
阿里云 xen-hvm Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz : 26.659s
搬瓦工OPENVZ单核VPS Intel(R) Xeon(R) CPU X5650 @ 2.67GHz : 31.821s
某xen 双核vps Intel(R) Xeon(R) CPU E5-2450L 0 @ 1.80GHz : 32.334s
独享物理机 Intel(R) Xeon(R) CPU E5506 @ 2.13GHz : 37.454s
4核独享物理机 Intel(R) Xeon(R) CPU E7- 4820 @ 2.00GHz : 39.464s
某VMWARE虚拟化VPS Intel(R) Xeon(R) CPU X7560 @ 2.27GHz : 45.866s
独享物理机 Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz : 1m12.240s
某廉价单核VPS Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz : 1m13.171s
树莓派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(R) Xeon(R) CPU E5506 @ 2.13GHz : 3.1261s
独享物理机4核心8线程 Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz : 5.4672s
搬瓦工OPENVZ单核VPS Intel(R) Xeon(R) CPU X5650 @ 2.67GHz : 5.5206s
某OPENVZ单核VPS测试 Intel(R) Xeon(R) CPU X5675 @ 3.07GHz : 9.5783s
腾讯云 kvm 单核 Intel(R) Xeon(R) CPU E5-26xx v2 @2.60GHz : 12.5962s
阿里云 xen-hvm 单核 Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz : 12.8241s
某VMWARE虚拟化VPS单核 Intel(R) Xeon(R) 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/
https://mirrors.aliyun.com/centos/7.6.1810/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: $(cd
dirname $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'
alias httpd="busybox httpd -p 7788 -h /data/www/share"
addblock(){
lastb -i | awk '{print $3}' | sort | uniq -c | sort -nr | head -50 | awk '{print "ip route add blackhole ", $2}' | sort -n | uniq | sh
}
其他Linux 命令
输出到stderr
echo >&2 “Unexpected value "
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 \;
文件监控
无依赖,源码包仅20KB+,多平台支持,编译仅需几秒钟,可执行文件20KB+
./configure && make
使用 ag -l | entr -s 'make && make test'
代码修改后重启node
ag -l | entr -sr 'make ts && node bundle.js'
https://bitbucket.org/eradman/entr/
比较有用的命令行工具
ag tig mycli https://www.mycli.net/install jq yapf fzf https://github.com/AlDanial/cloc https://github.com/axel-download-accelerator/axel https://ccache.samba.org/ https://dev.yorhel.nl/ncdu https://nicolargo.github.io/glances/ https://github.com/jarun/nnn#performance https://github.com/yudai/gotty https://serveo.net/
cat -> ccat -> bat
ping -> prettyping
ctrl+r -> fzf
top -> htop
grep -> ack -> ag -> ripgrep
https://github.com/BurntSushi/ripgrep https://blog.burntsushi.net/ripgrep/
curl -> httpie
autojump -> fasd https://github.com/rupa/z https://github.com/euank/pazi
https://github.com/acarl005/ls-go https://github.com/ogham/exa
https://github.com/variadico/noti
ncdu -> https://github.com/jarun/nnn
https://github.com/so-fancy/diff-so-fancy
https://github.com/Miserlou/Loop#osx https://github.com/BurntSushi/xsv
代码行数统计 https://boyter.org/posts/sloc-cloc-code/ https://github.com/boyter/scc/ https://github.com/Aaronepower/tokei https://github.com/cgag/loc https://github.com/hhatto/gocloc
https://tldr.sh/ https://github.com/tldr-pages/tldr-cpp-client cargo install tealdeer
https://github.com/zyedidia/micro/releases golang 写的编辑器