• Linux入门进阶第四天(下)——程序管理(补充内容)


    1.PID

      触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限设置。

      同一个程序不同使用者得到的PID是不同的:

      

    2.切换登录窗口可以使用alt+F1~F7进行切换

    3.将指令丢到背景中“执行”的 &

    4.将“目前”的工作丢到背景中“暂停”:[ctrl]-z

    5.观察目前的背景工作状态: jobs

    6.将背景工作拿到前景来处理:fg

    [root@study ~]# fg %jobnumber
    选项与参数:
    %jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的!
    范例一:先以 jobs 观察工作,再将工作取出:
    [root@study ~]# jobs -l
    [1]- 14566 Stopped vim ~/.bashrc
    [2]+ 14567 Stopped find / -print
    [root@study ~]# fg <==默认取出那个 + 的工作,亦即 [2]。立即按下[ctrl]-z
    [root@study ~]# fg %1 <==直接规定取出的那个工作号码!再按下[ctrl]-z
    [root@study ~]# jobs -l
    [1]+ 14566 Stopped vim ~/.bashrc
    [2]- 14567 Stopped find / -print

    7.让工作在背景下的状态变成运行中: bg

    8.管理背景当中的工作: kill

    [root@study ~]# kill -signal %jobnumber
    [root@study ~]# kill -l
    选项与参数:
    -l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?
    signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:
    -1 :重新读取一次参数的配置文件 (类似 reload);
    -2 :代表与由键盘输入 [ctrl]-c 同样的动作;
    -9 :立刻强制删除一个工作;
    -15:以正常的程序方式终止一项工作。与 -9 是不一样的。
    范例一:找出目前的 bash 环境下的背景工作,并将该工作“强制删除”。
    [root@study ~]# jobs
    [1]+ Stopped vim ~/.bashrc
    [2] Stopped find / -print
    [root@study ~]# kill -9 %2; jobs
    [1]+ Stopped vim ~/.bashrc
    [2] Killed find / -print
    # 再过几秒你再下达 jobs 一次,就会发现 2 号工作不见了!因为被移除了!
    范例二:找出目前的 bash 环境下的背景工作,并将该工作“正常终止”掉。
    [root@study ~]# jobs
    [1]+ Stopped vim ~/.bashrc
    [root@study ~]# kill -SIGTERM %1
    # -SIGTERM 与 -15 是一样的!您可以使用 kill -l 来查阅!
    # 不过在这个案例中, vim 的工作无法被结束喔!因为他无法通过 kill 正常终止的意思!

    程序的观察

      1.ps :将某个时间点的程序运行情况撷取下来

    [root@study ~]# ps aux <==观察系统所有的程序数据
    [root@study ~]# ps -lA <==也是能够观察所有系统的数据
    [root@study ~]# ps axjf <==连同部分程序树状态
    选项与参数:
    -A :所有的 process 均显示出来,与 -e 具有同样的效用;
    -a :不与 terminal 有关的所有 process ;
    -u :有效使用者 (effective user) 相关的 process ;
    x :通常与 a 这个参数一起使用,可列出较完整信息。
    输出格式规划:
    l :较长、较详细的将该 PID 的的信息列出;
    j :工作的格式 (jobs format)
    -f :做一个更为完整的输出。

      更多请参见手册介绍http://linux.51yip.com/search/ps

    通常鸟哥都会建议你,直接背两个比较不同的选项, 一个是只能查阅自己 bash 程序的“
    ps -l ”一个则是可以查阅所有系统运行的程序“ ps aux ”!注意,你没看错,是“ ps aux ”没有那
    个减号 (-) !

      示例:

    [root@localhost ~]# ps -ef   #显示所有进程的UID,PPIP,C与STIME栏位
    UID        PID  PPID  C STIME TTY          TIME CMD
    root         1     0  0 18:24 ?        00:00:00 init [3]                                                                          
    root         2     1  0 18:24 ?        00:00:00 [migration/0]
    root         3     1  0 18:24 ?        00:00:00 [ksoftirqd/0]
    root         4     1  0 18:24 ?        00:00:00 [watchdog/0]
    root         5     1  0 18:24 ?        00:00:00 [migration/1]

      相关输出栏位介绍:

    F:代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号码有:
    若为 4 表示此程序的权限为 root ;
    若为 1 则表示此子程序仅进行复制(fork)而没有实际执行(exec)。
    S:代表这个程序的状态 (STAT),主要的状态有:
    R (Running):该程序正在运行中;
    S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
    D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)
    T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
    Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。
    UID/PID/PPID:代表“此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号
    码”
    C:代表 CPU 使用率,单位为百分比;
    PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所执行的优先顺序,数值越小代表该
    程序越快被 CPU 执行。详细的 PRI 与 NI 将在下一小节说明。
    ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪
    个部分,如果是个 running 的程序,一般就会显示“ - ” / SZ 代表此程序用掉多少内存 /
    WCHAN 表示目前程序是否运行中,同样的, 若为 - 表示正在运行中。
    TTY:登陆者的终端机位置,若为远端登陆则使用动态终端接口 (pts/n);
    TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行的时间,而不是系统时
    间;
    CMD:就是 command 的缩写,造成此程序的触发程序之指令为何。

      2.top——top:动态观察程序的变化

     top 这个程序可以持续
    的监测整个系统的程序工作状态。 在默认的情况下,每次更新程序资源的时间为 5 秒,不
    过,可以使用 -d 来进行修改。

      列名解释:

    序号    列名    含义
    a        PID        进程id
    b        PPID    父进程id
    c        RUSER    Real user name
    d        UID        进程所有者的用户id
    e        USER    进程所有者的用户名
    f        GROUP    进程所有者的组名
    g        TTY        启动进程的终端名。不是从终端启动的进程则显示为 ?
    h        PR        优先级
    i        NI        nice值。负值表示高优先级,正值表示低优先级
    j        P        最后使用的CPU,仅在多CPU环境下有意义
    k        %CPU    上次更新到现在的CPU时间占用百分比
    l        TIME    进程使用的CPU时间总计,单位秒
    m        TIME+    进程使用的CPU时间总计,单位1/100秒
    n        %MEM    进程使用的物理内存百分比
    o        VIRT    进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    p        SWAP    进程使用的虚拟内存中,被换出的大小,单位kb。
    q        RES        进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    r        CODE    可执行代码占用的物理内存大小,单位kb
    s        DATA    可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
    t        SHR        共享内存大小,单位kb
    u        nFLT    页面错误次数
    v        nDRT    最后一次写入到现在,被修改过的页面数。
    w        S        进程状态。
                    D=不可中断的睡眠状态
                    R=运行
                    S=睡眠
                    T=跟踪/停止
                    Z=僵尸进程
    x        COMMAND    命令名/命令行
    y        WCHAN    若该进程在睡眠,则显示睡眠中的系统函数名
    z        Flags    任务标志,参考 sched.h
    
    默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容

       3.pstree——以树状图的方式展现进程之间的派生关系,显示效果比较直观。
      4.程序的管理(开关等)
      
    要给予某个已经存在背景中的工作某些动作时,是直接给予一个讯号给该工作号码即可。那么到底有多少 signal 呢? 你可以使用 kill -l(小写的 L ) 或者是 man 7 signal 都可以查询到!主要的讯号代号与名称对应及内容是:

      

       根据以上的信号,就可以进行程序的管理了!(比较重要的是1,9,15)

    kill -signal PID

      kill 可以帮我们将这个 signal 传送给某个工作 (%jobnumber) 或者是某个 PID (直接输入数字)

    killall -signal 指令名称

      由于 kill 后面必须要加上 PID (或者是 job number),所以,通常 kill 都会配合 ps, pstree,直接通过kaiiall可以给程序名称传送讯号!

    [root@study ~]# killall [-iIe] [command name]
    选项与参数:
    -i :interactive 的意思,互动式的,若需要删除时,会出现提示字符给使用者;
    -e :exact 的意思,表示“后面接的 command name 要一致”,但整个完整的指令
    不能超过 15 个字符。
    -I :指令名称(可能含参数)忽略大小写。
    范例一:给予 rsyslogd 这个指令启动的 PID 一个 SIGHUP 的讯号
    [root@study ~]# killall -1 rsyslogd
    # 如果用 ps aux 仔细看一下,若包含所有参数,则 /usr/sbin/rsyslogd -n 才是最完整的!
    范例二:强制终止所有以 httpd 启动的程序 (其实并没有此程序在系统内)
    [root@study ~]# killall -9 httpd
    范例三:依次询问每个 bash 程序是否需要被终止运行!
    [root@study ~]# killall -i -9 bash
    Signal bash(13888) ? (y/N) n <==这个不杀!
    Signal bash(13928) ? (y/N) n <==这个不杀!
    Signal bash(13970) ? (y/N) n <==这个不杀!
    Signal bash(14836) ? (y/N) y <==这个杀掉!
    # 具有互动的功能!可以询问你是否要删除 bash 这个程序。要注意,若没有 -i 的参数,
    # 所有的 bash 都会被这个 root 给杀掉!包括 root 自己的 bash 喔! ^_^

      5.free :观察内存使用情况

        更多参数选项,参考:http://man.linuxde.net/free

      6.uname:查阅系统与核心相关信息

    [root@study ~]# uname [-asrmpi]
    选项与参数:
    -a :所有系统相关的信息,包括下面的数据都会被列出来;
    -s :系统核心名称
    -r :核心的版本
    -m :本系统的硬件名称,例如 i686 或 x86_64 等;
    -p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型!
    -i :硬件的平台 (ix86)
    范例一:输出系统的基本信息
    [root@study ~]# uname -a
    Linux study.centos.vbird 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015
    x86_64 x86_64 x86_64 GNU/Linux

      7.uptime:观察系统启动时间与工作负载

        这个 uptime 可以显示出 top 画面的最上面一行!

      8.netstat :追踪网络或插槽档——侦听端口情况

    [root@study ~]# netstat -[atunlp]
    选项与参数:
    -a :将目前系统上所有的连线、监听、Socket 数据都列出来
    -t :列出 tcp 网络封包的数据
    -u :列出 udp 网络封包的数据
    -n :不以程序的服务名称,以埠号 (port number) 来显示;
    -l :列出目前正在网络监听 (listen) 的服务;
    -p :列出该网络服务的程序 PID
    # netstat -lntp #查看监听(Listen)的端口
    # netstat -antp #查看所有建立的TCP连接

      9.dmesg :分析核心产生的讯息

    范例一:输出所有的核心开机时的信息
    [root@study ~]# dmesg | more
    范例二:搜寻开机的时候,硬盘的相关信息为何?
    [root@study ~]# dmesg | grep -i vda
    [ 0.758551] vda: vda1 vda2 vda3 vda4 vda5 vda6 vda7 vda8 vda9
    [ 3.964134] XFS (vda2): Mounting V4 Filesystem
    ....(下面省略)....

       10.vmstat :侦测系统资源变化

    特殊权限说明

      之前提到的SUID等特殊权限:

    SUID 权限仅对二进制程序(binary program)有效;
    执行者对于该程序需要具有 x 的可执行权限;
    本权限仅在执行该程序的过程中有效 (run-time);
    执行者将具有该程序拥有者 (owner) 的权限。

      device is busy的处理:找出正在使用该文件的程序——fuser

    [root@study ~]# fuser [-umv] [-k [i] [-signal]] file/dir
    选项与参数:
    -u :除了程序的 PID 之外,同时列出该程序的拥有者;
    -m :后面接的那个文件名会主动的上提到该文件系统的最顶层,对 umount 不成功很有效!
    -v :可以列出每个文件与程序还有指令的完整相关性!
    -k :找出使用该文件/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;
    -i :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!
    -signal:例如 -1 -15 等等,若不加的话,默认是 SIGKILL (-9) 啰!
    范例一:找出目前所在目录的使用 PID/所属帐号/权限 为何?
    [root@study ~]# fuser -uv .
    USER PID ACCESS COMMAND
    /root: root 13888 ..c.. (root)bash
    root 31743 ..c.. (root)bash

      acess列的补充说明:

    c :此程序在当前的目录下(非次目录);
    e :可被触发为执行状态;
    f :是一个被打开的文件;
    r :代表顶层目录 (root directory);
    F :该文件被打开了,不过在等待回应中;
    m :可能为分享的动态函数库;

      1.lsof :列出被程序所打开的文件文件名

    [root@study ~]# lsof [-aUu] [+d]
    选项与参数:
    -a :多项数据需要“同时成立”才显示出结果时!
    -U :仅列出 Unix like 系统的 socket 文件类型;
    -u :后面接 username,列出该使用者相关程序所打开的文件;
    +d :后面接目录,亦即找出某个目录下面已经被打开的文件!
    范例一:列出目前系统上面所有已经被打开的文件与设备:
    [root@study ~]# lsof
    COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    systemd 1 root cwd DIR 253,0 4096 128 /
    systemd 1 root rtd DIR 253,0 4096 128 /
    systemd 1 root txt REG 253,0 1230920 967763 /usr/lib/systemd/systemd
    ....(下面省略)....
    # 注意到了吗?是的,在默认的情况下, lsof 会将目前系统上面已经打开的
    # 文件全部列出来~所以,画面多的吓人啊!您可以注意到,第一个文件 systemd 执行的
    # 地方就在根目录,而根目录,嘿嘿!所在的 inode 也有显示出来喔!
    范例二:仅列出关于 root 的所有程序打开的 socket 文件
    [root@study ~]# lsof -u root -a -U
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    systemd 1 root 3u unix 0xffff8800b7756580 0t0 13715 socket
    systemd 1 root 7u unix 0xffff8800b7755a40 0t0 1902 @/org/freedesktop/systemd1/notify
    systemd 1 root 9u unix 0xffff8800b7756d00 0t0 1903 /run/systemd/private
    .....(中间省略).....
    Xorg 4496 root 1u unix 0xffff8800ab107480 0t0 25981 @/tmp/.X11-unix/X0
    Xorg 4496 root 3u unix 0xffff8800ab107840 0t0 25982 /tmp/.X11-unix/X0
    Xorg 4496 root 16u unix 0xffff8800b7754f00 0t0 25174 @/tmp/.X11-unix/X0
    .....(下面省略).....
    # 注意到那个 -a 吧!如果你分别输入 lsof -u root 及 lsof -U ,会有啥信息?
    # 使用 lsof -u root -U 及 lsof -u root -a -U ,呵呵!都不同啦!
    # -a 的用途就是在解决同时需要两个项目都成立时啊! ^_^
    范例三:请列出目前系统上面所有的被启动的周边设备
    [root@study ~]# lsof +d /dev
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    systemd 1 root 0u CHR 1,3 0t0 1028 /dev/null
    systemd 1 root 1u CHR 1,3 0t0 1028 /dev/null
    # 看吧!因为设备都在 /dev 里面嘛!所以啰,使用搜寻目录即可啊!
    范例四:秀出属于 root 的 bash 这支程序所打开的文件
    [root@study ~]# lsof -u root | grep bash
    ksmtuned 781 root txt REG 253,0 960384 33867220 /usr/bin/bash
    bash 13888 root cwd DIR 253,0 4096 50331777 /root
    bash 13888 root rtd DIR 253,0 4096 128 /
    bash 13888 root txt REG 253,0 960384 33867220 /usr/bin/bash
    bash 13888 root mem REG 253,0 106065056 17331169 /usr/lib/locale/locale-archive
    ....(下面省略)....

      2.pidof :找出某支正在执行的程序的 PID

    [root@study ~]# pidof [-sx] program_name
    选项与参数:
    -s :仅列出一个 PID 而不列出所有的 PID
    -x :同时列出该 program name 可能的 PPID 那个程序的 PID
    范例一:列出目前系统上面 systemd 以及 rsyslogd 这两个程序的 PID
    [root@study ~]# pidof systemd rsyslogd
    1 742
    # 理论上,应该会有两个 PID 才对。上面的显示也是出现了两个 PID 喔。
    # 分别是 systemd 及 rsyslogd 这两支程序的 PID 啦。

    SELinux初探

      参考http://www.toxingwang.com/management/security/1011.html

          http://blog.csdn.net/myarrow/article/details/9856095

     拓展:进程管理:三板斧ps aux

      

       如何按cpu排序?

        

    按内存升序排列;
    
    ps aux --sort=+rss
    
    按内存降序排列;
    
    ps aux --sort=-rss
    
    按cpu升序排列;
    
    ps aux --sort=+%cpu
    
    为按cpu降序排列。
    
    ps aux --sort=-%cpu

     /如何查看安装位置:可以通过which查找:https://blog.csdn.net/bbwangj/article/details/80346924

  • 相关阅读:
    在Linux下运行YY,WINE方式,主要注册表修改点及字体文件列表
    安卓so下,cmake编译系统,如何仅导出指定符号
    AutoHotKey脚本模板:初始化、配置、退出
    资源ID管理插件:VS6/VS.NET
    ListView控件,表格模式下,如何调整行高
    通过wscript运行的JS脚本,如何引入另一个JS文件
    64位编译器下,将指针转换成UINT32,不需要修改编译选项的编码方式
    视频帧双缓冲区的两个版本
    opencv、numpy中矩阵转置,矩阵内的固定位置相应的坐标变换
    CMake下,某些选项的后调整
  • 原文地址:https://www.cnblogs.com/jiangbei/p/8075602.html
Copyright © 2020-2023  润新知