Blog

  • linux工具之top/htop

    主要介绍top

    第一行:

    时间 运行时间 登陆用户数 系统负载(任务队列的平均长度,分别为1分钟、5分钟、15分钟前到现在的平均值。)

    top - 08:36:25 up 19 min, 2 users, load average: 1.33, 0.86, 0.60

    负载的意思是在 run queue 中的进程数量除以 cpu 。 小于 cpu 个数都算没有超负载。

    第二行:

    进程总数 正在运行进程数 睡眠进程数 停止进程数 僵尸进程数

    Tasks: 179 total,   1 running, 178 sleeping,   0 stopped,   0 zombie

    第三行:

    cpu信息,按1显示每个cpu的情况,us表示进程处理所占的百分比,ni表示被nice改变优先级的命令占的百分比,id表示idle空闲, hi 代表 hardware interrupts,si 代表 software interrupst, 通过 cat /proc/interrupts 可以查看中断。

    Cpu(s):  4.8%us,  1.7%sy,  0.0%ni, 93.2%id,  0.3%wa,  0.0%hi,  0.0%si,  0.0%st

    四行、五行为内存和swap信息

    在进程信息栏中,查看进程更丰富的信息,h或?,会显示帮助命令
    列出常用的控制命令有

    M 根据驻留内存大小进行排序(常用)
    P 根据CPU使用百分比大小进行排序(常用)
    T 根据时间/累计时间进行排序(常用)
    R 将当前的排序倒转(常用)
    N 按进程ID排序
    u 可输入用户进行筛选
    空格  立即刷新信息
    k输入想要kill掉的进程ID号

    一页显示不完整,使用<>分别上下翻页

    控制显示的列:

    f  可控制显示列输出的内容, 对应a-z
    o键 可改变列的顺序,大写字母往左(上),小写字母身右(下)
    大写O 调整按某列排序

    过滤 nginx 用户执行的程序

    shift + u 然后输入 nginx
    或者在开始的时候就

    top -u nginx

    只显示某几个进程,跟进程号

    top -p  9943,11162

    只打印一次并重定向到文件中

    top -b -n 1 >> top1.txt

    按 z 显示颜色

    对于 mysqld 单进程多线程,默认其他线程会收缩起来,如果要显示按 H

    按 i 不显示空闲的进程及僵尸进程

    top 默认每 3 秒刷新一次,按 d 或 s 按提示可以输入想要的刷新间隔

    显示某个进程运行在某个 cpu 上,按 f 找到 Last used cpu ,按 j 选取上,这样显示就有此进程使用哪个 cpu 了。如果一个软件长期运行在一个 cpu 上,那么有可能是设置错误。

    按 F 根据某一列排序

    按 c 显示具体的进程名字

    当进行完上面的设置之后,按 W 保存当前的配置到 ~/.toprc 下次会直接调用。

    显示进程和线程

    top -H

    排序后只取前 n 位,按 n,输入数字

    设置 filter

    o 输入过滤条件,字段上面的都可以输入,如

    %CPU>100.0
    COMMAND=java

    查看当前的 filter

    Ctrl + o 

    清空当前的 filter

    =
  • vim复制粘贴

    vim

    复制整行

    yy

    粘贴一次

    p

    粘贴多次(n代表数字)

    np

    +y 复制
    +p 粘贴

  • ls命令按文件大小排序

    今天想在某网站找一个10KB大小的图片文件可是了半天

    后来想起ls可以按文件大小排序

    ls可以按照文件大小进行输出排序,这是一个很实用的参数。

    man ls

    -S sort by file size

    由大到小排序

    ls -Sl

    从小到大排序

    ls -Slr

    -h,表示”–human-readable”,单位是k或者M ,比较容易看清楚结果。

    显示子目录结构

    ls -R

    附:

    ls按时间排序

    ls -lt 从新到旧
    ls -lrt 从旧到新

    ls对当前目录和文件大小排序

    du -s * | sort -nr

    只对当前目录排序,并用直观的大小显示出来

    for i in $(ls -l |grep '^d' |du -s * |sort -nr|awk '{print $2}');do du -sh $i;done
  • 将数据文件的指定域读取到shell脚本中

    这个例子说明了怎样在 shell 脚本中从数据文件读取特定的域(field)并进行操作。例如,假设文件 employees.txt 的格式是{employee-name}:{employee-id}:{department-name},以冒号进行划分,如下所示。

    $ cat employees.txt

    Emma Thomas:100:Marketing
    Alex Jason:200:Sales
    Madison Randy:300:Product Development
    Sanjay Gupta:400:Support
    Nisha Singh:500:Sales

    下面的 shell 脚本说明了如何从这个 employee.txt 文件中读取特定的域(field)。

     $ vi read-employees.sh
    #!/bin/bash
    IFS=:
    echo "Employee Names:"
    echo "---------------"
    while read name empid dept
    do 
       echo "$name is part of $dept department"
    done < ~/employees.txt

    赋予脚本可执行权限后执行该脚本

     $ chmod u+x read-employees.sh 
     $ ./read-employees.sh 

    Employee Names:
    —————
    Emma Thomas is part of Marketing department
    Alex Jason is part of Sales department
    Madison Randy is part of Product Development department
    Sanjay Gupta is part of Support department
    Nisha Singh is part of Sales department

    来自:http://www.linuxnote.org/the-data-file-to-the-specified-domain-to-read-shell-scripts.html

  • 使用su使某用户执行某命令

    linux有20个普通的web用户,每次都要 cd ~/web,然后执行svn update,太麻烦了

    使用如下命令可以使user执行command命令,要注意这位user要有执行command的权限

    su -c "command" user

    下面的命令意思是进入到jpuyy的主目录,执行svn update

    su - -c "cd ~/web/ ; svn update" jpuyy

    su 与 su – 有挺大区别的,涉及到环境变量的问题,请参考 http://www.ha97.com/4001.html ,因此上面的命令用 su –

     

  • find命令

    linux里最重要的命令之一,可使用的选项之多令人无法记住,还好可以用man find来查询,下面以例子来学习,掌握最基础的先

    查找文件名为foobar

    find -name "foobar"

    查找不同文件后缀, 用 -o 连接

    find . -name "*.tf" -o -name "*.hcl" -exec cat {} \;

    不区分大小写查找 foobar

    find -iname "foobar"

    从 / 查找文件并限制查找的深度

    find / -maxdepth 2 -name passwd

    查找并计算 md5sum 值,后面参数不能省略

    find -iname "MyCprogram.c" -exec md5sum {} \;
    find -iname "MyCprogram.c" -exec md5sum {} +

    查到不包含某字符串的文件(反查)

    find -maxdepth 1 -not -iname "MyCProgram.c"

    根据 inode number 查找文件

    ls -li *
    find ./ -inum 17735

    对于乱码文件根据 inum 查找并删除

    find ./ -inum 17744 -exec rm {} +

    查找等于10KB的文件:

    find . -size 10k

    查找大于100KB的文件:

    find . -type f -size +100k
    查找大于100MB的文件:
    find . -type f -size +100M
    查找大于1GB的文件:
    find . -type f -size +1G

    查找空文件 并删除

    find ~ -empty
    find /path/to/dir -empty -type f -delete
    

    查找空目录 并删除

    find ~ -empty -type d
    find /path/to/dir -empty -type d -delete
    

    查找home目录中的所有文件

    find $HOME -print
    或
    find ~ -print

    查找当前目录中权限是644的文件

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

    查找系统中所有文件长度为0的普通文件,并列出它们的完整路径

    find / -type f -size 0 -exec ls -l {} \;

    查找/var/log/目录中更改时间在7日以前的普通文件(即保留最近7天的),并在删除之前询问

    find /var/log/ -type f -mtime +7 -ok rm {} \;

    查找/var/log目录中访问时间在7天以内的文件

    find /var/log/ -type f -mtime -7

    查找比某个文件更新的文件

    find -newer filename

    查找/var/log目录中messages.*.gz文件

    find /var/log/ -name "messages.*.gz"

    查找当前目录下,属组是root的文件

    find . -group root -exec ls -l {} \;

    对当前目录(包含子目录)进行排序

    find . -type d | sort

    与其他命令结合统计代码量

    find ./ -name '*' | xargs wc -l

    做一些漂亮的 alias 删除程序生成的临时文件或某种类型文件

    alias rmao="find . -iname a.out -exec rm {} \;"
    alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} \;"
    alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} \;"
    alias rm2g="find / -type f -name *.tar -size +2G -exec rm -i {} \;"
    alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} \;"