• Linux学习笔记


    内容总结:

    一、常用命令总结

    低级:ls ll lsblk cd pwd sudo su touch mkdir chmod chown  cp mv date cat cal tar apt uname history dd md5sum

    中级:find grep man ps kill jobs fg bg nohup [Common]& whereis service alias df du rm echo passwd lpr cmp wget mount gcc g++ java

    二、基本命令分类:

    1、了解基本bash,学习vim。

    虽然你有Emacs和Eclipse,但是VIM仍然是无出其右的利器。 了解SSH,基本的无密码验证方式。
    例如通过ssh-agent, ssh-add等。 《灵犀志趣》(http://www.lingcc.com/)平时都使用如下脚本完成无密码验证,省事省力。
    执行方式 sh nopasswd USER REMOTE_HOST
    执行此脚本前,请确认:
    • 本机上已有 id_dsa.pub ,若无。 使用命令 ssh-keygen -t dsa 获得。
    • 远程机上登录用户家目录下,已经有 .ssh 文件夹,若无创建之。

    $ cat  nopasswd

    #!/bin/sh

    scp ~/.ssh/id_dsa.pub  $1@$2:~/

    ssh $1@$2 " touch ~/.ssh/authorized_keys ; cat ~/id_dsa.pub  >> ~/.ssh/authorized_keys; cat ~/id_dsa.pub  >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys; exit2、熟悉Bash中常用的任务管理命令

    &,Ctrl-Z,Ctrl-C,jobs,fg,bg,kill 等。

    3、基本的文件管理命令

    ls, ls-l, less, head, tail, tail -f, ln, ln -s, chmod, chown, du, du -sk *, df, mount

    4、基本的网络管理命令

    ipconfig, ifconfig, dig

    5、熟悉正则表达式,以及 grep,egrep用到的选项

    -o, -A, -B

    6、软件安装命令了解

    apt-get 和 yum

    7、表达式学习

    !!
    再次执行上一条命令
    !$
    上一条命令的最后一个单词
    {a..b}
    按照从a到b顺序的一个数字列表
    {a,b,c}
    三个词a,b,c. 可以这样使用 touch /tmp/{foo,bar,baz}
    {$1-$9}
    执行shell脚本时的命令行参数
    $0
    正在执行的命令名称
    $#
    当前启动的命令中传入的参数个数
    $?
    上一条命令的执行返回值。
    $$
    该shell的进程号。
    $*
    从$1开始,启动该shell脚本的所有参数。

    8、日常技巧

    Ctrl-R
    在bash中, Ctrl-R用于在历史命令中搜索
    Ctrl-W, Ctrl-U, ALT + Backspace 删除光标前的一个词
    bash中,Ctrl-W删除最后一个词,Ctrl-U删除最后一行,Alt+BackSpace 删除光标前的一个词 man readline 中包含了大量bash中的默认热键绑定.
    cd -
    返回前一个工作路径
    xargs
    非常强大的命令。如果你还不确定是否能正确的执行任务,可以先用xargs echo查看。下面是一个用该功能的例子:

    find . -name *.py | xargs grep some_function

    cat hosts | xargs -l {} ssh root@{} hostname

    parallel一个更加强大的命令. 可以实现并行执行任务,并可以分割输入文件, 指定多个节点同时运行命令等功能.详细的功能可以参考http://www.biostars.org/p/63816/.
    pstree -p打用进程树的得力工具pgrep,pkill使用名字查找进程,或者直接向指定名字的进程发送信号。
    • 了解用户能发送给进程的一些信号。比如 kill -STOP [pid] ,让pid进程挂起。

    nohup,disown,screen, tmux当你需要将进程永远处在后台运行是,这两个命令很有用。lsof, netstat -lntp查询当前什么进程在监听什么端口。set在bash脚本中, 使用 set -x 获得debug输出,使用 set -e 获得错误输出。;分号用于开启一个子shell并运行至结束后关闭。 例如:

    #在当前路径下执行一些命令

    (cd /some/other/dir; other-command)

    # 工作路径仍然是当前目录

    了解shell中的多种参数表达式
    ${name:?error message}
    检查某个变量是否存在,若不存在输出 error message。
    ${var%suffix}, ${var#prefix}
    输出var变量除前缀或者后缀外的部分。如下面的代码输出为foo.txt.

    var = foo.pdf

    echo ${var%pdf}.txt

    <,>输入输出重定向操作。some_command > logfile 2>&1some_command 运行过程中的标准输出和标准错误输出都输出到文件logfile中。man ascii获得一个好用的ASCII表格,包含10进制和16进制的值。screen,dtach在远程ssh绘画中,使用这两个命令可以保存你的会话,避免因为网络问题导致中断。curl, curl -l, wget在web页面调试中,这几个命令能帮你下载网页代码,很有用。lynx -dump -stdin将HTML转换为文本xmlstarlet需要处理XML时,这个命令很有用。ssh -L, ssh -D需要利用远程服务器访问网页时,这命令可以帮助你在远程服务器和你的机器之间建立ssh 隧道。ssh连接优化如下配置能帮你避免链接丢失,不需要每次都输入yes确认和远程服务器的链接,以及在链接中启用压缩。建议将它放到.ssh/config中。

    TCPKeepAlive=yes

    ServerAliveInterval=15

    ServerAliveCountMax=6

    StrictHostKeyChecking=no

    Compression=yes

    ForwardAgent=yes

    在正输入的命令前加#
    命令已经输入一半,忽然间改主意想少收运行时,
    可以使用 Alt-# 在命令前加‘#’,将整个命令变成注释。这样你稍后就能在命令历史中找到该命令了。
    cron
    可以帮助你制定一些定时执行的计划任务。
    Ctrl-S Ctrl-C
    将一不小心需要大量输出文本时,依次输入这两个操作,
    比单纯的频繁按Ctrl-C能更快让程序终止。

    9、 数据处理

    sort,uniq, uniq -u, uniq -d
    了解这些排序命令
    cut,paste, join
    了解这些文本文件的维护工具。很多人都在使用cut后,忘记join
    使用sort/uniq进行集合的交、并、补运算=
    假设a和b是两个文本文件,其中的行都是唯一的。
    如下几个命令可以快速的实现一些集合操作。

    cat a b | sort | uniq > c   # c is a union b

    cat a b | sort | uniq -d > c   # c is a intersect b

    cat a b b | sort | uniq -u > c   # c is set difference a - b

    使用LC_ALL=CLinux中有关locale的设置会影响大量的命令行工具,其中包括排序工具。
    多数安装的Linux系统都将LANG或者其他的locale默认设置成US English。
    但这可能会导致排序及其他命令慢上好几倍。
    因此export LCALL=C能避免使用i18n形式处理数据,带来性能提升。awk,sed这两个工具能实现复杂的数据替换和修改。
    例如,下面的命令实现对文本文件中低三列的数据求总和。
    使用shell完成此运算比用Python快3倍。

    awk '{ x += $3 } END { print x }'

    shuf该命令可以从将一个文件中的行混洗,或者从中随机选出一些行。sort了解sort的常用选项(-t,-k, -s)如何工作。 注意-k1,1只会排序第一列,
    而-k1会根据整个行排序。 -s能实现稳定排序。
    例如,先使用第二个域排序,再按照域一排序,可以用这段命令实现

    cat INPUT_FILE | sort -k1,1  | sort -s -k2,2

    制表符的输入在bash的命令行中,如若需要输入制表符,可以使用 Ctrl-V <tab> 或者 $’ ’ 实现hd,bvi对于二进制文件,这两个命令分别实现16进制抽取,二进制编辑操作。strings,grep可以帮助在二进制文件中寻找文本。iconv,uconv可以帮助转换文本编码split,csplit分别可以实现将文件按照大小分割,以及按照特定的模式分割。

    10、系统调试

    iostat,netstat,top,atop,htop,dstat
    可以帮助了解硬盘,CPU,内存,网络的状态。
    这能帮你对系统正在发生的情况有个第一认识。
    free,vmstat
    如果想了解内存的状态,这两个命令很重要。
    其中cached是Linux内核中文件缓存的大小。
    kill -3 <pid>
    在调试Java程序时,使用此命令,可以在stderr/logs中找到完整的stack trace,
    堆信息(包含垃圾收集的细节).
    mtr,traceroute
    能够帮忙找到网络问题,前者比traceroute更好用。
    iftop,nethogs
    这两个命令可以办刚找出哪个端口或者进程占用了多少网络带宽。
    ab,siege
    这个Apache自带的工具能帮助快速检查web服务器的性能。
    wireshark,tshark
    是进行更高级的网络调试的得力工具。
    strace,ltrace
    这两个命令能帮你在一无所知的情况下,对程序运行失败,假死,崩溃等问题带来一些线索。
    另外,他们还能帮忙发现一些性能问题。比如 -c选项可以做profiling;
    -p选项可以挂到某个指定的进程上。
    ldd
    检查共享库的情况
    gdb
    了解如何利用GDB连接到一个正在运行的进程,并且得到其stack trace。
    /proc/
    在做现场调试的时候很有用。比如 /proc/cpuinfo, /proc/XXX/cwd, /proc/XXX/exe, /proc/XXX/fd/, /proc/XXX/smaps
    sar
    在需要判断为何过去某个时间系统会出错时,这个命令能显示CPU,内存和网络的历史情况。
    stap, perf
    当需要更深的分析系统,以及性能情况时,这两个工具很有用。
    dmesg
    当系统出现一些很反常的现象时,比如可能是硬件或驱动问题时,这个很管用。
    参考文章:http://blog.jobbole.com/46976/

    11、使用Shell脚本对Linux系统和进程资源进行监控

           检查进程是否存在

           在对进程进行监控时,我们一般需要得到该进程的 ID,进程 ID 是进程的唯一标识,但是有时可能在服务器上不同用户下运行着多个相同进程名的进程,下面的函数 GetPID 给出了获取指定用户下指定进程名的进程 ID 功能(目前只考虑这个用户下启动一个此进程名的进程),它有两个参数为用户名和进程名,它首先使用 ps 查找进程信息,同时通过 grep 过滤出需要的进程,最后通过 sed 和 awk 查找需要进程的 ID 值(此函数可根据实际情况修改,比如需要过滤其它信息等)。

          清单 1. 对进程进行监控

    function GetPID #User #Name

    {

        PsUser=$1

        PsName=$2

        pid=`ps -u $PsUser|grep $PsName|grep -v grep|grep -v vi|grep -v dbx

       |grep -v tail|grep -v start|grep -v stop |sed -n 1p |awk '{print $1}'`

       echo $pid

    }

    示例演示:
    1)源程序(例如查找用户为 root,进程名为 CFTestApp 的进程 ID)

    PID=`GetPID root CFTestApp`

    echo $PID

    2)结果输出

    11426

    [dyu@xilinuxbldsrv shell]$

    3)结果分析

    从上面的输出可见:11426 为 root 用户下的 CFTestApp 程序的进程 ID。

    4)命令介绍

    1. ps: 查看系统中瞬间进程信息。

    参数:-u< 用户识别码 > 列出属于该用户的程序的状况,也可使用用户名称来指定。

    -p< 进程识别码 > 指定进程识别码,并列出该进程的状况。

    -o 指定输出格式

    2. grep: 用于查找文件中符合字符串的当前行。

    参数:-v 反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行。

    3. sed: 一个非交互性文本编辑器,它编辑文件或标准输入导出的文件,一次只能处理一行内容。

    参数:-n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。

    p 标志 打印匹配行

    4. awk:一种编程语言,用于在 linux/unix 下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自

    定义函数和动态正则表达式等先进功能,是 linux/unix 下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk 的处理文本和数据的方式:它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出 ( 屏幕 ),如果没有指定模式,则所有被操作所指定的行都被处理。

    参数:-F fs or –field-separator fs :指定输入文件折分隔符,fs 是一个字符串或者是一个正则表达式,如 -F:。

    有时有可能进程没有启动,下面的功能是检查进程 ID 是否存在,如果此进程没有运行输出:

    The process does not exist.

    # 检查进程是否存在

    if [ "-$PID" == "-" ]

    then

    {

        echo "The process does not exist."

    }

    fi

    检测进程 CPU 利用率

    在对应用服务进行维护时,我们经常遇到由于 CPU 过高导致业务阻塞,造成业务中断的情况。CPU 过高可能由于业务量过负荷或者出现死循环等异常情况,通过脚本对业务进程 CPU 进行时时监控,可以在 CPU 利用率异常时及时通知维护人员,便于维护人员及时分析,定位,以及避免业务中断等。下面的函数可获得指定进程 ID 的进程 CPU 利用率。它有一个参数为进程 ID,它首先使用 ps 查找进程信息,同时通过 grep -v 过滤掉 %CPU 行,最后通过 awk 查找 CPU 利用百分比的整数部分(如果系统中有多个 CPU,CPU 利用率可以超过 100%)。

    清单 2. 对业务进程 CPU 进行实时监控

    function GetCpu

    {

        CpuValue=`ps -p $1 -o pcpu |grep -v CPU | awk '{print $1}' | awk - F. '{print $1}'`

        echo $CpuValue

    }

    下面的功能是通过上面的函数 GetCpu 获得此进程的 CPU 利用率,然后通过条件语句判断 CPU 利用率是否超过限制,如果超过 80%(可以根据实际情况进行调整),则输出告警,否则输出正常信息。

    清单 3. 判断 CPU 利用率是否超过限制

    function CheckCpu

    {

        PID=$1

        cpu=`GetCpu $PID`

        if [ $cpu -gt 80 ]

        then

        {

            echo “The usage of cpu is larger than 80%”

        }

        else

        {

            echo “The usage of cpu is normal”

       }

       fi

    }

    示例演示:

    1)源程序(假设上面已经查询出 CFTestApp 的进程 ID 为 11426)

    CheckCpu 11426

    2)结果输出

    The usage of cpu is 75

    The usage of cpu is normal

    [dyu@xilinuxbldsrv shell]$

    3)结果分析

    从上面的输出可见:CFTestApp 程序当前的 CPU 使用为 75%,是正常的,没有超过 80% 的告警限制。

    检测进程内存使用量

    在对应用服务进行维护时,也经常遇到由于内存使用过大导致进程崩溃,造成业务中断的情况(例如 32 位程序可寻址的最大内存空间为 4G,如果超出将申请内存失败,同时物理内存也是有限的)。内存使用过高可能由于内存泄露,消息堆积等情况,通过脚本对业务进程内存使用量进行时时监控,可以在内存使用量异常时及时发送告警(例如通过短信),便于维护人员及时处理。下面的函数可获得指定进程 ID 的进程内存使用情况。它有一个参数为进程 ID,它首先使用 ps 查找进程信息,同时通过 grep -v 过滤掉 VSZ 行 , 然后通过除 1000 取以兆为单位的内存使用量。

    清单 4. 对业务进程内存使用量进行监控

    function GetMem

    {

        MEMUsage=`ps -o vsz -p $1|grep -v VSZ`

        (( MEMUsage /= 1000))

        echo $MEMUsage

    }

    下面的功能是通过上面的函数 GetMem获得此进程的内存使用,然后通过条件语句判断内存使用是否超过限制,如果超过 1.6G(可以根据实际情况进行调整),则输出告警,否则输出正常信息。

    清单 5. 判断内存使用是否超过限制

    mem=`GetMem $PID`

    if [ $mem -gt 1600 ]

    then

    {

        echo “The usage of memory is larger than 1.6G”

    }

    else

    {

        echo “The usage of memory is normal”

    }

    fi

    示例演示:

    1)源程序(假设上面已经查询出 CFTestApp 的进程 ID 为 11426)

    mem=`GetMem 11426`

    echo "The usage of memory is $mem M"

    if [ $mem -gt 1600 ]

    then

    {

        echo "The usage of memory is larger than 1.6G"

    }

    else

    {

        echo "The usage of memory is normal"

    }

    fi

    2)结果输出

    The usage of memory is 248 M

    The usage of memory is normal

    [dyu@xilinuxbldsrv shell]$

    3)结果分析

    从上面的输出可见:CFTestApp 程序当前的内存使用为 248M,是正常的,没有超过 1.6G 的告警限制。

    检测进程句柄使用量

    在对应用服务进行维护时,也经常遇到由于句柄使用 过量导致业务中断的情况。每个平台对进程的句柄使用都是有限的,例如在 Linux 平台,我们可以使用 ulimit – n 命令(open files (-n) 1024)或者对 /etc/security/limits.conf 的内容进行查看,得到进程句柄限制。句柄使用过高可能由于负载过高,句柄泄露等情况,通过脚本对业务进程句柄使用量进行时时监控,可以在异常时及时发送告警(例如通过短信),便于维护人员及时处理。下面的函数可获得指定进程 ID 的进程句柄使用情况。它有一个参数为进程 ID,它首先使用 ls 输出进程句柄信息,然后通过 wc -l 统计输出句柄个数。

    function GetDes

    {

        DES=`ls /proc/$1/fd | wc -l`

        echo $DES

    }

    下面功能是通过上面的函数 GetDes获得此进程的句柄使用量,然后通过条件语句判断句柄使用是否超过限制,如果超过 900(可以根据实际情况进行调整)个,则输出告警,否则输出正常信息。

    des=` GetDes $PID`

    if [ $des -gt 900 ]

    then

    {

        echo “The number of des is larger than 900”

    }

    else

    {

        echo “The number of des is normal”

    }

    fi

    示例演示:

    1)源程序(假设上面查询出 CFTestApp 的进程 ID 为 11426)

    des=`GetDes 11426`

    echo "The number of des is $des"

    if [ $des -gt 900 ]

    then

    {

        echo "The number of des is larger than 900"

    }

    else

    {

        echo "The number of des is normal"

    }

    fi

    2)结果输出

    The number of des is 528

    The number of des is normal

    [dyu@xilinuxbldsrv shell]$

    3)结果分析

    从上面的输出可见:CFTestApp 程序当前的句柄使用为 528 个,是正常的,没有超过 900 个的告警限制。

    4)命令介绍

    wc: 统计指定文件中的字节数、字数、行数 , 并将统计结果显示输出。

    参数:-l 统计行数。

    -c 统计字节数。

    -w 统计字数。

    使用 Shell 对系统资源进行监控

    查看某个 TCP 或 UDP 端口是否在监听

    端口检测是系统资源检测经常遇到的,特别是在网络通讯情况下,端口状态的检测往往是很重要的。有时可能进程,CPU,内存等处于正常状态,但是端口处于异常状态,业务也是没有正常运行。下面函数可判断指定端口是否在监听。它有一个参数为待检测端口,它首先使用 netstat 输出端口占用信息,然后通过 grep, awk,wc 过滤输出监听 TCP 端口的个数,第二条语句为输出 UDP 端口的监听个数,如果 TCP 与 UDP 端口监听都为 0,返回 0,否则返回 1.

    清单 6. 端口检测

    function Listening

    {

        TCPListeningnum=`netstat -an | grep ":$1 " |

        awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l`

        UDPListeningnum=`netstat -an|grep ":$1 "

        |awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' | wc -l`

        (( Listeningnum = TCPListeningnum + UDPListeningnum ))

        if [ $Listeningnum == 0 ]

       then

       {

           echo "0"

        }

        else

       {

           echo "1"

       }

       fi

    }

    示例演示:

    1)源程序(例如查询 8080 端口的状态是否在监听)

    isListen=`Listening 8080`

    if [ $isListen -eq 1 ]

    then

    {

       echo "The port is listening"

    }

    else

    {

       echo "The port is not listening"

    }

    fi

    2)结果输出

    The port is listening

    [dyu@xilinuxbldsrv shell]$

    3)结果分析

    从上面的输出可见:这个 Linux 服务器的 8080 端口处在监听状态。

    4)命令介绍

    netstat: 用于显示与 IP、TCP、UDP 和 ICMP 协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

    参数:-a 显示所有连线中的 Socket。

    -n 直接使用 IP 地址,而不通过域名服务器。

    下面的功能也是检测某个 TCP 或者 UDP 端口是否处在正常状态。

    tcp: netstat -an|egrep $1 |awk '$6 == "LISTEN" && $1 == "tcp" {print $0}'

    udp: netstat -an|egrep $1 |awk '$1 == "udp" && $5 == "0.0.0.0:*" {print $0}'

    命令介绍

    egrep: 在文件内查找指定的字符串。egrep 执行效果如 grep -E,使用的语法及参数可参照 grep 指令,与 grep 不同点在于解读字符串的方法,egrep 是用扩展的正则表达式语法来解读,而 grep 则用基本的正则表达式语法,扩展的正则表达式比基本的正则表达式有更完整的表达规范。

    查看某个进程名正在运行的个数

    有时我们可能需要得到服务器上某个进程的启动个数,下面的功能是检测某个进程正在运行的个数,例如进程名为 CFTestApp。

    Runnum=`ps -ef | grep -v vi | grep -v tail | grep "[ /]CFTestApp" | grep -v grep | wc -l

    检测系统 CPU 负载

    在对服务器进行维护时,有时也遇到由于系统 CPU(利用率)负载 过量导致业务中断的情况。服务器上可能运行多个进程,查看单个进程的 CPU 都是正常的,但是整个系统的 CPU 负载可能是异常的。通过脚本对系统 CPU 负载进行时时监控,可以在异常时及时发送告警,便于维护人员及时处理,预防事故发生。下面的函数可以检测系统 CPU 使用情况 . 使用 vmstat 取 5 次系统 CPU 的 idle 值,取平均值,然后通过与 100 取差得到当前 CPU 的实际占用值。

    function GetSysCPU

    {

        CpuIdle=`vmstat 1 5 |sed -n '3,$p'

        |awk '{x = x + $15} END {print x/5}' |awk -F. '{print $1}'

        CpuNum=`echo "100-$CpuIdle" | bc`

        echo $CpuNum

    }

    示例演示:

    1)源程序

    cpu=`GetSysCPU`

    echo "The system CPU is $cpu"

    if [ $cpu -gt 90 ]

    then

    {

        echo "The usage of system cpu is larger than 90%"

    }

    else

    {

        echo "The usage of system cpu is normal"

    }

    fi

    2)结果输出

    The system CPU is 87

    The usage of system cpu is normal

    [dyu@xilinuxbldsrv shell]$

    3)结果分析

    从上面的输出可见:当前 Linux 服务器系统 CPU 利用率为 87%,是正常的,没有超过 90% 的告警限制。

    4)命令介绍

    vmstat:Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU 活动进行监视。

    参数: -n 表示在周期性循环输出时,输出的头部信息仅显示一次。

    检测系统磁盘空间

    系统磁盘空间检测是系统资源检测的重要部分,在系统维护维护中,我们经常需要查看服务器磁盘空间使用情况。因为有些业务要时时写话单,日志,或者临时文件等,如果磁盘空间用尽,也可能会导致业务中断,下面的函数可以检测当前系统磁盘空间中某个目录的磁盘空间使用情况 . 输入参数为需要检测的目录名,使用 df 输出系统磁盘空间使用信息,然后通过 grep 和 awk 过滤得到某个目录的磁盘空间使用百分比。

    function GetDiskSpc

    {

        if [ $# -ne 1 ]

        then

        return 1

        fi

        Folder="$1$"

        DiskSpace=`df -k |grep $Folder |awk '{print $5}' |awk -F% '{print $1}'

        echo $DiskSpace

    }

    示例演示:

    1)源程序(检测目录为 /boot)

    Folder="/boot"

    DiskSpace=`GetDiskSpc $Folder`

    echo "The system $Folder disk space is $DiskSpace%"

    if [ $DiskSpace -gt 90 ]

    then

    {

        echo "The usage of system disk($Folder) is larger than 90%"

    }

    else

    {

        echo "The usage of system disk($Folder) is normal"

    }

    fi

    2)结果输出

    The system /boot disk space is 14%

    The usage of system disk(/boot) is normal

    [dyu@xilinuxbldsrv shell]$

    3)结果分析

    从上面的输出可见:当前此 Linux 服务器系统上 /boot 目录的磁盘空间已经使用了 14%,是正常的,没有超过使用 90% 的告警限制。

    4)命令介绍

    df:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

    参数:-k 以 k 字节为单位显示。

    总结

    在 Linux 平台下,shell 脚本监控是一个非常简单,方便,有效的对服务器,进程进行监控的方法,对系统开发以及进程维护人员非常有帮助。它不仅可以对上面的信息进行监控,发送告警,同时也可以监控进程的日志等等的信息,希望本文对大家有帮助。

    参考文章:http://blog.jobbole.com/22318/

    三、深入学习命令

    1. ls命令:列出目录内容(List Directory Contents)的意思。运行它就是列出文件夹里的内容,可能是文件也可能是文件夹。

        ls –l 命令以详情模式(long listing fashion)列出文件夹的内容。ls -l 命令输出:

        • d (代表了是目录).
        • rwxr-xr-x 是文件或者目录对所属用户,同一组用户和其它用户的权限。
        • 上面例子中第一个ravisaive 代表了文件文件属于用户ravisaive
        • 上面例子中的第二个ravisaive代表了文件文件属于用户组ravisaive
        • 4096 代表了文件大小为4096字节.
        • May 8 01:06 代表了文件最后一次修改的日期和时间.
        • 最后面的就是文件/文件夹的名字

        ls –a 命令会列出文件夹里的所有内容,包括以”.”开头的隐藏文件。

                注意:在Linux中,文件以“.”开头的就是隐藏文件,并且每个文件,文件夹,设备或者命令都是以文件对待。

      扩展:

      ll 是 ls –la命令的别名

      lsblk 就是列出块设备。除了RAM外,以标准的树状输出格式,整齐地显示块设备。

      lsblk –l 命令以列表格式显示块设备(而不是树状格式)。

               注意:lsblk是最有用和最简单的方式来了解新插入的USB设备的名字,特别是当你在终端上处理磁盘/块设备时。

      更多ls命令例子参考:http://www.tecmint.com/15-basic-ls-command-examples-in-linux/

    2. cd 命令:代表了改变目录。它在终端中改变工作目录来执行,复制,移动,读,写等等操作。

    注意: 在终端中切换目录时,cd就大显身手了。

    cd ~ 会改变工作目录为用户的家目录,而且当用户发现自己在终端中迷失了路径时,非常有用;

    cd .. 从当前工作目录切换到(当前工作目录的)父目录,即上层目录;

    cd . 表示当前目录(注意一个点和两个点的区别);

    cd / 表示切换到根目录。

    3. pwd 命令(print working directory):在终端中显示当前工作目录的全路径。

    root@tecmint:~# pwd

    /home/user/Desktop

    注意: 这个命令并不会在脚本中经常使用,但是对于新手,当从连接到nux很久后在终端中迷失了路径,这绝对是救命稻草。

    4. sudo (super user do) 命令:允许授权用户执行超级用户或者其它用户的命令。通过在sudoers列表的安全策略来指定。

      注意:sudo 允许用户借用超级用户的权限,然而 su 命令实际上是允许用户以超级用户登录。所以sudo比su更安全。并不建议使用sudo或者su来处理日常用途,因为它可能导致严重的错误如果你意外的做错了事。

    su [username] 切换用户

    5. touch 命令:创建新文件,代表了将文件的访问和修改时间更新为当前时间。touch命令只会在文件不存在的时候才会创建它。如果文件已经存在了,它会更新时间戳,但是并不会改变文件的内容。

    注意:touch 可以用来在用户拥有写权限的目录下创建不存在的文件。

    6. mkdir (Make directory) 命令: 在命名路径下创建新的目录。然而如果目录已经存在了,那么它就会返回一个错误信息”不能创建文件夹,文件夹已经存在了.

    注意:目录只能在用户拥有写权限的目录下才能创建。如mkdir:不能创建目录`tecmint`,因为文件已经存在了。(上面的输出中不要被文件迷惑了,你应该记住在linux中,文件,文件夹,驱动,命令,脚本都视为文件)。

    7. chmod 命令表示改变文件的权限,就是改变文件的模式位。chmod会根据要求的模式来改变每个所给的文件,文件夹,脚本等等的文件模式(权限)。在文件(文件夹或者其它,为了简单起见,我们就使用文件)中存在3种类型的权限:

    • Read (r)=4
    • Write(w)=2
    • Execute(x)=1

    所以如果你想给文件只读权限,就设置为4;只写权限,设置权限为2;只执行权限,设置为1; 读写权限,就是4+2 = 6, 以此类推。

    现在需要设置3种用户和用户组权限。第一个是拥有者,然后是用户所在的组,最后是其它用户。

    如:rwxr-x--x   abc.sh

    这里root的权限是 rwx(读写和执行权限),所属用户组权限是 r-x (只有读写权限, 没有写权限)对于其它用户权限是 -x(只有只执行权限)

    为了改变它的权限,为拥有者,用户所在组和其它用户提供读,写,执行权限,即:chmod 777 abc.sh

    三种都只有读写权限,即:chmod 666 abc.sh

    拥有者用户有读写和执行权限,用户所在的组和其它用户只有可执行权限,即:chmod 711 abc.sh

    注意:对于系统管理员和用户来说,这个命令是最有用的命令之一了。在多用户环境或者服务器上,对于某个用户,如果设置了文件不可访问,那么这个命令就可以解决,如果设置了错误的权限,那么也就提供了为授权的访问。常用chmod 777 * -R为该层目录及其以下层次所有文件的拥有者、用户所在组和其它用户提供读写执行命令。

    8. chown 命令就是改变文件拥有者和所在用户组。每个文件都属于一个用户组和一个用户。在你的目录下,使用”ls -l”,你就会看到像这样的东西。

    root@tecmint:~# ls -l

    drwxr-xr-x 3 server root 4096 May 10 11:14 Binary

    drwxr-xr-x 2 server server 4096 May 13 09:42 Desktop

    在这里,目录Binary属于用户”server”,和用户组”root”,而目录”Desktop”属于用户“server”和用户组”server”,“chown”命令用来改变文件的所有权,所以仅仅用来管理和提供文件的用户和用户组授权。使用格式:chown [新的用户]:[新的用户组] [文件名]

    root@tecmint:~# chown server:server Binary

    drwxr-xr-x 3 server server 4096 May 10 11:14 Binary

    drwxr-xr-x 2 server server 4096 May 13 09:42 Desktop

    注意:“chown”所给的文件改变用户和组的所有权到新的拥有者或者已经存在的用户或者用户组。

    9. cp 命令:(copy)就是复制。它会从一个地方复制一个文件到另外一个地方。使用格式:cp [-r(表递归)] [源文件或源目录] [目标目录]

    root@tecmint:~# cp /home/user/Downloads abc.tar.gz /home/user/Desktop (Return 0 when sucess)

    注意: cp,在shell脚本中是最常用的一个命令,而且它可以使用通配符(在前面一块中有所描述),来定制所需的文件的复制。

    10. mv 命令:将一个地方的文件移动到另外一个地方去。使用格式:mv [-r(表递归)] [源文件或源目录] [目标目录]

    root@tecmint:~# mv /home/user/Downloads abc.tar.gz /home/user/Desktop (Return 0 when sucess)

    注意:mv 命令可以使用通配符。mv需谨慎使用,因为易懂系统的或者未授权的文件不但会导致安全性问题,而且可能系统崩溃。

    11. date 命令使用标准的输出打印当前的日期和时间,也可以深入设置。

    root@tecmint:~# date

    Fri May 17 14:13:29 IST 2013

    root@tecmint:~# date --set='14 may 2013 13:57'

    Mon May 13 13:57:00 IST 2013

    注意:这个命令在脚本中十分有用,以及基于时间和日期的脚本更完美。而且在终端中改变日期和时间,让你更专业!!!(当然你需要root权限才能操作这个,因为它是系统整体改变)

    12. cat 命令:代表了连结(Concatenation),连接两个或者更多文本文件或者以标准输出形式打印文件的内容。

    root@tecmint:~# cat a.txt b.txt c.txt d.txt abcd.txt

    root@tecmint:~# cat abcd.txt

    ....

    contents of file abcd

    ...

    注意:“>>”和“>”调用了追加符号。它们用来追加到文件里,而不是显示在标准输出上“>”符号会删除已存在的文件,然后创建一个新的文件。所以因为安全的原因,建议使用“>>”,它会写入到文件中,而不是覆盖或者删除。例如:ls>result.txt 表示将ls显示的当前目录下的内容写到一个新的文件下,文件名为result.txt

    在深入探究之前,我必须让你知道通配符(你应该知道通配符,它出现在大多数电视选秀中)。通配符是shell的特色,和任何GUI文件管理器相比,它使命令行更强大有力!如你所看到那样,在一个图形文件管理器中,你想选择一大组文件,你通常不得不使用你的鼠标来选择它们。这可能觉得很简单,但是事实上,这种情形很让人沮丧!

    例如,假如你有一个有很多很多各种类型的文件和子目录的目录,然后你决定移动所有文件名中包含“Linux”字样的HTML文件到另外一个目录。如何简单的完成这个?如果目录中包含了大量的不同名的HTML文件,你的任务很巨大,而不是简单了。

    在LInux CLI中,这个任务就很简单,就好像只移动一个HTML文件,因为有shell的通配符,才会如此简单。这些是特殊的字符,允许你选择匹配某种字符模式的文件名。它帮助你来选择,即使是大量文件名中只有几个字符,而且在大多数情形中,它比使用鼠标选择文件更简单。

    这里就是常用通配符列表:

    Wildcard Matches

    *                   零个或者更多字符

    ?                   恰好一个字符

    [abcde]             恰好列举中的一个字符

    [a-e]               恰好在所给范围中的一个字符

    [!abcde]            任何字符都不在列举中

    [!a-e]              任何字符都不在所给的范围中

    {debian,linux}      恰好在所给选项中的一整个单词

    ! 叫做非,带’!’的反向字符串为真

    注意:cat -n 可以帮助显示行号。

        更多请阅读Linux cat 命令的实例:http://www.tecmint.com/13-basic-cat-command-examples-in-linux/

    13.  cal 命令:(Calender),它用来显示当前月份或者未来或者过去任何年份中的月份。

    root@tecmint:~# cal

    May 2013       

    Su Mo Tu We Th Fr Sa 

    1  2  3  4 

    5  6  7  8  9 10 11 

    12 13 14 15 16 17 18 

    19 20 21 22 23 24 25 

    26 27 28 29 30 31

    显示已经过去的月份,1835年2月

    root@tecmint:~# cal 02 1835

    February 1835

    Su Mo Tu We Th Fr Sa 

    1 2 3 4 5 6 7

    8 9 10 11 12 13 14

    15 16 17 18 19 20 21

    22 23 24 25 26 27 28

    显示未来的月份,2145年7月。

    root@tecmint:~# cal 07 2145

    July 2145

    Su Mo Tu We Th Fr Sa 

    1 2 3

    4 5 6 7 8 9 10

    11 12 13 14 15 16 17

    18 19 20 21 22 23 24

    25 26 27 28 29 30 31

    注意: 你不需要往回调整日历50年,既不用复杂的数据计算你出生那天,也不用计算你的生日在哪天到来,因为它的最小单位是月,而不是日。

    14. tar 命令是磁带归档(Tape Archive),对创建一些文件的的归档和它们的解压很有用。

    root@tecmint:~# tar -xvf abc.tar(记住'v'代表了显示压缩或解压过程)

    root@tecmint:~# tar -zxvf abc.tar.gz (记住'z'代表了.tar.gz)

    root@tecmint:~# tar -jxvf abc.tar.bz2 (记住'j'代表了.tar.bz2)

    root@tecmint:~# tar -cvf archieve.tar.gz(.bz2) /path/to/folder/abc

    注意: “tar.gz“代表了使用gzip归档,“bar.bz2”使用bzip压缩的,它压缩的更好但是也更慢。

    下面对于tar系列的压缩文件作一个小结:
    (1)对于.tar结尾的文件
    tar -xf all.tar
    (2)对于.gz结尾的文件
    gzip -d all.gz
    gunzip all.gz
    (3)对于.tgz或.tar.gz结尾的文件
    tar -xzf all.tar.gz
    tar -xzf all.tgz
    (4)对于.bz2结尾的文件
    bzip2 -d all.bz2
    bunzip2 all.bz2
    (5)对于tar.bz2结尾的文件
    tar -xjf all.tar.bz2
    (6)对于.Z结尾的文件
    uncompress all.Z
    (7)对于.tar.Z结尾的文件
    tar -xZf all.tar.z

    另外对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们:
    (1)对于.zip
    linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序。它们的参
    数选项很多,这里只做简单介绍,依旧举例说明一下其用法:
    zip all.zip *.jpg
    这条命令是将所有.jpg的文件压缩成一个zip包 
          unzip all.zip
    这条命令是将all.zip中的所有文件解压出来
    (2)对于.rar
    要在linux下处理.rar文件,需要安装RAR for Linux,可以从网上下载,但要记住,RAR for Linux 不是免费的;可从http://www.rarsoft.com/download.htm下载RARfor Linux 3.2. 0,然后安装:
    tar -xzpvf rarlinux-3.2.0.tar.gz
    cd rar
    make
    这样就安装好了,安装后就有了rar和unrar这两个程序,rar是压缩程序,unrar 是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

    rar a all *.jpg
    这条命令是将所有.jpg的文件压缩成一个rar包,名为all.rar,该程序会将.rar
    扩展名将自动附加到包名后。
    unrar e all.rar
    这条命令是将all.rar中的所有文件解压出来
    到此为至,我们已经介绍过linux下的tar、gzip、gunzip、bzip2、bunzip2、compress 、 uncompress、 zip、unzip、rar、unrar等程式,你应该已经能够使用它们对.tar 、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、. Z、.tar.Z、.zip、.rar这10种压缩文
    件进行解压了,以后应该不需要为下载了一个软件而不知道如何在Linux下解开而烦恼了。而且以上方法对于Unix也基本有效。

    了解更多”tar 命令”的例子,请查看:http://www.tecmint.com/18-tar-command-examples-in-linux/

    15. apt 命令:Debian系列以“apt”命令为基础,“apt”代表了Advanced Package Tool。APT是一个为Debian系列系统(Ubuntu,Kubuntu等等)开发的高级包管理器,在Gnu/Linux系统上,它会为包自动地,智能地搜索,安装,升级以及解决依赖。

    root@tecmint:~# apt-get install mplayer

    root@tecmint:~# apt-get update

    注意:上面的命令会导致系统整体的改变,所以需要root密码(查看提示符为”#”,而不是“$”).和yum命令相比,Apt更高级和智能。见名知义,apt-cache用来搜索包中是否包含子包mplayer, apt-get用来安装,升级所有的已安装的包到最新版。

      关于apt-get 和 apt-cache命令更多信息,请查看:http://www.tecmint.com/useful-basic-commands-of-apt-get-and-apt-cache-for-package-management/

    16. uname 命令:就是Unix Name的简写。显示机器名,操作系统和内核的详细信息。

    root@tecmint:~# uname -a

    Linux tecmint 3.8.0-19-generic #30-Ubuntu SMP Wed May 1 16:36:13 UTC 2013 i686 i686 i686 GNU/Linux

    注意: uname显示内核类别, uname -a显示详细信息。上面的输出详细说明了uname -a

    1. “Linux“: 机器的内核名
    2. “tecmint“: 机器的分支名
    3. “3.8.0-19-generic“: 内核发布版本
    4. “#30-Ubuntu SMP“: 内核版本
    5. “i686“: 处理器架构
    6. “GNU/Linux“: 操作系统名
    17. history 命令:就是历史记录。它显示了在终端中所执行过的所有命令的历史。

    root@tecmint:~# history

    sudo add-apt-repository ppa:tualatrix/ppa

    sudo apt-get update

    sudo apt-get install ubuntu-tweak

    sudo add-apt-repository ppa:diesch/testing

    执行历史第3条命令可以用:

    root@tecmint:~# !3

    注意:按住“CTRL + R”就可以搜索已经执行过的命令,它可以在你写命令时自动补全,也可以用Tab键进行自动补全

    (reverse-i-search)`if': ifconfig

    18. dd 命令:代表了转换和复制文件。可以用来转换和复制文件,大多数时间是用来复制iso文件(或任何其它文件)到一个usb设备(或任何其它地方)中去,所以可以用来制作USB启动器。

    root@tecmint:~# dd if=/home/user/Downloads/debian.iso of=/dev/sdb1 bs=512M; sync

    注意:在上面的例子中,usb设备就是sdb1(你应该使用lsblk命令验证它,否则你会重写你的磁盘或者系统),请慎重使用磁盘的名,切忌。

    dd 命令在执行中会根据文件的大小和类型 以及 usb设备的读写速度,消耗几秒到几分钟不等。

    19. md5sum 命令:就是计算和检验MD5信息签名。md5 checksum(通常叫做哈希)使用匹配或者验证文件的文件的完整性,因为文件可能因为传输错误,磁盘错误或者无恶意的干扰等原因而发生改变。

    root@tecmint:~# md5sum teamviewer_linux.deb

    47790ed345a7b7970fc1f2ac50c97002  teamviewer_linux.deb

    注意:用户可以使用官方提供的和md5sum生成签名信息匹对以此检测文件是否改变。Md5sum没有sha1sum安全。

    1-19命令参考文章:http://blog.jobbole.com/45335/

    20.  find 命令:搜索指定目录下的文件,从开始于父目录,然后搜索子目录。

    root@tecmint:~# find -name *.sh

    ./Desktop/load.sh

    ./Desktop/test.sh

    ./Desktop/shutdown.sh

    ./Binary/firefox/run-mozilla.sh

    ./Downloads/kdewebdev-3.5.8/quanta/scripts/externalpreview.sh

    ./Downloads/kdewebdev-3.5.8/admin/doxygen.sh

    ./Downloads/kdewebdev-3.5.8/admin/cvs.sh

    ./Downloads/kdewebdev-3.5.8/admin/ltmain.sh

    ./Downloads/wheezy-nv-install.sh

    注意: `-name‘选项是搜索大小写敏感。可以使用`-iname‘选项,这样在搜索中可以忽略大小写。(*是通配符,可以搜索所有的文件;‘.sh‘你可以使用文件名或者文件名的一部分来制定输出结果,最后可以添加一项搜索的目录,如:find -name *.sh /home)

    root@tecmint:~# find -iname *.SH ( find -iname *.Sh /  find -iname *.sH)

    ./Desktop/load.sh

    ./Desktop/test.sh

    ./Desktop/shutdown.sh

    ./Binary/firefox/run-mozilla.sh

    ./Downloads/kdewebdev-3.5.8/quanta/scripts/externalpreview.sh

    ./Downloads/kdewebdev-3.5.8/admin/doxygen.sh

    ./Downloads/kdewebdev-3.5.8/admin/cvs.sh

    ./Downloads/kdewebdev-3.5.8/admin/ltmain.sh

    ./Downloads/wheezy-nv-install.sh

      find命令的更详细信息请参考http://www.tecmint.com/35-practical-examples-of-linux-find-command/

    21. grep 命令:搜索指定文件中包含给定字符串或者单词的行。举例搜索‘/etc/passwd‘文件中的‘tecmint’

    root@tecmint:~# grep tecmint /etc/passwd

    tecmint:x:1000:1000:Tecmint,,,:/home/tecmint:/bin/bash

    使用 “-i ” 选项将忽略大小写,其他命令也同理。

    root@tecmint:~# grep -i TECMINT /etc/passwd

    tecmint:x:1000:1000:Tecmint,,,:/home/tecmint:/bin/bash

    使用 “-r ” 选项递归搜索所有自目录下包含字符串 “127.0.0.1“.的行,其他命令也同理。

    root@tecmint:~# grep -r "127.0.0.1" /etc/

    /etc/vlc/lua/http/.hosts:127.0.0.1

    /etc/speech-dispatcher/modules/ivona.conf:#IvonaServerHost "127.0.0.1"

    /etc/mysql/my.cnf:bind-address      = 127.0.0.1

    /etc/apache2/mods-available/status.conf:    Allow from 127.0.0.1 ::1

    /etc/apache2/mods-available/ldap.conf:    Allow from 127.0.0.1 ::1

    /etc/apache2/mods-available/info.conf:    Allow from 127.0.0.1 ::1

    /etc/apache2/mods-available/proxy_balancer.conf:#    Allow from 127.0.0.1 ::1

    /etc/security/access.conf:#+ : root : 127.0.0.1

    /etc/dhcp/dhclient.conf:#prepend domain-name-servers 127.0.0.1;

    /etc/dhcp/dhclient.conf:#  option domain-name-servers 127.0.0.1;

    /etc/init/network-interface.conf:   ifconfig lo 127.0.0.1 up || true

    /etc/java-6-openjdk/net.properties:# localhost & 127.0.0.1).

    /etc/java-6-openjdk/net.properties:# http.nonProxyHosts=localhost|127.0.0.1

    /etc/java-6-openjdk/net.properties:# localhost & 127.0.0.1).

    /etc/java-6-openjdk/net.properties:# ftp.nonProxyHosts=localhost|127.0.0.1

    /etc/hosts:127.0.0.1    localhost

    注意:您还可以使用以下选项:

    1 -w搜索单词 (egrep -w ‘word1|word2‘ /path/to/file).

    2 -c用于统计满足要求的行 (i.e., total number of times the pattern matched) (grep -c ‘word‘ /path/to/file).

    3 –color彩色输出 (grep –color server /etc/passwd).

    22. man命令:系统帮助页。Man提供命令所有选项及用法的在线文档。几乎所有的命令都有它们的帮助页,例如:

    root@tecmint:~# man man

    MAN(1)                                                               Manual pager utils                                                              MAN(1)

    NAME

    man - an interface to the on-line reference manuals

    SYNOPSIS

    man  [-C  file]  [-d]  [-D]  [--warnings[=warnings]]  [-R  encoding]  [-L  locale]  [-m  system[,...]]  [-M  path]  [-S list] [-e extension] [-i|-I]

    [--regex|--wildcard] [--names-only] [-a] [-u] [--no-subpages] [-P pager] [-r prompt] [-7] [-E encoding] [--no-hyphenation] [--no-justification]  [-p

    string] [-t] [-T[device]] [-H[browser]] [-X[dpi]] [-Z] [[section] page ...] ...

    man -k [apropos options] regexp ...

    man -K [-w|-W] [-S list] [-i|-I] [--regex] [section] term ...

    man -f [whatis options] page ...

    man -l [-C file] [-d] [-D] [--warnings[=warnings]] [-R encoding] [-L locale] [-P pager] [-r prompt] [-7] [-E encoding] [-p string] [-t] [-T[device]]

    [-H[browser]] [-X[dpi]] [-Z] file ...

    man -w|-W [-C file] [-d] [-D] page ...

    man -c [-C file] [-d] [-D] page ...

    man [-hV]

    上面是man命令的系统帮助页,类似的有cat和ls的帮助页。

    注意:系统帮助页是为了命令的使用和学习而设计的。

    23. ps 命令:给出正在运行的某个进程的状态,每个进程有特定的id成为PID。

    ps 命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令了.

    注意:ps是显示瞬间进程的状态,并不动态连续;如果想对进程进行实时监控应该用top命令

    参数:

    a  显示所有进程
    -a 显示同一终端下的所有程序
    -A 显示所有进程
    c  显示进程的真实名称
    -N 反向选择
    -e 等于“-A”
    e  显示环境变量
    f  树状显示,显示程序间的关系
    -H 显示树状结构
    r  显示当前终端的进程
    T  显示当前终端的所有程序
    u  指定用户的所有进程
    -au 显示较详细的资讯
    -aux 显示所有包含其他使用者的行程
    -C<命令> 列出指定命令的状况
    --lines<行数> 每页显示的行数
    --width<字符数> 每页显示的字符数
    --help 显示帮助信息
    --version 显示版本显示

    常用格式:ps -aux(以BSD风格显示进程)或者 ps –efH (以System V风格显示进程) 或者 ps -ef

    特别说明:

    由于 ps 能够支持的系统类型相当的多,所以他的参数多的离谱!

    而且有没有加上 - 差很多!详细的用法应该要参考 man ps 喔!

    例1:ps –l 将目前属于您自己这次登入的 PID 与相关信息列示出来

    # 各相关信息的意义为:

    # F 代表这个程序的旗标 (flag), 4 代表使用者为 superuser;

    # S 代表这个程序的状态 (STAT);

    #UID 代表执行者身份

    # PID 进程的ID号!底下的 PPID 则父进程的ID;

    # C CPU 使用的资源百分比

    # PRI指进程的执行优先权(Priority的简写),其值越小越早被执行;

    # NI 这个进程的nice值,其表示进程可被执行的优先级的修正数值。

    # ADDR 这个是内核函数,指出该程序在内存的那个部分。如果是个执行

    # 的程序,一般就是『 - 』

    # SZ 使用掉的内存大小;

    # WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作;

    # TTY 登入者的终端机位置啰;

    # TIME 使用掉的 CPU 时间。

    # CMD 所下达的指令名称

    例2:ps aux 列出目前所有的正在内存当中的程序

    • USER:该进程属于那个使用者账号的?

    • PID :该进程的进程ID号。

    • %CPU:该进程使用掉的 CPU 资源百分比;

    • %MEM:该进程所占用的物理内存百分比;

    • VSZ :该进程使用掉的虚拟内存量 (Kbytes)

    • RSS :该进程占用的固定的内存量 (Kbytes)

    • TTY :该进程是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。

    • STAT:该程序目前的状态,主要的状态有:

       R :该程序目前正在运作,或者是可被运作;

       S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒。

       T :该程序目前正在侦测或者是停止了;

       Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态

    • START:该进程被触发启动的时间;

    • TIME :该进程实际使用 CPU 运作的时间。

    • COMMAND:该程序的实际指令为什么?

    例3:以例一的显示内容,显示出所有的程序

    例4:列出类似程序树的程序显示

    例5:找出与 cron 与 syslog 这两个服务有关的 PID 号码

    其他实例:
    1. 可以用 | 管道和 more 连接起来分页查看
    命令:ps -aux |more

    2. 把所有进程显示出来,并输出到ps001.txt文件
    命令:ps -aux > ps001.txt

    3. 输出指定的字段
    命令:ps -o pid,ppid,pgrp,session,tpgid,comm
    输出:

    代码如下:

    [root@localhost test6]# ps -o pid,ppid,pgrp,session,tpgid,comm
    PID PPID PGRP SESS TPGID COMMAND
    17398 17394 17398 17398 17478 bash
    17478 17398 17478 17398 17478 ps
    [root@localhost test6]#

    参考:http://www.jb51.net/LINUXjishu/151851.html

    ps命令极为常用,其他命令还有:
    pstree  
    树状显示进程信息
    -a 显示完整命令及参数
    -c 重复进程分别显示
    -c 显示进程ID PID
    -n 按 PID 排列进程
    pgrep <进程名> 
    显示进程的PID
    -l 显示进程名和进程PID
    -o 进程起始ID
    -n 进程终止ID

    24. kill 命令
    也许你从命令的名字已经猜出是做什么的了,kill是用来杀死已经无关紧要或者没有响应的进程.它是一个非常有用的命令,而不是非常非常有用.你可能 很熟悉Windows下要杀死进程可能需要频繁重启机器因为一个在运行的进程大部分情况下不能够杀死,即使杀死了进程也需要重新启动操作系统才能生效.但 在linux环境下,事情不是这样的.你可以杀死一个进程并且重启它而不是重启整个操作系统.

    杀死一个进程需要知道进程的PID.

    假设你想杀死已经没有响应的‘apache2′进程,运行如下命令:

    root@tecmint:~# ps -A | grep -i apache2

    1285 ?        00:00:00 apache2

    搜索‘apache2′进程,找到PID并杀掉它.例如:在本例中‘apache2′进程的PID是1285..

    root@tecmint:~# kill 1285 (to kill the process apache2)

    注意:每次你重新运行一个进程或者启动系统,每个进程都会生成一个新的PID.你可以使用ps命令获得当前运行进程的PID.

    另一个杀死进程的方法是:

    root@tecmint:~# pkill apache2

    注意:kill需要PID作为参数,pkill可以选择应用的方式,比如指定进程的所有者等.

    kill 命令作用:

         用来终止一个进程

    格式:

        kill [ -s signal | -p ] [ -a ] pid ...

        kill -l [ signal ]

    参数:

        -s:指定发送的信号。

        -p:模拟发送信号。

        -l:指定信号的名称列表。

        pid:要中止进程的ID号。

        Signal:表示信号。

    进程查看方法:

    • top 命令

    • ps 命令

    结束进程的命令

        有kill、pkill、killall、xkill等:

    • kill [信号代码] <进程PID> 
      根据PID向进程发送信号,常用来结束进程,默认信号为 -9
      信号代码,可取值如下:
      -l [信号数字] 显示、翻译信号代码
      -9 , -KILL 发送 kill 信号退出
      -6 , -ABRT 发送 abort 信号退出
      -15 , -TERM 发送 Termination 信号
      -1 , -HUP 挂起
      -2 , -INT 从键盘中断,相当于 Ctrl+c
      -3 , -QUIT 从键盘退出,相当于 Ctrl+d
      -4 , -ILL 非法指令
      -11 , -SEGV 内存错误
      -13 , -PIPE 破坏管道
      -14 , -ALRM
      -STOP 停止进程,但不结束
      -CONT 继续运行已停止的进程
      -9 -1 结束当前用户的所有进程
    • pkill <进程名> 
      结束进程族。如果结束单个进程,请用 kill
    • killall <进程名> 
      killall和pkill 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill 来杀掉。
    • xkill  
      在图形界面中点杀进程。
      当xkill运行时鼠标指针变为骷髅图案,哪个图形程序崩溃一点就OK了。如果您想终止xkill ,就按右键取消。
      比如当firefox 出现崩溃不能退出时,点鼠标就能杀死firefox 。

    参考:http://blog.sina.com.cn/s/blog_89ca421401016ec1.html

    6. 实例应用

    (1)强行中止(经常使用杀掉)一个进程标识号为324的进程:

    kill -9 324

    (2)解除Linux系统的死锁

    在Linux中有时会发生这样一种情况:一个程序崩溃,并且处于死锁的状态。此时一般不用重新启动计算机,只需要中止(或者说是关闭)这个有问题的程序即可。当kill处于X-Window界面时,主要的程序(除了崩溃的程序之外)一般都已经正常启动了。此时打开一个终端,在那里中止有问题的程序。比如,

        如果Mozilla浏览器程序出现了锁死的情况,可以使用kill命令来中止所有包含有Mozolla浏览器的程序。首先用top命令查处该程序的PID,然后使用kill命令停止这个程序:

    kill -SIGKILL XXX

    其中,XXX是包含有Mozolla浏览器的程序的进程标识号。

    (3)使用命令回收内存

    我们知道内存对于系统是非常重要的,回收内存可以提高系统资源。kill命令可以及时地中止一些“越轨”的程序或很长时间没有相应的程序。例如,使用top命令发现一个无用 (Zombie) 的进程,此时可以使用下面命令:

    kill -9 XXX

        其中,XXX是无用的进程标识号。

        然后使用下面命令

    free

        此时会发现可用内存容量增加了。

    (4)killall命令

    Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如:

    killall -HUP inetd

    *杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志。

        首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令:

        # kill -pid

        注释:标准的kill命令通常都能达到目的。终止有问题的进程,并把进程的资源释放给系统。然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源。为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。

    *确定要杀死进程的PID或PPID

        # ps -ef | grep httpd

    *以优雅的方式结束进程

       # kill -l PID

        -l选项告诉kill命令用好像启动进程的用户已注销的方式结束进程。当使用该选项时,kill命令也试图杀死所留下的子进程。但这个命令也不是总能成功--或许仍然需要先手工杀死子进程,然后再杀死父进程。

    *TERM信号

        给父进程发送一个TERM信号,试图杀死它和它的子进程。

       # kill -TERM PPID

    *killall命令

        killall命令杀死同一进程组内的所有进程。其允许指定要终止的进程的名称,而非PID。

        # killall httpd

    *停止和重启进程

        有时候只想简单的停止和重启进程。如下:

       # kill -HUP PID

        该命令让Linux和缓的执行进程关闭,然后立即重启。在配置应用程序的时候,这个命令很方便,在对配置文件修改后需要重启进程时就可以执行此命令。

    *绝杀 kill -9 PID

        同意的 kill -s SIGKILL

        这个强大和危险的命令迫使进程在运行时突然终止,进程在结束后不能自我清理。危害是导致系统资源无法正常释放,一般不推荐使用,除非其他办法都无效。

        当使用此命令时,一定要通过ps -ef确认没有剩下任何僵尸进程。只能通过终止父进程来消除僵尸进程。如果僵尸进程被init收养,问题就比较严重了。杀死init进程意味着关闭系统。

        如果系统中有僵尸进程,并且其父进程是init,而且僵尸进程占用了大量的系统资源,那么就需要在某个时候重启机器以清除进程表了。

    参考:http://os.chinaunix.net/a2008/0601/980/000000980620.shtml

    25. jobs fg bg nohup [Common]&等前后台运行命令详解

    A,Shell支持作用控制,有以下命令: 
    1. command& 让进程在后台运行 
    2. jobs 查看后台运行的进程 
    3. fg %n 让后台运行的进程n到前台来 
    4. bg %n 让进程n到后台去;   
    PS:"n"为jobs查看到的进程编号.

    B. 命令详解

    fg、bg、jobs、&、ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的
    一。& 最经常被用到
    这个用在一个命令的最后,可以把这个命令放到后台执行
    二。ctrl + z
    可以将一个正在前台执行的命令放到后台,并且暂停
    三。jobs
    查看当前有多少在后台运行的命令
    四。fg
    将后台中的命令调至前台继续运行
    如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
    五。bg
    将一个在后台暂停的命令,变成继续执行
    如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

    #Linux下使用Shell命令控制任务Jobs执行

    下列命令可以用来操纵进程任务:
    ps 列出系统中正在运行的进程;
    kill 发送信号给一个或多个进程(经常用来杀死一个进程);
    jobs 列出当前shell环境中已启动的任务状态,若未指定jobsid,则显示所有活动的任务状态信息;如果报告了一个任务的终止(即任务的状态被标记为Terminated),shell 从当前的shell环境已知的列表中删除任务的进程标识;
    bg 将进程搬到后台运行(Background);
    fg 将进程搬到前台运行(Foreground); 
    将job转移到后台运行 
    如果你经常在X图形下工作,你可能有这样的经历:通过终端命令运行一个GUI程序,GUI界面出来了,但是你的终端还停留在原地,你不能在shell中继续执行其他命令了,除非将GUI程序关掉。 
    为了使程序执行后终端还能继续接受命令,你可以将进程移到后台运行,使用如下命令运行程序: #假设要运行xmms
    $xmms &
    这样打开xmms后,终端的提示又回来了。现在xmms在后台运行着呢;但万一你运行程序时忘记使用“&”了,又不想重新执行;你可以先使用ctrl+z挂起程序,然后敲入bg命令,这样程序就在后台继续运行了。
    概念:当前任务 
    如果后台的任务号有2个,[1],[2];如果当第一个后台任务顺利执行完毕,第二个后台任务还在执行中时,当前任务便会自动变成后台任务号码“[2]”的后台任务。所以可以得出一点,即当前任务是会变动的。当用户输入“fg”、“bg”和“stop”等命令时,如果不加任何引号,则所变动的均是当前任务。
    察看jobs 
    使用jobs或ps命令可以察看正在执行的jobs。 
    jobs命令执行的结果,+表示是一个当前的作业,减号表是是一个当前作业之后的一个作业,jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated,但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识;也就是说,jobs命令显示的是当前shell环境中所起的后台正在运行或者被挂起的任务信息;
    进程的挂起 
    后台进程的挂起: 
    在solaris中通过stop命令执行,通过jobs命令查看job号(假设为num),然后执行stop %num;
    在redhat中,不存在stop命令,可通过执行命令kill -stop PID,将进程挂起;
    当要重新执行当前被挂起的任务时,通过bg %num 即可将挂起的job的状态由stopped改为running,仍在后台执行;当需要改为在前台执行时,执行命令fg %num即可;
    前台进程的挂起:
    ctrl+Z;
    进程的终止 
    后台进程的终止:
    方法一:
    通过jobs命令查看job号(假设为num),然后执行kill %num
    方法二:
    通过ps命令查看job的进程号(PID,假设为pid),然后执行kill pid 
    前台进程的终止:
    ctrl+c
    kill的其他作用 
    kill除了可以终止进程,还能给进程发送其它信号,使用kill -l 可以察看kill支持的信号。 
    SIGTERM是不带参数时kill发送的信号,意思是要进程终止运行,但执行与否还得看进程是否支持。如果进程还没有终止,可以使用kill -SIGKILL pid,这是由内核来终止进程,进程不能监听这个信号。

    Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:

             /usr/local/mysql/bin/mysqld_safe --user=mysql &

    但是我们很多程序并不象mysqld一样可以做成守护进程,可能我们的程序只是普通程序而已,一般这种 程序即使使用 & 结尾,如果终端关闭,那么程序也会被关闭。为了能够后台运行,我们需要使用nohup这个命令,比如我们有个start.sh需要在后台运行,并且希望在 后台能够一直运行,那么就使用nohup:

                nohup /root/start.sh &

              在shell中回车后提示:

               [~]$ appending output to nohup.out

          原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。

    但是有时候在这一步会有问题,当把终端关闭后,进程会自动被关闭,察看nohup.out可以看到在关闭终端瞬间服务自动关闭。

    咨询红旗Linux工程师后,他也不得其解,在我的终端上执行后,他启动的进程竟然在关闭终端后依然运行。

    在第二遍给我演示时,我才发现我和他操作终端时的一个细节不同:他是在当shell中提示了nohup成 功后还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端;而我是每次在nohup执行成功后直接点关 闭程序按钮关闭终端.。所以这时候会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown。

    这个细节有人和我一样没注意到,所以在这儿记录一下了。

    附:nohup命令参考

    nohup 命令

    用途:不挂断地运行命令。

    语法:nohup Command [ Arg ... ] [ & ]

    描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示"and"的符号)到命令的尾部。

    无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

    退出状态:该命令返回下列出口值:

    126 可以查找但不能调用 Command 参数指定的命令。

    127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。

    否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

    nohup命令及其输出文件

    nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。

    该命令的一般形式为:nohup command &

    使用nohup命令提交作业

    如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

    nohup command > myout.file 2>&1 &

    在上面的例子中,输出被重定向到myout.file文件中。

    使用 jobs 查看任务。

    使用 fg %n 关闭。

    另外有两个常用的ftp工具ncftpget和ncftpput,可以实现后台的ftp上传和下载,这样就可以利用这些命令在后台上传和下载文件了。

    简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止。

    要实现守护进程,一种方法是按守护进程的规则去编程(本站有文章介绍过),比较麻烦;另一种方法是仍然用普通方法编程,然后用nohup命令启动程序:

    nohup<程序名>&

    则控制台logout后,进程仍然继续运行,起到守护进程的作用(虽然它不是严格意义上的守护进程)。

    使用nohup命令后,原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用,实现了完整的守护进程功能。

    ygwu @ 2005年04月18日 上午10:03

    For example:

    如何远程启动WebLogic服务?

    用telnet远程控制服务器,远程启动WEBLOGIC服务,启动后关闭telnet,WebLogic服务也跟着停止,这是因为使用telnet启动的进程会随着telnet进程的关闭而关闭。所以我们可以使用一些UNIX下的命令来做到不关闭。

    使用如下命令:

    nohup startWeblogic.sh&

    如果想要监控标准输出可以使用:

    tail -f nohup.out

    当在后台运行了程序的时候,可以用jobs命令来查看后台作业的状态。在有多个后台程序时,要使用来参数的fg命令将不同序号的后台作业切换到前台上运行。

    当用户启动一个进程的时候,这个进程是运行在前台,使用与相应控制终端相联系的标准输入、输出进行输 入和输出。即使将进程的输入输出重定向,并将进程放在后台执行,进程仍然和当前终端设备有关系。正因为如此,在当前的登录会话结束时,控制终端设备将和登 录进程相脱离,那么系统就向所有与这个终端相联系的进程发送SIGHUP的信号,通知进程线路已经挂起了,如果程序没有接管这个信号的处理,那么缺省的反 应是进程结束。因此普通的程序并不能真正脱离登录会话而运行进程,为了使得在系统登录后还可以正常执行,只有使用命令nohup来启动相应程序。

    使用命令nohup当然可以启动这样的程序,但nohup启动的程序在进程执行完毕就退出,而常见的 一些服务进程通常永久的运行在后台,不向屏幕输出结果。在Unix中这些永久的后台进程称为守护进程(daemon)。守护进程通常从系统启动时自动开始 执行,系统关闭时才停止。

    在守护进程中,最重要的一个是超级守护进程inetd,这个进程接管了大部分网络服务,但并不是对每 个服务都自己进行处理,而是依据连接请求,启动不同的服务程序与客户机打交道。inetd支持网络服务种类在它的设置文件/etc/inet.conf中 定义。inet.conf文件中的每一行就对应一个端口地址,当inetd接受到连接这个端口的连接请求时,就启动相应的进程进行处理。使用inetd的 好处是系统不必启动很多守护进程,从而节约了系统资源,然而使用inetd启动守护进程相应反应会迟缓一些,不适合用于被密集访问的服务进程

    引用自:http://hi.baidu.com/flying5/blog/item/70ff8fdd4a3e60d28c10292b.html

    26. whereis命令:用来定位命令的二进制文件资源或者帮助页.举例来说,获得ls和kill命令的二进制文件/资源以及帮助页:

    root@tecmint:~# whereis ls

    ls: /bin/ls /usr/share/man/man1/ls.1.gz

    root@tecmint:~# whereis kill

    kill: /bin/kill /usr/share/man/man2/kill.2.gz /usr/share/man/man1/kill.1.gz

    注意:当需要知道二进制文件保存位置时有用.

    27. service命令:控制服务的启动、停止和重启,它让你能够不重启整个系统就可以让配置生效以开启、停止或者重启某个服务。

    在Ubuntu上启动apache2 server:

    root@tecmint:~# service apache2 start

    * Starting web server apache2                                                                                                                                 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

    httpd (pid 1285) already running                        [ OK ]

    重启apache2 server:

    root@tecmint:~# service apache2 restart

    * Restarting web server apache2                                                                                                                               apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

    ... waiting .apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName  [ OK ]

    停止apache2 server:

    root@tecmint:~# service apache2 stop

    * Stopping web server apache2                                                                                                                                 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

    ... waiting                                                                [ OK ]

    注意:要想使用service命令,进程的脚本必须放在‘/etc/init.d‘,并且路径必须在指定的位置。

    如果要运行“service apache2 start”实际上实在执行“service /etc/init.d/apache2 start”.

    28. alias 命令:alias是一个系统自建的shell命令,允许你为名字比较长的或者经常使用的命令指定别名。

    我经常用‘ls -l‘命令,它有五个字符(包括空格)。于是我为它创建了一个别名‘l’。

    root@tecmint:~# alias l='ls -l'

    试试它是否能用:

    root@tecmint:~# l

    total 36

    drwxr-xr-x 3 tecmint tecmint 4096 May 10 11:14 Binary

    drwxr-xr-x 3 tecmint tecmint 4096 May 21 11:21 Desktop

    drwxr-xr-x 2 tecmint tecmint 4096 May 21 15:23 Documents

    drwxr-xr-x 8 tecmint tecmint 4096 May 20 14:56 Downloads

    drwxr-xr-x 2 tecmint tecmint 4096 May  7 16:58 Music

    drwxr-xr-x 2 tecmint tecmint 4096 May 20 16:17 Pictures

    drwxr-xr-x 2 tecmint tecmint 4096 May  7 16:58 Public

    drwxr-xr-x 2 tecmint tecmint 4096 May  7 16:58 Templates

    drwxr-xr-x 2 tecmint tecmint 4096 May  7 16:58 Videos

    去掉’l’别名,要使用unalias命令:

    root@tecmint:~# unalias l

    再试试:

    root@tecmint:~# l

    bash: l: command not found

    开个玩笑,把一个重要命令的别名指定为另一个重要命令:

    alias cd='ls -l' (set alias of ls -l to cd)

    alias su='pwd' (set alias of pwd to su)

    ....

    (You can create your own)

    ....

    想想多么有趣,现在如果你的朋友敲入‘cd’命令,当他看到的是目录文件列表而不是改变目录;当他试图用’su‘命令时,他会进入当前目录。你可以随后去掉别名,向他解释以上情况。

    29. df 命令: 报告系统的磁盘使用情况。在跟踪磁盘使用情况方面对于普通用户和系统管理员都很有用。 ‘df‘ 通过检查目录大小工作,但这一数值仅当文件关闭时才得到更新。

    root@tecmint:~# df

    Filesystem     1K-blocks    Used Available Use% Mounted on

    /dev/sda1       47929224 7811908  37675948  18% /

    none                   4       0         4   0% /sys/fs/cgroup

    udev             1005916       4   1005912   1% /dev

    tmpfs             202824     816    202008   1% /run

    none                5120       0      5120   0% /run/lock

    none             1014120     628   1013492   1% /run/shm

    none              102400      44    102356   1% /run/user

    /dev/sda5         184307   79852     94727  46% /boot

    /dev/sda7       95989516   61104  91045676   1% /data

    /dev/sda8       91953192   57032  87218528   1% /personal

    df -h 以可读性较好的格式显示尺寸(例如:1K 234M 2G)
    df -H 计算时使用1000 为基底而非1024,意思就是 -H 表示以1000 换算了,1G = 1000M 1M = 1000K

    ‘df’命令的更多例子请参阅:http://www.tecmint.com/how-to-check-disk-space-in-linux/

    30. du命令:估计文件的空间占用。 逐层统计文件(例如以递归方式)并输出摘要。

    root@tecmint:~# du

    8       ./Daily Pics/wp-polls/images/default_gradient

    8       ./Daily Pics/wp-polls/images/default

    32      ./Daily Pics/wp-polls/images

    8       ./Daily Pics/wp-polls/tinymce/plugins/polls/langs

    8       ./Daily Pics/wp-polls/tinymce/plugins/polls/img

    28      ./Daily Pics/wp-polls/tinymce/plugins/polls

    32      ./Daily Pics/wp-polls/tinymce/plugins

    36      ./Daily Pics/wp-polls/tinymce

    580     ./Daily Pics/wp-polls

    1456    ./Daily Pics

    36      ./Plugins/wordpress-author-box

    16180   ./Plugins

    12      ./May Articles 2013/Xtreme Download Manager

    4632    ./May Articles 2013/XCache

    注意: ‘df‘ 只显示文件系统的使用统计,但‘du‘统计目录内容。‘du‘命令的更详细信息请参阅10 du (Disk Usage) Commands.

    df和du的区别:

    实例:http://blog.itpub.net/26230597/viewspace-1242675

    早晨磁盘报警刚清空完tomcat和nginx日志,使用的命令是类似echo "" > show_web-error.log或者> show_web-debug.log清空语句,然后rm -rf 掉一些tar.gz包,空出来30G空间。而且也关闭了tomcat的debug信息。刚刚又接到报警,磁盘100%了。怎么回事?

    进去df -h下,确实100%了,去/根目录check,du -sh *,看到,占据的磁盘空间所有的加起来也不到30G,可是df -h下来,确实100%呢?差异在哪里?

    原因:

    我因为磁盘快满了就删除了一些过期文件,可能应用程序还在使用这些文件句柄,所以导致了我说的问题。 我把所有应用程序都停止后,du和df的结果就大致相同了。

    原理总结:

    du -s命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数;
    df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。
    du是用户级程序,不考虑Meta Data(系统为自身分配的一些磁盘块)
    ps:应用程序打开的文件句柄没有关闭的话,会造成df命令显示的剩余磁盘空间少。而du则不会

    31. rm 命令: 标准移除命令。 rm 可以用来删除文件和目录。

    删除目录

    root@tecmint:~# rm PassportApplicationForm_Main_English_V1.0

    rm: cannot remove `PassportApplicationForm_Main_English_V1.0': Is a directory

    ‘rm’不能直接删除目录,需要加上相应的’-rf’参数才可以。

    root@tecmint:~# rm -rf PassportApplicationForm_Main_English_V1.0

    警告: ”rm -rf” 命令是一个破坏性的命令,假如你不小心删除一个错误的目录。一旦你使用’rm -rf’ 删除一个目录,在目录中所有的文件包括目录本身会被永久的删除,所以使用这个命令要非常小心。

    32.  echo 命令:功能正如其名,就是基于标准输出打印一段文本。它和shell无关,shell也不读取通过echo命令打印出的内容。然而在一种交互式脚本中,echo通过终端将信息传递给用户。它是在脚本语言,交互式脚本语言中经常用到的命令。

    root@tecmint:~# echo "Tecmint.com is a very good website"

    Tecmint.com is a very good website

    创建一小段交互式脚本

    1. 在桌面上新建一个文件,命名为 ‘interactive_shell.sh‘  (记住必须带 ‘.sh‘扩展名)。

    2. 复制粘贴如下脚本代码,确保和下面的一致。

    #!/bin/bash

    echo "Please enter your name:"

    read name

    echo "Welcome to Linux $name"

    接下来,设置执行权限并运行脚本。

    root@tecmint:~# chmod 777 interactive_shell.sh

    root@tecmint:~# ./interactive_shell.sh

    Please enter your name:

    Ravi Saive

    Welcome to Linux Ravi Saive

    注意: ‘#!/bin/bash‘ 告诉shell这是一个脚本,并且在脚本首行写上这句话是个好习惯。. ‘read‘ 读取给定的输出.

    33. passwd命令: 这是一个很重要的命令,在终端中用来改变自己密码很有用。显然的,因为安全的原因,你需要知道当前的密码。

    root@tecmint:~# passwd

    Changing password for tecmint.

    (current) UNIX password: ********

    Enter new UNIX password: ********

    Retype new UNIX password: ********

    Password unchanged   [这里表示密码未改变,例如:新密码=旧密码]

    Enter new UNIX password: #####

    Retype new UNIX password:#####

    34. lpr 命令:用来在命令行上将指定的文件在指定的打印机上打印。

    root@tecmint:~# lpr -P deskjet-4620-series 1-final.pdf

    注意: ”lpq”命令让你查看打印机的状态(是开启状态还是关闭状态)和等待打印中的工作(文件)的状态。

    35. cmp 命令:比较两个任意类型的文件并将结果输出至标准输出。如果两个文件相同, ‘cmp‘默认返回0;如果不同,将显示不同的字节数和第一处不同的位置。

    以下面两个文件为例:

    file1.txt

    root@tecmint:~# cat file1.txt

    Hi My name is Tecmint

    file2.txt

    root@tecmint:~# cat file2.txt

    Hi My name is tecmint [dot] com

    比较一下这两个文件,看看命令的输出。

    root@tecmint:~# cmp file1.txt file2.txt

    file1.txt file2.txt differ: byte 15, line 1

    36. wget 命令: Wget是用于非交互式(例如后台)下载文件的免费工具.支持HTTP, HTTPS, FTP协议和 HTTP 代理。

    使用wget下载ffmpeg

    root@tecmint:~# wget http://downloads.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2

    --2013-05-22 18:54:52--  http://downloads.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2

    Resolving downloads.sourceforge.net (downloads.sourceforge.net)... 216.34.181.59

    Connecting to downloads.sourceforge.net (downloads.sourceforge.net)|216.34.181.59|:80... connected.

    HTTP request sent, awaiting response... 302 Found

    Location: http://kaz.dl.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2 [following]

    --2013-05-22 18:54:54--  http://kaz.dl.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2

    Resolving kaz.dl.sourceforge.net (kaz.dl.sourceforge.net)... 92.46.53.163

    Connecting to kaz.dl.sourceforge.net (kaz.dl.sourceforge.net)|92.46.53.163|:80... connected.

    HTTP request sent, awaiting response... 200 OK

    Length: 275557 (269K) [application/octet-stream]

    Saving to: ‘ffmpeg-php-0.6.0.tbz2’

    100%[===========================================================================>] 2,75,557    67.8KB/s   in 4.0s 

    2013-05-22 18:55:00 (67.8 KB/s) - ‘ffmpeg-php-0.6.0.tbz2’ saved [275557/275557]

    37. mount 命令:mount 是一个很重要的命令,用来挂载不能自动挂载的文件系统。你需要root权限挂载设备。在插入你的文件系统后,首先运行”lsblk”命令,识别出你的设备,然后把分配的设备名记下来。

    root@tecmint:~# lsblk

    NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT

    sda      8:0    0 931.5G  0 disk

    ├─sda1   8:1    0 923.6G  0 part /

    ├─sda2   8:2    0     1K  0 part

    └─sda5   8:5    0   7.9G  0 part [SWAP]

    sr0     11:0    1  1024M  0 rom

    sdb      8:16   1   3.7G  0 disk

    └─sdb1   8:17   1   3.7G  0 part

    从这个输出上来看,很明显我插入的是4GB的U盘,因而“sdb1”就是要挂载上来的文件系统。以root用户操作,然后切换到/dev目录,它是所有文件系统挂载的地方。

    root@tecmint:~# su

    Password:

    root@tecmint:~# cd /dev

    创建一个任何名字的目录,但是最好和引用相关。

    root@tecmint:~# mkdir usb

    现在将“sdb1”文件系统挂载到“usb”目录.

    root@tecmint:~# mount /dev/sdb1 /dev/usb

    现在你就可以从终端进入到/dev/usb或者通过X窗口系统从挂载目录访问文件。

    是时候让程序猿见识见识Linux环境是多么丰富了!

    38. gcc 命令: gcc 是Linux环境下C语言的内建编译器。下面是一个简单的C程序,在桌面上保存为Hello.c (记住必须要有‘.c‘扩展名)。

    #include <stdio.h>

    int main()

    {

      printf("Hello world ");

      return 0;

    }

    编译

    root@tecmint:~# gcc Hello.c

    运行

    root@tecmint:~# ./a.out

    Hello world

    注意: 编译C程序时,输出会自动保存到一个名为“a.out”的新文件,因此每次编译C程序 “a.out”都会被修改。 因此编译期间最好定义输出文件名.,这样就不会有覆盖输出文件的风险了。

    用这种方法编译

    root@tecmint:~# gcc -o Hello Hello.c

    这里‘-o‘将输出写到‘Hello‘文件而不是 ‘a.out‘。再运行一次。

    root@tecmint:~# ./Hello

    Hello world

    39. g++ 命令: g++是C++的内建编译器。下面是一个简单的C++程序,在桌面上保存为Add.cpp (记住必须要有‘.cpp‘扩展名)。

    #include <iostream>

    using namespace std;

    int main()

    {

      int a;

      int b;

      cout<<"Enter first number: ";

      cin >> a;

      cout <<"Enter the second number: ";

      cin>> b;

      cin.ignore();

      int result = a + b;

      cout<<"Result is"<<"  "<<result<<endl;

      cin.get();

      return 0;

    }

    编译

    root@tecmint:~# g++ Add.cpp

    运行

    root@tecmint:~# ./a.out

    Enter first number:

    ...

    ...

    注意:编译C++程序时,输出会自动保存到一个名为“a.out”的新文件,因此每次编译C++程序 “a.out”都会被修改。 因此编译期间最好定义输出文件名.,这样就不会有覆盖输出文件的风险了。

    用这种方法编译

    root@tecmint:~# g++ -o Add Add.cpp

    运行

    root@tecmint:~# ./Add

    Enter first number:

    ...

    ...

    40. java 命令: Java 是世界上使用最广泛的编程语言之一. 它也被认为是高效, 安全和可靠的编程语言. 现在大多数基于网络的服务都使用Java实现.

    拷贝以下代码到一个文件就可以创建一个简单的Java程序. 不妨把文件命名为tecmint.java (记住: ’.java’扩展名是必需的).

    class tecmint {

    public static void main(String[] arguments) {

    System.out.println("Tecmint ");

    }

    }

    用javac编译tecmint.java

    root@tecmint:~# javac tecmint.java

    运行

    root@tecmint:~# java tecmint

    注意: 几乎所有的Linux发行版都带有gcc编译器, 大多数发行版都内建了g++ 和 java 编译器, 有些也可能没有. 你可以用apt 或 yum 安装需要的包.

    20-39参考文章:http://blog.jobbole.com/45377/

    三、技巧

    (待续)

  • 相关阅读:
    redhat下设置网桥br0
    RackSpace推开源云计算平台OpenStack震动业界
    centos5.2 64位yum国内源之首选 上海交大(未验证)
    image config
    编程的四种境界
    怎样学好C语言
    利用SSL加密HTTP通道加强IIS安全性
    Sql Server 日期函数
    如何启用Oracle 11g的默认用户Scott
    ASP.NET自定义错误处理页面的添加
  • 原文地址:https://www.cnblogs.com/kimiway/p/4464495.html
Copyright © 2020-2023  润新知