Linux进程管理

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 id; 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的使用情况和设置适当的线程数,不要超过限度


学生信,友情推荐:

  • 生信技能树微信公众号:biotrainee
  • 生信菜鸟团 http://www.bio-info-trainee.com/
  • 生信技能树 http://www.biotrainee.com/
  • 生信技能树VIP社区:https://vip.biotrainee.com
  • 知识星球: https://t.zsxq.com/VjmQZNn
  • 腾讯课堂: https://biotree.ke.qq.com/
  • 生信技能树的b站:https://space.bilibili.com/338686099?spm_id_from=333.788.b_765f7570696e666f.1

你可能感兴趣的:(Linux进程管理)