zoukankan      html  css  js  c++  java
  • 正式班D23

    2020.11.05星期四  正式班D23

    12.3.3 HUP信号

    • 在关闭终端时,终端会收到Linux HUP信号(hangup信号),关闭其所有子进程。

    • 想让进程一直在后台运行不受关闭终端的影响,有以下四种方案:

      nohup

      在命令前加上nohup,就会从终端解除进程的关联

      同时在结尾加上&来将命令放入后台运行

      # 1、在终端1输入
      [root@ccc ~]# nohup ping baidu.com &>/dev/null &
      [root@ccc ~]# ps -elf | grep [p]ing  # 查看进程
      4 S root       2034   1979  0  80   0 - 37522 poll_s 15:11 pts/4    00:00:00 ping baidu.com
                  
      # 2、关闭终端1
      
      # 3、在终端2查看
      [root@ccc ~]# ps -elf | grep [p]ing  # 查看进程,父进程变为1即systemd进程
      4 S root       2034      1  0  80   0 - 37522 poll_s 15:11 ?        00:00:00 ping baidu.com
      

      setsid

      原理与nohup一致,但setsid直接将进程的父PID设为1,即让运行的进程归属init的子进程

      除非init结束,该子进程才会结束。当前终端结束不会影响进程的运行

      # 1、在终端1执行命令
      [root@ccc ~]# setsid ping baidu.com &>/dev/null &
      [1] 2062
      [root@ccc ~]# ps -elf | grep [p]ing
      4 S root       2063      1  0  80   0 - 37522 poll_s 15:19 ?        00:00:00 ping baidu.com
      [1]+  完成                  setsid ping baidu.com &>/dev/null
      
      # 2、关闭终端1
      
      # 3、在终端2查看
      [root@ccc ~]# ps -elf | grep [p]ing
      4 S root       2063      1  0  80   0 - 37522 poll_s 15:19 ?        00:00:00 ping baidu.com
      

      在子shell中启动进程

      命令加上括号

      # 1、在终端1输入命令
      [root@ccc ~]# (ping vaidu.com &>/dev/null &)
      [root@ccc ~]# ps -elf | grep [p]ing
      4 S root       2103      1  0  80   0 - 37522 poll_s 15:24 pts/4    00:00:00 ping vaidu.com
      
      # 2、关闭终端1
      
      # 3、在终端2查看
      [root@ccc ~]# ps -elf | grep [p]ing
      4 S root       2103      1  0  80   0 - 37522 poll_s 15:24 ?        00:00:00 ping vaidu.com
      

      screen

      让进程运行在新的会话里,从而成为不属于此终端的子进程,关闭终端不会被带走

      # 安装screen
      [root@ccc ~]# yum install screen -y
      
      # 用法1
      # 运行命令
      终端1输入命令
      [root@ccc ~]# screen vim 111.py
      [root@ccc ~]# ps -elf | grep [v]im
      4 S root 2154 2076 0 80 0 - 31934 sys_pa 15:43 pts/6 00:00:00 screen vim 111.py
      5 S root 2155 2154 0 80 0 - 31967 poll_s 15:43 ?     00:00:00 SCREEN vim 111.py
      4 S root 2156 2155 0 80 0 - 37444 poll_s 15:43 pts/2 00:00:00 vim 111.py
                  
      关闭终端1
      
      在终端2查看
      [root@ccc ~]# ps -elf | grep [v]im
      5 S root       2155      1  0  80   0 - 31967 poll_s 15:43 ?        00:00:00 SCREEN vim 111.py
      4 S root       2156   2155  0  80   0 - 37444 poll_s 15:43 pts/2    00:00:00 vim 111.py
      
      # 重新连接会话
      [root@ccc ~]# screen -ls
      There are screens on:
      	2155.pts-6.ccc	(Detached)
      	1678.pts-0.ccc	(Attached)
      2 Sockets in /var/run/screen/S-root.
      [root@ccc ~]# screen -r 2155
      
      # 用法2
      # 运行命令
      [root@ccc ~]# screen -S cjx_pm
      # screen会创建一个执行shell的全屏窗口。可执行任意shell程序
      # 输入exit退出该窗口(若该screen窗口唯一,则screen会话结束,否则切换到前一窗口)
      
      # 重新连接会话
      [root@ccc ~]# screen -r cjx_pm
      # 已经指定了名字,可以不用进程ID直接用名字
      
      # 测试
      [root@ccc ~]# screen
      [root@ccc ~]# n=1;while true;do echo $n;sleep 1;((n++));done;
      按下ctrl+a和ctrl+d
      此时整个终端关闭,进程并未结束
      [root@ccc ~]# screen -ls
      There are screens on:
      	2266.pts-4.ccc	(Detached)
      Remove dead screens with 'screen -wipe'.
      1 Sockets in /var/run/screen/S-root.
      [root@ccc ~]# screen -r 2266  # 进程依旧在运行
      
      # 远程演示
      在终端1
      [root@ccc ~]# screen -S cz
      
      在终端2执行的命令,终端1会同步显示
      [root@ccc ~]# screen -x cz
      

    12.4 查看网络状态

    • netstat

      [root@ccc ~]# netstat -tunlp
      Active Internet connections (only servers)
      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   844/sshd            
      tcp        0      0 127.0.0.1:25        0.0.0.0:*           LISTEN   922/master          
      tcp6       0      0 :::22               :::*                LISTEN   844/sshd            
      tcp6       0      0 ::1:25              :::*                LISTEN   922/master          
      udp        0      0 127.0.0.1:323       0.0.0.0:*                    532/chronyd         
      udp6       0      0 ::1:323             :::*                         532/chronyd       
                              
      -t  # tcp协议
      -u  # udp协议
      -l  # listen
      -p  # PID/Program name
      -n  # 不反解,不将IP地址解析为主机名,不将端口号解析成协议名
      
    • lsof:列出打开文件(lists openfiles)

      默认 : 没有选项,lsof列出活跃进程的所有打开文件
      组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数
      -a : 结果进行“与”运算(而不是“或”)
      -l : 在输出显示用户ID而不是用户名
      -h : 获得帮助
      -t : 仅获取进程ID
      -U : 获取UNIX套接口地址
      -F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)
          
      # 1、安装
      [root@ccc ~]# yum install -y lsof
      
      # 2、使用
      # -i显示所有连接
      [root@ccc ~]# lsof -i
      COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      chronyd  532 chrony    5u  IPv4  16273      0t0  UDP localhost:323 
      chronyd  532 chrony    6u  IPv6  16274      0t0  UDP localhost:323 
      sshd     844   root    3u  IPv4  19131      0t0  TCP *:ssh (LISTEN)
      sshd     844   root    4u  IPv6  19140      0t0  TCP *:ssh (LISTEN)
      master   922   root   13u  IPv4  19666      0t0  TCP localhost:smtp (LISTEN)
      master   922   root   14u  IPv6  19667      0t0  TCP localhost:smtp (LISTEN)
      sshd    2182   root    3u  IPv4  47242      0t0  TCP ccc:ssh->192.168.29.2:64066 (ESTABLISHED)
      # -i 6仅获取IPV6流量
      [root@ccc ~]# lsof -i 6
      COMMAND PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      chronyd 532 chrony    6u  IPv6  16274      0t0  UDP localhost:323 
      sshd    844   root    4u  IPv6  19140      0t0  TCP *:ssh (LISTEN)
      master  922   root   14u  IPv6  19667      0t0  TCP localhost:smtp (LISTEN)
      # -i:22仅获取22端口的连接
      [root@ccc ~]# lsof -i:22
      COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      sshd     844 root    3u  IPv4  19131      0t0  TCP *:ssh (LISTEN)
      sshd     844 root    4u  IPv6  19140      0t0  TCP *:ssh (LISTEN)
      sshd    2182 root    3u  IPv4  47242      0t0  TCP ccc:ssh->192.168.29.2:64066 (ESTABLISHED)
      # -i@host显示指定到主机的连接
      # -i@host:port显示基于主机与端口的连接
      # -u 用户 显示指定用户打开了什么
      # -u ^用户 显示除指定用户外其他所有用户做的事
      # kill -9 `lsof -t -u 用户`  消灭指定用户运行的所有东西
      # -c 命令  查看指定的命令正在使用的文件和网络连接
      # -p PID  查看指定进程ID已打开的内容
      # -t  只返回PID
      
    • netstat -an

      [root@ccc ~]# netstat -an 
      [root@ccc ~]# netstat -an | grep :22
      tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
      tcp        0     52 192.168.29.55:22        192.168.29.2:64066      ESTABLISHED
      tcp6       0      0 :::22                   :::*                    LISTEN  
      

    12.5 proc文件系统

    12.5.1 查看硬盘状态df

    • 显示目录或文件大小du

      [root@ccc ~]# du -sh /root
      96K	/root
      
    • 查看硬盘状态df

      [root@ccc ~]# df -h
      文件系统        容量  已用  可用 已用% 挂载点
      devtmpfs        476M     0  476M    0% /dev
      tmpfs           487M     0  487M    0% /dev/shm
      tmpfs           487M  7.6M  479M    2% /run
      tmpfs           487M     0  487M    0% /sys/fs/cgroup
      /dev/sda3       7.7G  6.3G  1.5G   82% /
      /dev/sda1       473M  123M  351M   26% /boot
      tmpfs            98M     0   98M    0% /run/user/0
      
      [root@ccc ~]# df -T
      文件系统       类型       1K-块    已用    可用 已用% 挂载点
      devtmpfs       devtmpfs  487140       0  487140    0% /dev
      tmpfs          tmpfs     497840       0  497840    0% /dev/shm
      tmpfs          tmpfs     497840    7756  490084    2% /run
      tmpfs          tmpfs     497840       0  497840    0% /sys/fs/cgroup
      /dev/sda3      xfs      8034304 6529180 1505124   82% /
      /dev/sda1      xfs       484004  125552  358452   26% /boot
      tmpfs          tmpfs      99572       0   99572    0% /run/user/0
      

    12.5.2 查看内存状态free

    • 内存:/proc/meminfo

      [root@ccc ~]# less /proc/meminfo 
      
    • free

      [root@ccc ~]# free
                    total        used        free      shared  buff/cache   available
      Mem:         995684      148580      454780        7756      392324      655336
      Swap:       1952764           0     1952764
      
      [root@ccc ~]# free -m
                    total        used        free      shared  buff/cache   available
      Mem:            972         145         444           7         383         639
      Swap:          1906           0        1906
      
      [root@ccc ~]# free -wm
                    total        used        free      shared     buffers       cache   available
      Mem:            972         144         444           7           2         381         640
      Swap:          1906           0        1906
      
      # free指当前完全没有被程序使用的内存
      # cache在有需要的时候可以被释放出来供其他进程使用(不是释放所有)
      # available是真正表明系统目前提供给新启动程序的内存
      
    • 释放内存

      [root@ccc ~]# free
                    total        used        free      shared  buff/cache   available
      Mem:         995684      148580      454780        7756      392324      655336
      Swap:       1952764           0     1952764
      [root@ccc ~]# cat /proc/sys/vm/drop_caches 
      0
      [root@ccc ~]# echo 3>/proc/sys/vm/drop_caches
      [root@ccc ~]# free
                    total        used        free      shared  buff/cache   available
      Mem:         995684      148012      453520        7756      394152      655904
      Swap:       1952764           0     1952764
      
    • 内核启动参数

      [root@ccc ~]# cat /proc/cmdline 
      BOOT_IMAGE=/vmlinuz-3.10.0-1127.el7.x86_64 root=UUID=b43c52c4-89a7-48d2-83e4-6e8d35553e64 ro spectre_v2=retpoline rhgb quiet LANG=zh_CN.UTF-8
      [root@ccc ~]# uptime
       17:29:15 up  6:35,  2 users,  load average: 0.00, 0.01, 0.05
      
    • 卸载/proc及重新挂载

      [root@ccc ~]# umount /proc/ -l  # 卸载
      [root@ccc ~]# free -m  # free -m、uptime、lscpu、toop都用不了
      Error: /proc must be mounted
        To mount /proc at boot you need an /etc/fstab line like:
            proc   /proc   proc    defaults
        In the meantime, run "mount proc /proc -t proc"
      [root@ccc ~]# mount -t proc proc /proc/  # 重新挂载
      

    12.5.3 查看CPU状态lscpu

    • CPU:/proc/cpuinfo

      [root@ccc ~]# grep "processor" /proc/cpuinfo | wc -l  # 逻辑CPU个数
      1
      [root@ccc ~]# grep "physical id" /proc/cpuinfo | wc -l  # 物理CPU个数
      1
      [root@ccc ~]# grep "cpu cores" /proc/cpuinfo | wc -l  # CPU核数
      1
      [root@ccc ~]# cat /proc/cpuinfo   # 查看cpu信息
      [root@ccc ~]# lscpu
      

    12.6 管理后台进程(了解)

    • 了解即可

      [root@ccc ~]# sleep 5000 &  					# 后台运行
      [1] 4487
      [root@ccc ~]# sleep 4000 						# 前台运行
      ^Z												# ctrl+z停止
      [2]+  已停止               sleep 4000
      [root@ccc ~]# jobs								# []编号是作业编号
      [1]-  运行中               sleep 5000 &
      [2]+  已停止               sleep 4000
      [root@ccc ~]# bg %2								# 让作业2在后台运行
      [2]+ sleep 4000 &
      [root@ccc ~]# jobs
      [1]-  运行中               sleep 5000 &
      [2]+  运行中               sleep 4000 &
      [root@ccc ~]# fg %1								# 将作业1调回到前台
      sleep 5000
      ^C												# ctrl+c终止
      [root@ccc ~]# jobs
      [2]+  运行中               sleep 4000 &
      [root@ccc ~]# kill %2							# 杀死作业2
      [root@ccc ~]# jobs
      [2]+  已终止               sleep 4000
      [root@ccc ~]# jobs
      

    12.7 管道

    12.7.1 管道概念

    • 管道用于进程间的通信
    • 管道操作符号"|"主要用于连接左右两个命令。将左边的命令标准输出,交给右侧命令的标准输入
    • 无法传递标准错误输出至后者命令
    • 格式:cmd1 | cmd2[... | cmdn]

    12.7.2 xargs

    • 参数传递,让一些不支持管道的命令可以使用管道技术

      [root@ccc ~]# which cat
      /usr/bin/cat
      [root@ccc ~]# which cat | xargs ls -l
      -rwxr-xr-x. 1 root root 54080 8月  20 2019 /usr/bin/cat
      

    12.7.3 实例

    • 统计当前/etc/passwd中用户使用的shell类型

      [root@ccc ~]# awk -F: '{print $7}' /etc/passwd | sort | uniq -c
            4 /bin/bash
            1 /bin/sync
            1 /sbin/halt
           17 /sbin/nologin
            1 /sbin/shutdown
      
    • 打印当前所有的IP

      [root@ccc ~]# ip addr | grep 'inet' | awk '{print $2}' |awk -F"/" '{print $1}'
      127.0.0.1
      ::1
      192.168.29.55
      fe80::20c:29ff:fec0:5db3
      
    • 打印根分区已用空间百分比(仅数字)

      [root@ccc ~]# df -P | grep '/$' |awk '{print $5}' | awk -F"%" '{print $1}'
      82
      

    12.7.4 管道中的tee技术

    • -a # 追加

      [root@ccc ~]# ip addr | grep 'inet' | awk '{print $2}' |awk -F"/" '{print $1}' | tee ip.txt
      127.0.0.1
      ::1
      192.168.29.55
      fe80::20c:29ff:fec0:5db3
      [root@ccc ~]# cat ip.txt 
      127.0.0.1
      ::1
      192.168.29.55
      fe80::20c:29ff:fec0:5db3
      
    • 重定向与tee的区别

      [root@ccc ~]# date > date.txt			# 直接将内容写入到date.txt文件中
      [root@ccc ~]# date | tee date.txt		# 执行结果输出至屏幕,且保存至文件
      2020年 11月 05日 星期四 18:57:32 CST
      

    12.8 僵尸进程与孤儿进程

    12.8.1 僵尸进程

    • 操作系统负责管理进程,应用程序想开子进程都是在像操作系统发送系统调用。

      当子进程死掉以后,操作系统会将子进程占用的重型资源(如内存空间、cpu资源、打开的文件等)

      Linux的机制会保留子进程的进程号、退出状态、运行时间等供父进程查看

      僵尸进程是Linux系统的一种数据结构,所有子进程结束后都会进入僵尸进程的状态

    • 父进程觉得僵尸进程的数据没用以后,由父进程发起一个系统调用wait/waitpid来通知操作系统清理僵尸进程的残余状态

      # 三种情况:
      # 1、Linux系统自带的优秀的开源软件,在开启子进程时,父进程内部都会及时调用wait/waitpid来通知操作系统回收僵尸进程。因此我们通常看不到优秀开源软件堆积僵尸进程,因为及时回收
      
      # 2、水平良好的程序员开发的应用程序,会在父进程内考虑调用wait/waitpid来通知操作系统回收僵尸进程,但发起系统调用时间可能慢一些,可以用命令看到僵尸进程状态
      [root@ccc ~]# ps aux | grep [z]+
      
      # 3、垃圾程序员不知道僵尸进程是什么,操作系统中就会堆积很多僵尸进程,会导致内存充足、硬盘充足、cpu空闲,但新软件无法启动起来的状况。因为僵尸进程会占用大量的PID
      针对情况三,只有杀死父进程,僵尸进程就会由pid为1的顶级进程(init或systend)接手,顶级进程会定期发起系统调用wait/waitpid来通知操作系统清理僵尸进程。
      针对情况二,可以发送信号给父进程,通知他发起系统调用清理僵尸进程
      kill -CHLD 父进程PID
      

    12.8.2 孤儿进程

    • 父进程先死掉,而他的一个或多个子进程还在运行,这些子进程就会成为孤儿进程。
    • 孤儿进程会被PID为1的顶级进程接手
    • nohup、setsid原理就类似制造孤儿进程
  • 相关阅读:
    rn 安卓开发报错
    rn 打包如果真机或者模拟机打包编译报错
    fluter 导航以及其他
    fluter 相关布局组件
    fluter 万事皆组件。常用组件
    rn开发问题简要
    app配置环境和打包方式以及其他问题
    小程序大概的开发流程
    ant-design-pro 开发 基于react 框架涉及到技术你的本地环境需要安装 yarn、node 和 git。我们的技术栈基于 ES2015+、React、UmiJS、dva、g2 和 antd,
    unity打包的webgl结合react使用
  • 原文地址:https://www.cnblogs.com/caojiaxin/p/13933747.html
Copyright © 2011-2022 走看看