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
这个命令暂停执行,并且返回一个后台的进程号
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 参数指定的命令不可调用。
提交后台成功,会返回一个PID号,
ps
可以查看进程。图中由于我的文件小,运行时间太短,查看进程时已经结束。(命令显示位“Done”)换个大点的文件,运行时间长的,我们再来看下:
nohup fastq-dump --gzip --split-3 -O ~/text/tmp ~/text/SRR1039508.sra &
image.png
提交成功会出现一个PID号,可以看到这个PID号跟
top
,ps
查看进程时显示的一致,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
image.pngkill :发送信号给一个或多个进程(经常用来杀死一个进程)
kill +PID号 #杀死单个进程
ps -ef | grep yjzhang|awk '{print id; done #批量杀死所有用户名为 yjzhang 提交的进程
查看线程
top 统计信息前五行是系统整体的统计信息
top
查看线程默认显示是Tasks(任务,进程),加-H
参数才显示的是线程(Threads)
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
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秒 | 进程名称(命令名/命令行) |
image.png查看一个进程所调用的线程
进程概念:
进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。
线程概念:
线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。
可以看到我的一个任务调用了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
网友评论