美文网首页Linux
Linux 常用命令(三)

Linux 常用命令(三)

作者: 傅二毛 | 来源:发表于2020-05-08 18:28 被阅读0次

    Linux 常用命令(三)

    Linux系统中进程管理

    常看当前客户端的命令

    ps

    如果只是看和自己的bash有关的进程:ps或者更详细的ps -l

    F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0   3806   3802  0  80   0 - 28862 do_wai pts/0    00:00:00 bash
    0 R     0   3822   3806  0  80   0 - 38312 -      pts/0    00:00:00 ps
    
    参数 参数含义
    S S代表这个进程的状态:
    R: 该进程正在运行;
    S:该进程正在睡眠,可悲唤醒。
    D:不可被唤醒;
    T:停止状态(stop);
    Z:僵尸进程。
    F 若4,代表进程权限为root
    若0,代表此进程仅能fork
    UID 用户ID
    PID 进程编号
    PPID 父进程编号
    C 代表CPU使用率
    PRI/NI Priority/Nice的缩写,代表此进程被CPU所执行的优先顺序
    ADDR/SZ/WCHAN 都与内存相关。
    ADDR是kernel function,如果running,就会显示。
    SZ:此进程用掉了多少内存。
    WCHAN:进程等待的内核时间名,-表示正在工作中。
    TTY 登入终端的位置
    TIME 使用掉CPU时间
    CMD 进程名称

    【注意】
    进程(Process)是计算机中的程序关于
    某数据集合上的一次运行活动,是系统进行资源分配和
    调度的基本单位,是操作系统结构的基础

    ps语法:

    ps [options]
    
    • [options]选项
    选项 说明
    ax 列出终端相关的,如果想列出所有进程需要配合使用
    u 显示面向用户的格式,通常配合ax和grep使用
    f 显示进程树,显示效果不佳,不建议使用
    o 指定显示列
    -sort USER:用户
    PID:进程id
    %CPU:cpu占用率
    %MEM:内存占用率
    VSZ:虚拟内存大小
    RSS:真实内存大小
    TTY:终端
    STAT:状态
    START:开始时间
    TIME:占用cpu时间
    COMMAND:命令
    PRI:优先级
    RTPRIO:实时优先级
    PSR:当前进程对应的处理器
    NI:进程的nice值
    ps ao user,pid,ppid
    USER        PID   PPID
    root        578      1
    root       3806   3802
    root       3836   3806
    

    ps查看的命令都是这个瞬时状态的快照。

    用的最多的是ps -aux | grep命令。

    pstree

    如果无法直接使用,需要使用下面的命令进行安装。

    yum install psmisc -y
    

    命令语法

    pstree [options]
    
    选项 说明
    u 指定用户
    p 显示进程的pid
    h 高亮显示当前的进程及其祖先
    systemd(1)─┬─NetworkManager(618)─┬─{NetworkManager}(633)
               │                     └─{NetworkManager}(638)
               ├─VGAuthService(548)
               ├─agetty(578)
               ├─auditd(441)───{auditd}(442)
               ├─chronyd(558,chrony)
               ├─crond(574)
               ├─dbus-daemon(551,dbus)───{dbus-daemon}(563)
               ├─firewalld(583)───{firewalld}(770)
               ├─master(1089)─┬─pickup(3801,postfix)
               │              └─qmgr(1105,postfix)
               ├─polkitd(547,polkitd)─┬─{polkitd}(564)
               │                      ├─{polkitd}(566)
               │                      ├─{polkitd}(567)
               │                      ├─{polkitd}(576)
               │                      ├─{polkitd}(579)
               │                      └─{polkitd}(580)
               ├─rsyslogd(952)─┬─{rsyslogd}(1198)
               │               └─{rsyslogd}(1201)
               ├─sshd(948)───sshd(3802)───bash(3806)───pstree(3864)
               ├─systemd-journal(379)
               ├─systemd-logind(546)
               ├─systemd-udevd(411)
               ├─tuned(950)─┬─{tuned}(1191)
               │            ├─{tuned}(1192)
               │            ├─{tuned}(1194)
               │            └─{tuned}(1195)
               └─vmtoolsd(549)───{vmtoolsd}(586)
    

    进程状态

    进程状态 说明
    运行R(Running) 正在运行或在运行队列中等待
    S(Sleep) 休眠中, 受阻, 在等待某个条件的形成或接受到信号
    D不可唤醒 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生
    Z(Zombie)僵死 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放
    T停止 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行

    操控进程

    进程后台相关操作

    可以在命令后面添加&符号,将进程放置后台运行。

    • ctrl+z类似在windows中的窗口最小化——退出前台
    • 让某个进程进入后台执行:命令 &

    kill命令

    使用快捷键ctrl+c中断进程。但是对于一个需要终止其执行的后台进程就只能使用kill命令。

    kill语法

    kill [-信号] [PID]
    # 或者下面的形式
    kill [-信号] %[任务编号]
    
    • [-信号]通过向进程发送指定的信号来kill进程。
    • %[任务编号]可以通过jobs命令来查看。

    kill命令常用信号:

    选项 说明
    (1)SIGHUP 重启程序
    (2)SIGINT SIGINT中止正在运行的进程;相当于Ctrl+c
    (9)SIGKILL 杀死正在运行的进程
    (15) SIGTERM 终止正在运行的进程,但让其正常运行完

    (19) SIGSTOP 相当于Ctrl+z暂停

    如:kill -9 pid,可以使用kill -l查看信号

    ## 查看信号量
    $ kill -l
    
     1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
     6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
    11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
    16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
    21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
    26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
    31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
    38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
    43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
    48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
    53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
    58) SIGRTMAX-6  59) SIGRTMAX
    

    jobs工作管理

    选项 说明
    l 列出,jobnumber和PID
    r 仅列出正在后台运行的工作
    s 请列出后台暂停(stop)的工作

    比如当前正在执行vim a.txt编辑操作时,需要操作其他命令,就可以使用ctrl+z快捷键,将当前vim a.txt任务转至后台挂起。通过jobs命令则可以查看当前后台挂起的任务。如下

    ## 查看后台任务
    $ jobs -l
    [1]+  6694 停止                  vim a.txt
    
    • [1]+在上面的面板中代表的是任务编号;
    • 6694则代表的是PID(进程编号)

    工作管理其他操作,如下

    选项 说明
    fg 转前台执行fg %[jobs number-任务编号]
    bg 转后台执行
    ctrl+z 挂起当前任务
    ctrl+c 结束当前任务

    如,将上面的vim a.txt任务转前台:fg %1即可,则又可以进入编辑状态。

    Linux 管道

    此处所介绍的管道仅为皮毛,作为linux入门操作介绍。在介绍管道之前需要简单介绍下命令执行顺序控制。

    命令执行控制

    通常情况下,我们在会话或者终端一般只会一条一条命令去执行。如果需要多条命令按照顺序执行命令,则需要使用到;分隔符号。

    比如下面两条命令:

    $ cat -n test.log ; find ./ -name "*.txt"
         1  12
    ./jdk-8u251-linux-x64/jdk1.8.0_251/jre/THIRDPARTYLICENSEREADME.txt
    ./jdk-8u251-linux-x64/jdk1.8.0_251/jre/THIRDPARTYLICENSEREADME-JAVAFX.txt
    ./jdk-8u251-linux-x64/jdk1.8.0_251/jre/lib/jvm.hprof.txt
    ./jdk-8u251-linux-x64/jdk1.8.0_251/jre/lib/amd64/server/Xusage.txt
    ./jdk-8u251-linux-x64/jdk1.8.0_251/THIRDPARTYLICENSEREADME.txt
    ./jdk-8u251-linux-x64/jdk1.8.0_251/THIRDPARTYLICENSEREADME-JAVAFX.txt
    ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/missioncontrol/THIRDPARTYLICENSEREADME.txt
    ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/missioncontrol/features/org.eclipse.ecf.filetransfer.feature_3.9.0.v20140827-1444/asl-v20.txt
    ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/missioncontrol/features/org.eclipse.ecf.filetransfer.httpclient4.ssl.feature_1.0.0.v20140827-1444/asl-v20.txt
    ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/missioncontrol/features/org.eclipse.ecf.filetransfer.httpclient4.feature_3.9.1.v20140827-1444/asl-v20.txt
    ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/visualvm/platform/VERSION.txt
    ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/visualvm/profiler/VERSION.txt
    

    cat -n test.log查看了test.log中的内容,find ./ -name "*.txt"则查找了当前目录中有txt后缀的文件。通过“;”分号将两个命令分别执行了。但是结果两个结果却不相互影响。这就是简单的命令执行顺序控制

    从上面的示例当然并不能满足实际的生产需要或者运维需要,如果要前一条命令的执行结果能够影响到后面一条命令执行,那么就有两种方式可以做到:

    • 通过命令执行控制,又可分为:
      • 有条件的执行多条命令;
      • 顺序执行多条命令,顺序控制就是上面示例所展示形式。这种适用于两个结果互不影响的场景下使用。
    • 通过管道(将在下面介绍);

    那么关于“有条件的执行多条命令”,又是怎么一种情况?下面将通过三条命令来窥探如何有条件的运行多条命令。

    此处所展示的是一台已经安装了git但是并未安装jdk的linux服务器。

    $ which java && java --version || echo "未安装java"
    /usr/bin/which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
    未安装java
    
    $ whereis git && git --help || echo "未安装git"
    git: /usr/bin/git /usr/share/man/man1/git.1.gz
    用法:git [--version] [--help] [-c name=value]
               [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
               [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
               [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
               <command> [<args>]
    
    最常用的 git 命令有:
       add        添加文件内容至索引
       bisect     通过二分查找定位引入 bug 的变更
       branch     列出、创建或删除分支
       checkout   检出一个分支或路径到工作区
       clone      克隆一个版本库到一个新目录
       commit     记录变更到版本库
       diff       显示提交之间、提交和工作区之间等的差异
       fetch      从另外一个版本库下载对象和引用
       grep       输出和模式匹配的行
       init       创建一个空的 Git 版本库或重新初始化一个已存在的版本库
       log        显示提交日志
       merge      合并两个或更多开发历史
       mv         移动或重命名一个文件、目录或符号链接
       pull       获取并合并另外的版本库或一个本地分支
       push       更新远程引用和相关的对象
       rebase     本地提交转移至更新后的上游分支中
       reset      重置当前HEAD到指定状态
       rm         从工作区和索引中删除文件
       show       显示各种类型的对象
       status     显示工作区状态
       tag        创建、列出、删除或校验一个GPG签名的 tag 对象
    
    命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些指南。参见
    'git help <命令>' 或 'git help <指南>' 来查看给定的子命令帮助或指南。
    
    $ whereis java && java --version || echo "未安装java"
    java:bash: java: 未找到命令
    未安装java
    

    管道

    所谓管道能重定向一个进程的标准输出、输入和错误到另一个进程,以便于进一步处理。

    • 管道命令会自动忽略错误的标准输入。
    • 管道命令后面接的命令必须能够接收标准输入,不能接收的命令包括lscpmv等。
    • 常见的管道命令有:greplessmoreheadtail......

    管道分为两种:

    • 未命名管道,该管道生命周期很短,在成功执行完成后,该管道就会被删除且不能被另一个会话访问或者使用。常见的诸如:find / -name "*.txt" | grep test;即"|"创建的管道。
    • 命名管道,该管道生命周期长,在成功创建后,系统启动后,可被多个会话使用(除非被删除)。它是一个遵循 FIFO(先进先出)机制的特殊文件。它可以像普通文件一样使用。也就是,你可以写入,从中读取,然后打开或关闭它。[1]

    未命名管道

    常见的使用方式:

    Command 1 | Command 2 | Command 3
    

    Command 1的执行标准输出结果作为Command 2的标准输入项,Command 2的标准输出作为Command 3的标准输入。例如下面这条命令;

    $ find ./ -name "*.txt" -exec ls -l {} \; | grep -E "VERSION"
    -rw-r--r--. 1 10143 10143 42 1月  15 2017 ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/visualvm/platform/VERSION.txt
    -rw-r--r--. 1 10143 10143 42 1月  15 2017 ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/visualvm/profiler/VERSION.txt
    

    首先$ find ./ -name "*.txt" -exec ls -l {} \;命令找到符合后缀名为".txt"文件,并使用-exex选项将find的结果再使用ls -l命令列举出来;如下所示,此时结果可能并不是想要的,再通过管道将标准输出结果在进行过滤,找到包含“VERSION”的文件。

    $ find ./ -name "*.txt" -exec ls -l {} \;
    # 执行结果如下
    -r--r--r--. 1 10143 10143 169571 3月  12 14:33 ./jdk-8u251-linux-x64/jdk1.8.0_251/jre/THIRDPARTYLICENSEREADME.txt
    -rw-r--r--. 1 10143 10143 117365 3月  12 11:25 ./jdk-8u251-linux-x64/jdk1.8.0_251/jre/THIRDPARTYLICENSEREADME-JAVAFX.txt
    -rw-r--r--. 1 10143 10143 4226 3月  12 14:33 ./jdk-8u251-linux-x64/jdk1.8.0_251/jre/lib/jvm.hprof.txt
    -rw-r--r--. 1 10143 10143 1423 3月  12 14:33 ./jdk-8u251-linux-x64/jdk1.8.0_251/jre/lib/amd64/server/Xusage.txt
    -r--r--r--. 1 10143 10143 169571 3月  12 14:33 ./jdk-8u251-linux-x64/jdk1.8.0_251/THIRDPARTYLICENSEREADME.txt
    -rw-r--r--. 1 10143 10143 117365 3月  12 11:25 ./jdk-8u251-linux-x64/jdk1.8.0_251/THIRDPARTYLICENSEREADME-JAVAFX.txt
    -rw-r--r--. 1 10143 10143 30275 12月  8 2017 ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/missioncontrol/THIRDPARTYLICENSEREADME.txt
    -rw-r--r--. 1 10143 10143 11358 12月  8 2017 ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/missioncontrol/features/org.eclipse.ecf.filetransfer.feature_3.9.0.v20140827-1444/asl-v20.txt
    -rw-r--r--. 1 10143 10143 11358 12月  8 2017 ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/missioncontrol/features/org.eclipse.ecf.filetransfer.httpclient4.ssl.feature_1.0.0.v20140827-1444/asl-v20.txt
    -rw-r--r--. 1 10143 10143 11358 12月  8 2017 ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/missioncontrol/features/org.eclipse.ecf.filetransfer.httpclient4.feature_3.9.1.v20140827-1444/asl-v20.txt
    -rw-r--r--. 1 10143 10143 42 1月  15 2017 ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/visualvm/platform/VERSION.txt
    -rw-r--r--. 1 10143 10143 42 1月  15 2017 ./jdk-8u251-linux-x64/jdk1.8.0_251/lib/visualvm/profiler/VERSION.txt
    

    以上是比较常用的操作,通过管道将多个命令结合使用。

    命名管道

    下面仅简单介绍命名管道,对命名管道感兴趣可点击《Linux进程间通信——使用命名管道》这篇博客。我觉得写的还不错。该作者还有一篇是《Linux进程间通信——使用匿名管道》。有兴趣可升华下相关内容。

    参考博客

    1. 《Linux管道命令(pipe)》,作者: mxjsxz,发表时间:2018.07.01 21:17:22;
    2. 《linux mkfifo命令基本用法》,作者:故道丶白云
    3. 《Linux mkfifo初学者命令教程(带示例)》,来自howtoing.com

    1. 引用与《介绍 Linux 中的管道和命名管道》,作者: Archit Modi,译者: LCTT geekpi。

    相关文章

      网友评论

        本文标题:Linux 常用命令(三)

        本文链接:https://www.haomeiwen.com/subject/kwrqnhtx.html