Linux服务器命令

常用命令简单说明

grep 命令

grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来

  1. 格式
    grep [option] pattern file
  2. 选项
    -v –revert-match #显示不包含匹配文本的所有行
    -w –word-regexp #只显示全字符合的列
    -h –no-filename #在显示符合样式的那一行之前,不标示该行所属的文件名称

awk命令

是一种处理文本文件的语言,是一个强大的文本分析工具

  1. 规则:awk [选项参数] ‘条件1{动作1} 条件2{动作2} …’ 文件名
    ( 如果条件1,执行动作1;如果条件2,执行动作2 )
  2. 变量 :$1:提取第一列 ,$2提取第二列,
  3. 选项
    -F :指定输入文件折分隔符
  4. 输出
    print:会在每个输出之后自动加入一个换行符
    printf:标准格式输出命令,需要换行需手动加入
  1. 应用
    1
    2
    3
    awk '{printf $2 "\t" $3"\n"}' user.txt
    awk -F, '{print $1,$2}' log.txt
    awk -F '[ ,]' '{print $1,$2,$5}' log.txt # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割

cut命令

提取列: cut [选项] 文件

  1. 选项:
    -f 列号 ( –field 提取第几列 )
    -d 分隔符 ( –delimiter 按照指定分隔符分割列 )
  2. 应用:
    1
    cut -d ":" -f 1,3 /etc/passwd # :分隔,输出1,3行

sed命令

数据进行选取、替换、删除、新增的命令

  1. 使用方法:sed [选项] ‘[动作]’ 文件名
  2. 选项
    -n : 一般sed命令会把所有数据都输出到屏幕;如果加入此选项,则只会把经过sed命令处理的行输出到屏幕。(如:sed -n ‘2p’ user.txt # 输出第二行)
  3. 动作
    d : 删除,删除指定的行。
    p : 打印,输出指定的行。
    s : 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)如:sed “s/r//g” user.txt 替换r为空
  4. 实例:
    1
    2
    sed -n '2p' user.txt # 输出第二行, p一般都要和-n使用,不加-n会显示出所有的行
    sed "s/r//g" user.txt # 替换r为空

sort命令

排序

  1. 选项
    -n:按数值排序,默认按ASCII码值排序
    \u:在输出行中去除重复行
    -r:降序(默认是降序)
    -o:输出结果重定向到文件
    \t:指定间隔符(配合-k指定列数排序)
    -k: 指定列排序

netstat 命令

用于显示各种网络相关信息,如网络连接,路由表,接口状态

  1. 选项
    -a (all)显示所有选项,默认不显示LISTEN相关(如果需要显示LISTEN相关需增加-l选项)
    -t (tcp)仅显示tcp相关选项
    -u (udp)仅显示udp相关选项
    -n 拒绝显示别名,能显示数字的全部转化成数字。
    -l 仅列出有在 Listen (监听) 的服務状态
    -p 显示建立相关链接的程序名

    ps 命令

    能够给出当前系统中进程的快照

三种语法格式(一般使用UNIX风格的ps命令):
UNIX 风格,选项可以组合在一起,并且选项前必须有“-”连字符
BSD 风格,选项可以组合在一起,但是选项前不能有“-”连字符
GNU 风格的长选项,选项前有两个“-”连字符
常用参数
-A 列出所有的进程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程(主要包含CPU和memory占比)
-ef

  1. 不加参数执行ps命令

    4列信息分别是:PID(进程编号)、TTY(终端)、TIME(命令占用的CPU处理时间)、CMD(进程运行的命令)

  2. 显示所有进程
    使用 -a 参数。-a 代表 all。同时加上x参数会显示没有控制终端的进程。
    ps -ax | less

    1
    2
    3
    4
    PID TTY      STAT   TIME COMMAND
    1 ? Ss 1:10 /sbin/init
    2 ? S 0:00 [kthreadd]
    3 ? S 7:08 [migration/0]
  3. 通过cpu使用来过滤进程

  • 使用cpu排序
    ps aux --sort -pcpu | head
  1. ps 与grep 常用组合用法,查找特定进程
    ps -ef|grep ssh
    1
    2
    3
    UID        PID  PPID  C STIME TTY          TIME CMD
    root 1334 1 0 2016 ? 07:12:57 /usr/sbin/sshd
    root 1840 27822 0 17:57 pts/1 00:00:00 grep ssh

参考:

运行结果:

1
2
3
netstat -anlp | head
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1334/sshd

  1. 查看TCP连接状态
    常用:
    1
    netstat -ant |awk '{print $6}'|sort|uniq -c|sort -rn

可用:

1
2
3
4
netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}' 
netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"t",state[key]}'
netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"t",arr[k]}'
netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn

  1. 查找请求数20个IP
    netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20

netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20

  1. 用tcpdump嗅探80端口的访问看看谁最高
    tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20

  2. 查找较多time_wait连接
    netstat -n|grep TIME_WAIT|awk '{print $5}'| cut -d ':' -f 1 | sort|uniq -c|sort -rn|head -n2

  3. 找查较多的SYN连接
    netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
  4. 根据端口列进程
    netstat -ntlp | grep 80 | awk '{print $NF}' | cut -d '/' -f1

nginx日志知识

nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义。

access_log指令

语法: access_log path [format [buffer=size [flush=time]]];

1
2
3
access_log path format gzip [=level] [buffer=size] [flush=time];
access_log syslog:server=address\[,parameter=value] [format];
access_log off;

默认值: access_log logs/access.log combined;
配置段: http, server, location, if in location, limit_except
gzip:压缩等级。
buffer:设置内存缓存区大小。
flush:保存在缓存区中的最长时间。
不记录日志:access_log off;
使用默认combined格式记录日志:
access_log logs/access.log 或 access_log logs/access.log combined;

log_format指令

  1. 语法: log_format name string …;
  2. 默认值: log_format combined “…”;
  3. 配置段: http
    name表示格式名称,string表示等义的格式。

  4. 默认配置:log_format有一个默认的无需设置的combined日志格式

    1
    log_format combined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"';

对应的日志记录:

1
2
127.0.0.1 - - [21/Sep/2016:10:57:04 +0800] "GET / HTTP/1.1" 302 5 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36" "-" 
127.0.0.1 - - [21/Sep/2016:10:57:04 +0800] "GET /dashboard.php HTTP/1.1" 200 26652 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36" "-"

  1. 日志格式变量含义

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $remote_addr, $http_x_forwarded_for 记录客户端IP地址
    $remote_user 记录客户端用户名称
    $request 记录请求的URL和HTTP协议
    $status 记录请求状态
    $body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
    $bytes_sent 发送给客户端的总字节数。
    $connection 连接的序列号。
    $connection_requests 当前通过一个连接获得的请求数量。
    $msec 日志写入时间。单位为秒,精度是毫秒。
    $pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
    $http_referer 记录从哪个页面链接访问过来的
    $http_user_agent 记录客户端浏览器相关信息
    $request_length 请求的长度(包括请求行,请求头和请求正文)。
    $request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
    $time_iso8601 ISO8601标准格式下的本地时间。
    $time_local 通用日志格式下的本地时间。
    [warning]发送给客户端的响应头拥有“sent_http_”前缀。 比如$sent_http_content_range。[/warning]
  2. 常见问题

  • 获取真实客户IP:如果nginx位于负载均衡器,squid,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址了。 $remote_addr获取反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录 客户端IP地址和客户端请求的服务器地址。PS: 获取用户真实IP 参见http://www.ttlsa.com/html/2235.html

网站日志分析篇(nginx)

  1. 获得访问前10位的ip地址

    1
    2
    3
    cat nginx.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10 

    cat nginx.log|awk '{counts[$(1)]+=1}; END {for(url in counts) print counts[url], url}' | sort -nr
  2. 访问次数最多的文件或页面,取前20
    cat nginx.log | awk '{print $7}' | grep -E "^/.*" | sort | uniq -c | sort -nr | head -n 20

  3. 统计404的连接
    cat nginx.log | awk '/ 404 /{print $7}' | sort | uniq -c | sort -nr | more

系统Debug分析篇

1.调试命令
strace -p pid
2.跟踪指定进程的PID
gdb -p pid

参考:

crontab定时任务

/etc/crontab中每行任务的描述格式

minute hour day month dayofweek command

  • minute 从0到59的整数
  • hour 从0到23的整数
  • day 从1到31的整数 (必须是指定月份的有效日期)
  • month 从1到12的整数 (或如Jan或Feb简写的月份)
  • dayofweek 从0到7的整数,0或7用来描述周日 (或用Sun或Mon简写来表示)
  • command 需要执行的命令(可用as ls /proc >> /tmp/proc或 执行自定义脚本的命令)
    root: 表示以root用户身份来运行
    run-parts: 表示后面跟着的是一个文件夹,要执行的是该文件夹下的所有脚本
    1
    2
    3
    4
    5
    6
    7
    # .---------------- minute (0 - 59)
    # | .------------- hour (0 - 23)
    # | | .---------- day of month (1 - 31)
    # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
    # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # | | | | |
    # * * * * * user-name command to be executed

语法

  • * 表示所有可用的值, 比如每隔10分钟执行一次:*/10
  • 整数间的连字号(-)表示整数列: 例如1-4意思是整数1,2,3,4
  • 逗号:如:3,4,6,8表示这四个指定整数
  • 符号“/”指定步进设置: “/”表示步进值。如0-59/2定义每两分钟执行一次。步进值也可用星号表示。如*/3用来运行每三个月份运行指定任务
  • 井号”#”: 注释行,不会被执行

参考:

定时任务设置

问题:linux下请设置一个定时任务,要求/data/www/a.php在每天凌晨2点到晚上20点,每10分钟执行一次。
答案:

1
2
vim  /etc/crontab
*/10 2-20 * * * /usr/local/bin/php /data/www/a.php

延伸:
定时任务在自己系统中是如何使用的,定时任务与持续运行脚本的区别。

定时任务:每隔一段时间执行一次,缺点:存在任务执行耗费时间过长,上次执行没有结束,下次执行又来了。
脚本运行:持续的脚本运行,可以使用supervisor进行管理,不过需要做兼容处理比如redis、mysql异常中断重连。