美文网首页
Linux进程管理

Linux进程管理

作者: 含盐量过高的鱼 | 来源:发表于2019-01-14 20:38 被阅读0次

    sleep : 休眠指定的时间
    ctrl + z :可以将一个正在前台执行的命令放到后台,并且暂停
    fg :将后台中的命令调至前台继续运行,(Foreground)
    bg :将进程搬到后台运行(Background)或将后台暂停的命令变成继续执行
    jobs :查看当前有多少在后台运行的命令
    & :这个用在一个命令的最后,可以把这个命令放到后台执行(通常配合nohup使用)
    nohup :不挂断地运行命令
    top :动态显示所有的进程
    ps :列出当前所有正在运行的进程
    kill :终止进程
    ctrl + c :结束命令的执行

    sleep : 暂停指定的时间

    我现在是让休眠30秒,可以看到命令执行后并没有把客户端的shell提示符返还给我,说明正在休眠


    image.png
    image.png

    ctrl + z :将一个正在前台执行的命令放到后台,并且暂停
    通过bg %jobnumber 即可将暂停的job的状态由stopped改为running,仍在后台执行;当需要改为在前台执行时,执行命令fg %jobnumber 即可。

    可以看到sleep 30这个命令暂停执行,并且返回一个后台的进程号

    image.png

    fg :将后台中的命令调至前台继续运行,(Foreground)
    如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid号)
    bg :将作业放到后台运行,使前台可以执行其他任务,且可将后台暂停的命令变成继续执行 (注意:实际上,使用bg命令与在指令后面添加符号"&"的效果是一样的)

    sleep 60
    # 按ctrl z 键,暂停命令
    sleep 60
    # 按ctrl z 键,暂停命令
    sleep 120
    # 按ctrl z 键,暂停命令
    jobs 
    # 查看后台进程,可以看到后台当前有三个命令暂停
    fg %1 
    #把后台暂停的1号工作调到前台,但因为60秒时间已经到了,所以说这个把这个命令调到前台后直接就返回了shell 提示符
    fg %2
    #把后台暂停的2号工作调到前台,继续执行休眠命令,所以说不返回shell提示符,只能暂停或结束sleep命令才能返回shell提示符
    fg %3
    #同理
    jobs
    #查看当前后台进程,只剩两个,但是进程号不会改变(这个号码不是动态的,是唯一的对应于一个进程)
    
    image.png

    提交后台进程

    方法一(最常用)

    nohup Command(要执行的命令) & :提交后台进程
    & :这个用在一个命令的最后,可以把这个命令放到后台执行,但一般的普通程序即使使用 & 结尾,把任务放到了后台,shell提示符返还给你,你能继续输入命令来进行别的工作,但如果此时你有事需要离开,要关闭你的客户端,那么后台运行的任务也会被关闭。为了能够后台运行,我们需要使用nohup这个命令,在命令前加上nohup,即便客户端关闭,你提交的任务也可以继续在后台运行,所以一般这两个命令连用来提交后台任务。

    如果使用nohup命令提交作业,那么命令的执行情况的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件,无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。

    image.png
    提交后台成功,会返回一个PID号,ps可以查看进程。图中由于我的文件小,运行时间太短,查看进程时已经结束。(命令显示位“Done”)
    换个大点的文件,运行时间长的,我们再来看下:
    nohup fastq-dump --gzip --split-3 -O ~/text/tmp ~/text/SRR1039508.sra &
    
    image.png
    提交成功会出现一个PID号,可以看到这个PID号跟topps查看进程时显示的一致,PID号和进程是一一对应的,kill+PID 号就能终止这个后台进程
    image.png image.png
    方法二

    如果一个要长时间运行的命令,我们忘记提交后台运行了,而此时又需要做其他的事(当然你可以再开一个窗,但这里讲的是你在同一个窗口下该怎么做)
    此时你可以ctrl+z然后再执行bg命令,把任务搬到后台。(注意:因为没有nohup,此时不能关闭客户端)

    bin=fastq-dump
    dir=/home/yjzhang/scRNA-seq
    ls /home/yjzhang/scRNA-seq/sra/SRR6791478 |while read id ;do $bin --gzip --split-3 -O $dir/raw $id ;done
    ctrl +z
    jobs
    ps -ef |grep yjzhang
    bg %1
    jobs
    ps -ef |grep yjzhang
    exit
    ps -ef |grep yjzhang
    
    image.png
    image.png
    exit中断服务器连接与直接关闭客户端中断与服务器的连接不一样,第二种方法提交到后台的任务,exit退出与服务器连接的时候,提交的任务仍能在后台运行,而直接关闭客户端退出,这时候bg提交的任务很大可能会终止(应为这个bg就相等于在命令后面加了& ),但有时候也不终止(同样的命令用git登陆服务器执行时会终止,用xshell登陆时执行,退出后就不终止),为了保险起见,推荐使用第一种方法
    image.png

    kill :发送信号给一个或多个进程(经常用来杀死一个进程)
    kill +PID号 #杀死单个进程
    ps -ef | grep yjzhang|awk '{print 2}' |while read id; do killid; done #批量杀死所有用户名为 yjzhang 提交的进程

    image.png

    查看线程
    top 统计信息前五行是系统整体的统计信息

    top查看线程默认显示是Tasks(任务,进程),加-H参数才显示的是线程(Threads)

    image.png

    top - 21:25:38 up 2 days, 2 user, load average: 0.08, 0.03, 0.00

    1、第一行是任务队列信息 同uptime质性命令结果一样。
    21:25:38 up 2 days 2 user load average: 0.08, 0.03, 0.00
    当前时间 up:系统运行时间 当前登陆的用户数 系统负载,即任务队列的平均长度,三个数值分别表示距离现在1分钟,5分钟,15分钟的负载情况
    21时25分28秒 2天 当前2个用户登陆 1分钟前负载为0.08;5分钟前负载为0.03;15分钟前负载为0.00

    注:load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

    Tasks: 178 total, 1 running, 177 sleeping, 0 stopped, 0 zombie
    %Cpu(s): 1.2 us, 0.1 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

    2、第二行、三行为进程和 CPU 的信息。当有多个 CPU 时,内容可能超过两行。
    Tasks 178 total 1 running 177 sleeping 0 stopped 0 zombie
    进程(任务) 进程总数 正在运行的进程数 休眠(挂起)的进程数 停止的进程数 僵尸进程数
    %Cpu(s) 1.2 us 0.1 sy 0.0 ni 99.7 id 0.0 wa 0.0 hi 0.0 si 0.0 st
    CPU 占用率 (user) 用户空间占用cpu的百分比 内核空间占用cpu的百分比 niced 改变过优先级的进程占用cpu的百分比 空闲 CPU 百分比 IO wait IO等待占用cpu的百分比 Hardware IRQ 硬中断占用cpu的百分比 software 软中断占用cpu的百分比 Steal Time

    注: CPU%是由每个核的 CPU 占用率之和算出来的。如果你是 4 核 CPU,核 1,CPU 使用率为100%,核 2,CPU 使用率为100%,则会CPU 高于100%的现象,最终为200%。

    - H参数后第二行显示为Threads
    Threads 232 total :目前线程总数232

    image.png

    KiB Mem : 16300688 total, 422428 free, 291988 used, 15586272 buff/cache
    KiB Swap: 0 total, 0 free, 0 used. 15599052 avail Mem

    3.第四、五行为内存使用信息
    Mem 16300688 total 422428 free 291988 used 15586272 buff/cache
    物理内存 物理内存总量 空闲物理内存 使用的物理内存总量 内核缓存内存量
    物理总内存16300688k(约16G) 422428k(约0.4G)空闲 291988k(约0.27G)在使用 15586272k用于缓存
    Swap 0 total 0 free 0 used 15599052 avail Mem
    交换分区 交换分区总量 可用交换空间 使用中的交换空间总量 缓冲的交换区总量

    注:交换分区(Swap)被频繁使用,可以看作物理内存不足而造成的

    具体进程信息

    第六行
    PID USER PR NI VIRT RES
    进程id 进程所有者 进程优先级 nice值。负值表示高优先级,正值表示低优先级 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    SHR S %CPU %MEM TIME+ COMMAND
    共享内存大小,单位kb 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 上次更新到现在的CPU时间占用百分比 进程使用的物理内存百分比 进程使用的CPU时间总计,单位1/100秒 进程名称(命令名/命令行)

    查看一个进程所调用的线程
    进程概念:
      进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。
    线程概念:
      线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。

    image.png

    可以看到我的一个任务调用了8个线程


    image.png

    这个调用了6个线程

    服务器配置的查询

    lscpu #查询CPU详细信息
    cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l #查讯物理CPU个数
    cat /proc/cpuinfo| grep "cpu cores"| uniq #查讯每个物理CPU中core的个数(即核数)
    cat /proc/cpuinfo| grep "processor"| wc -l #查讯逻辑CPU的个数(线程)
    
    image.png

    CPU(s):逻辑上(模拟出的)CPU个数
    Thread(s) per core :每个核心的线程数 (查询结果显示我的是每个核心一个线程)
    Core(s) per socket :每个物理CPU上的核心数
    Model name :CPU型号
    说明我用这个服务器是1个CPU,8个物理核心8个线程(即8核单线程)

    补充:
    CPU个数即CPU芯片个数。
    CPU的核心数是指物理上,也就是硬件上存在着几个核心。比如,双核就是包括2个相对独立的CPU核心单元组,四核就包含4个相对独立的CPU核心单元组。
    线程数是一种逻辑的概念,简单地说,就是模拟出的CPU核心数。比如,可以通过一个CPU核心数模拟出2线程的CPU,也就是说,这个单核心的CPU被模拟成了一个类似双核心CPU的功能。(注:CPU的线程和进程中的线程概念不一样,CPU线程是模拟出来的核心数,进程中的线程是要完成一个任务所调用的子任务数)

    综上来说,在提交一个任务的时候我们要查看一下CPU的使用情况和设置适当的线程数,不要超过限度


    学生信,友情推荐:

    相关文章

      网友评论

          本文标题:Linux进程管理

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