1. Linux系统状态的查看及管理工具

1. Linux系统状态的查看及管理工具

pstree, ps, pidof, pgrep, top, htop,glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup

2. pstree命令—{pstree}

pstree : display a tree of processes

3. ps 查看进程—{ps}

ps: process state

  • ps report a snapshot of the current processes :查看ps命令执行时的进程快照
  • Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
ps [OPTION]... 支持三种选项: UNIX选项 如-A -e BSD选项 如a GNU选项 如--help - 选项: :不加任何选项时,默认显示**链接到当前终端中的进程**,无法显示别的终端中进程 a :选项包括链接到所有终端中的进程 x :选项包括不链接终端的进程 u :选项显示进程所有者的信息 f :选项显示进程树,相当于 --forest L :显示支持的属性列表 o 属性… :显示定制的信息 pid、 cmd、 %cpu、 %mem k|--sort 属性 :对属性排序,属性前加- 表示倒序 比如 ps aux k -%cpu ,注意后面的关键字要小写不能大写

3.1. 短格式(unix)特有选项

-C cmdlist :指定查看某个特定命令(cmdlist命令),多个命令查看的话用逗号,分隔 - 此选项也可以查看脚本,但要注意用 bash XXX.sh 方式运行的脚本无法查看, 同时如果脚本中没有 #!/bin/bash 就算是直接运行的脚本也无法查看了。 -L 显示线程 : pstree中花括号内就是线程,如果没有花括号代表进程只有一个线程(此命令就会显示进程了) -e: 显示所有进程,相当于-A -f: 显示完整格式程序信息 -F: 显示更完整格式的进程信息 -H: 以进程层级格式显示进程相关信息 -u userlist :指定有效的用户ID或名称 -U userlist :指定真正的用户ID或名称 -g gid或groupname :指定有效的gid或组名称 -G gid或groupname :指定真正的gid或组名称 -p pid :显示指pid的进程 --ppid pid :显示属于pid的子进程 -M :显示SELinux信息,相当于Z
  • 注意:有效用户和真正用户区别,真正用户是指执行此进程的用户realuser,而有效用户代表此进程执行的的权限用户
    • 比如普通用户执行passwd命令,真正用户为普通用户,但有效用户为root。(组类似)
    • ps axo pid,cmd,user,ruser,euser ,其中 user和euser 相同意义,代表有效权限用户 ,ruser代表真正执行用户

3.2. ps 输出属性

VSZ: Virtual memory SiZe,虚拟内存集,线性内存 - 进程向操作系统申请的内存,它的数值可以很大,但并非全部都使用,是个虚拟内存,按照进程自己定义的地址方式来寻址使用 RSS: ReSident Size, 常驻内存集 - 内核真正分配的内存大小,常驻内存 STAT:进程状态 R:running S: interruptable sleeping D: uninterruptable sleeping T: stopped Z: zombie +: 前台进程 l: 多线程进程 L:内存分页并带锁 N:低优先级进程 <: 高优先级进程 s: session leader,会话(子进程)发起者 START:进程启动的时间,和date相关 TIME:此进程启动后运行所占的时间片累计总时间

3.3. PS中优先级类别

ni(或者nice): nice值 pri: priority 优先级 psr: processor CPU编号 rtprio: 实时优先级

3.3.1. 附加知识(优先级命令)—{renice,nice,chrt}:

  1. renice -n -10(优先级-20~19) 8814(PID),修改进程nice优先级
  2. nice -n -5 ping 1.1.1.1 :直接指定命令的nice优先级,(默认为0改为-5) 3.chrt 修改实时优先级,不过一般不调整它,它是系统自动分配设置的,一般只修改nice用户级别的优先级
    • 注意: pri优先级应该是和前面图中系统优先级刚好相反;不过有一个特例就是当realtime优先级为0时,它也为0,而不是40,其他的都还符合。
    • 此项解释并不完全准确,具体准确的解释可以看官方文档解释(博客收藏)。

3.3.1.1. 优先级示例:

ps axo pid,cmd,psr,ni,pri,rtprio

常用组合:

aux -ef -eFH -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

3.4. ps示例:

  1. 查询你拥有的所有进程
    ps -x
  2. 显示指定用户名(RUID)或用户ID的进程
    ps -fU apache
    ps -fU 48
  3. 显示指定用户名(EUID)或用户ID的进程
    ps -fu wang
    ps -fu 1000
  4. 查看以root用户权限(实际和有效ID)运行的每个进程
    ps -U root -u root
  5. 列出某个组拥有的所有进程(实际组ID:RGID或名称)
    ps -fG nginx
  6. 列出有效组名称(或会话)所拥有的所有进程
    ps -fg mysql
    ps -fg 27
  7. 显示指定的进程ID对应的进程
    ps -fp 1234
  8. 以父进程ID来显示其下所有的进程,如显示父进程为1234的所有进程
    ps -f --ppid 1234
  9. 显示指定PID的多个进程
    ps -fp 1204,1239,1263
  10. 要按tty显示所属进程
    ps -ft pts/0
  11. 以进程树显示系统中的进程如何相互链接
    ps -e --forest
  12. 以进程树显示指定的进程
    ps -f --forest -C sshd
    ps -ef --forest | grep -v grep | grep sshd
  13. 要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进程数)列
    ps -fL -C nginx
  14. 要列出所有格式说明符
    ps L
  15. 查看进程的PID,PPID,用户名和命令
    ps -eo pid,ppid,user,cmd
  16. 自定义格式显示文件系统组,ni值开始时间和进程的时间
    ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime
  17. 使用其PID查找进程名称:
    ps -p 1244 -o comm=
  18. 要以其名称选择特定进程,显示其所有子进程
    ps -C sshd,bash
  19. 查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时这个参数很有用
    ps -C httpd,sshd -o pid=
  20. 检查一个进程的执行时间
    ps -eo comm,etime,user | grep nginx
  21. 查找占用最多内存和CPU的进程
    ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
  22. 显示安全信息
    ps -eM
    ps --context
  23. 使用以下命令以用户定义的格式显示安全信息
    ps -eo euser,ruser,suser,fuser,f,comm,label
  24. 使用watch实用程序执行重复的输出以实现对就程进行实时的监视,如下面的命令显示每秒钟的监视
    watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'

4. 进程优先级—{renice,nice,chrt}

4.1. 进程优先级调整

  • 静态优先级:100-139
  • 进程默认启动时的nice值为0,优先级为120
  • 只有根用户才能降低nice值(提高优先性)

4.2. nice命令

nice [OPTION] [COMMAND [ARG]...]

4.3. renice命令

renice [-n] priority pid...

4.4. 查看

ps axo pid,comm,ni

5. 搜索进程—{lsof,pidof,pgrep,ps|grep}

  1. 最灵活方式:ps 选项 | 其它命令
  2. 按预定义的模式:pgrep
pgrep [options] pattern -u uid|用户名: effective user,生效者 -U uid|用户名: real user,真正发起运行命令者 -t terminal: 与指定终端相关的进程 -l: 显示进程名详细信息 例如:pgrep -lt pts/1 -a: 显示完整格式的进程名(更多详细信息) -P pid: 显示指定进程的**子进程** - 更多详细内容查看帮助即可
  1. 按确切的程序名称:/sbin/pidof pidof bash
    • 注意它和lsof区别,lsof跟的是被打开的文件(或者程序,因为程序也是文件),pidof跟的就是进程名(程序如果没运行不是进程)

5.1. 例子:

pgrep -lU zhang pgrep -aU zhang pgrep -P 1 pgrep -at pts/1 pgrep -f sshd pidof bash

5.2. Pidof更多用法

pidof 进程名 : 通过查看上面命令的$? 值可以判断进程是否停止运行了,因此就可以编写脚本监测必须运行的进程,一旦发现停止立马重新启动(配合计划任务使用极佳,当然也可以用killall 0 的方式也可)

例如:如果ping命令没有执行,则ping 127.0.0.1,如果ping命令已经执行(不管ping的IP地址是什么),则不执行ping 127.0.0.1

pidof ping &> /dev/null || ping 127.0.0.1

6. uptime, w 命令—{uptime,w}

  1. /proc/uptime 包括两个值,单位 s秒
    系统启动时长,空闲进程的总时长(按总的CPU核心数计算)
  2. uptimew
    显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(当前时间往前1、 5、 10分钟的平均负载,一般不会超过1)
  3. 系统平均负载:
    指在特定时间间隔内运行队列中的平均进程数
    • 通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。 如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题
    • 如果linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被充分使用

7. top命令—{top}

7.1. 排序:

P:以占据的CPU百分比,%CPU M:占据内存百分比,%MEM T:累积占据CPU时长,TIME+

7.2. 首部信息显示:

uptime信息:l命令 tasks及cpu信息:t命令 cpu分别显示:1 (数字) memory信息:m命令 退出命令:q 修改刷新时间间隔:s 终止指定进程:k 保存文件:W

7.3. 栏位信息简介:

us:用户空间 sy:内核空间 ni:调整nice时间 id:空闲 wa:等待IO时间 hi:硬中断 si:软中断(模式切换) st:虚拟机偷走的时间(虚拟化技术不成熟时期,不知道CPU的时间片执行了什么进程)

7.4. 选项:

-d # 指定刷新时间间隔,默认为3秒 -b 全部显示所有进程 -n # 刷新多少次后退出 -H 线程模式,示例:top -H -p \`pidof mysqld\`

8. htop命令:EPEL源—{htop}

8.1. 选项:

-d #: 指定延迟时间; -u UserName: 仅显示指定用户的进程 -s COLUME: 以指定字段进行排序

8.2. 子命令:

s:跟踪选定进程的系统调用 l:显示选定进程打开的文件列表 a:将选定的进程绑定至某指定CPU核心 t:显示进程树

9. free 内存空间使用状态—{free}

free [option]

-b 以字节为单位 -m 以MB为单位 -g 以GB为单位 -h 易读格式 -o 不显示-/+buffers/cache行 -t 显示RAM + swap的总和 -s n 刷新间隔为n秒 -c n 刷新n次后即退出

9.1. 注意bufer和cache区别

  1. 简单来说一个注重写一个注重读,具体更详细参考 https://www.zhihu.com/question/26190832/answer/146259979
  2. 注意磁盘挂载的时候有选项可直接写入硬盘 mount -o sync ,还有dd命令的直接写入不写内存的conv选项,同时TCP协议中报头数据psh位置也是表示内存是否立即取走。

10. vmstat命令:虚拟内存信息—{vmstat}

vmstat [options] [delay [count]] vmstat 2 5

10.1. procs:

r:可运行(正运行或等待运行)进程的个数,和核心数有关 b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度),比如正在读取磁盘文件的进程(IO接口速度慢,需要耗费时间)

10.2. memory:

swpd: 交换内存的使用总量 free:空闲物理内存总量 buffer:用于buffer的内存总量 cache:用于cache的内存总量

10.3. swap:(注意是相对于内存的进和出来说的,磁盘进出下同)

si:从磁盘交换进内存的数据速率(kb/s) so:从内存交换至磁盘的数据速率(kb/s)

10.4. io:

bi:从块设备读入数据到系统的速率(kb/s) bo: 保存数据至块设备的速率
dd if=/dev/zero of=/dev/null bs=2G :则swap中 so先涨,然后si再涨 dd if=/dev/sda of=/dev/null :则io中的bi 涨 ,bo不变 dd if=/dev/zero of=/dev/sda1/bigfile :则io中的bi不变 ,bo涨

10.5. system:

in: interrupts 中断速率,包括时钟 cs: context switch 进程切换速率

10.6. cpu:

us:Time spent running non-kernel code sy: Time spent running kernel code id: Time spent idle. Linux 2.5.41前,包括IO-wait time. wa: Time spent waiting for IO. 2.5.41前,包括in idle. st: Time stolen from a virtual machine. 2.6.11前, unknown.

10.7. 选项:

-s: 显示内存的统计数据

11. iostat:统计CPU和设备IO信息—{iostat}

示例:iostat 1 10

12. iftop:显示带宽使用情况,EPEL源—{iftop}

示例:iftop -n -i eth1

13. pmap命令:进程对应的内存映射—{pmap}

查看进程占用了哪些内存空间,地址从哪到哪,以及一些调用的库函数

pmap [options] pid [...] -x: 显示详细格式的信息

示例:

  • pmap 1

另外一种实现

  • cat /proc/PID/maps

用pmap来判断内存问题,看某个程序的内存占用是否一直增长判断它内存泄露

  • 内存泄露:进程执行完毕不释放所占的内存空间
  • 内存溢出:进程申请执行时所用的内存空间不够,直接霸占更多的内存空间进行使用(可能影响其他进程,如果多霸占的内存空间正好被其他进程使用中)

14. glances命令:EPEL源—{glances}

glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]

14.1. 内建命令:

a Sort processes automatically c Sort processes by CPU% m Sort processes by MEM% p Sort processes by name i Sort processes by I/O rate d Show/hide disk I/O stats f Show/hide file system stats n Show/hide network stats s Show/hide sensors stats y Show/hide hddtemp stats l Show/hide logs b Bytes or bits for network I/O w Delete warning logs x Delete warning and critical logs 1 Global CPU or per-CPU stats h Show/hide this help screen t View network I/O as combination u View cumulative network I/O q Quit (Esc and Ctrl-C also work)

14.2. 常用选项:

-b: 以Byte为单位显示网卡数据速率 -d: 关闭磁盘I/O模块 -f /path/to/somefile: 设定输入文件位置 -o {HTML|CSV}:输出格式 -m: 禁用mount模块 -n: 禁用网络模块 -t #: 延迟时间间隔 -1:每个CPU的相关数据单独显示

14.3. C/S模式下运行glances命令

  1. 服务器模式:
    glances -s -B IPADDR
    IPADDR: 指明监听的本机哪个地址
  2. 客户端模式:
    glances -c IPADDR
    IPADDR:要连入的服务器端地址
  • 注意两个主机上都要装有glances工具,并且版本要一致(6和6,7和7),然后开启服务器的监听功能之后,客户机就可以随时连接监听服务器端了。

15. dstat命令—{dstat}

  • 系统资源统计,代替vmstat,iostat
dstat [-afv] [options..] [delay [count]] -c 显示cpu相关信息 -C #,#,...,total -d 显示disk相关信息 -D total,sda,sdb,... -g 显示page相关统计数据 -m 显示memory相关统计数据 -n 显示network相关统计数据 -p 显示process相关统计数据 -r 显示io请求相关的统计数据 -s 显示swapped相关的统计数据 --tcp --udp --unix --raw --socket --ipc --top-cpu:显示最占用CPU的进程 --top-io: 显示最占用io的进程 --top-mem: 显示最占用内存的进程 --top-latency: 显示延迟最大的进程

16. iotop—{iotop}

iotop命令是一个用来监视磁盘I/O使用状况的top类工具iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息,可查看每个进程是如何使用IO

16.1. iotop输出

第一行:Read和Write速率总计 第二行:实际的Read和Write速率 第三行:参数如下: 线程ID(按p切换为进程ID) 优先级 用户 磁盘读速率 磁盘写速率 swap交换百分比 IO等待所占的百分比 线程/进程命令

16.2. iotop常用参数

-o, --only只显示正在产生I/O的进程或线程,除了传参,可以在运行过程中按o生效 -b, --batch非交互模式,一般用来记录日志 -n NUM, --iter=NUM设置监测的次数,默认无限。在非交互模式下很有用 -d SEC, --delay=SEC设置每次监测的间隔,默认1秒,接受非整形数据例如1.1 -p PID, --pid=PID指定监测的进程/线程 -u USER, --user=USER指定监测某个用户产生的I/O -P, --processes仅显示进程,默认iotop显示所有线程 -a, --accumulated显示累积的I/O,而不是带宽 -k, --kilobytes使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用 -t, --time 加上时间戳,非交互非模式 -q, --quiet 禁止头几行,非交互模式,有三种指定方式 -q 只在第一次监测时显示列名 -qq 永远不显示列名 -qqq 永远不显示I/O汇总

16.3. 交互按键

left和right方向键:改变排序 r:反向排序 o:切换至选项--only p:切换至--processes选项 a:切换至--accumulated选项 q:退出 i:改变线程的优先级

17. nload 查看网络实时吞吐量—{nload}

nload是一个实时监控网络流量和带宽使用情况,以数值和动态图展示进出的流量情况

安装:yum -y install nload (EPEL源)

界面操作:

  • 上下方向键、左右方向键、 enter键或者tab键都就可以切换查看多个网卡的流量情况
  • 按 F2 显示选项窗口
  • 按 q 或者 Ctrl+C 退出 nload

17.1. 示例:

nload:默认只查看第一个网络的流量进出情况
nload eth0 eth1:在nload后面指定网卡,可以指定多个

设置刷新间隔:默认刷新间隔是100毫秒,可通过-t命令设置刷新时间(单位是毫秒)
nload -t 500 eth0

设置单位:显示两种单位一种是显示Bit/s、一种是显示Byte/s,默认是以Bit/s,也可不显示/s
-u h|b|k|m|g|H|B|K|M|G

  • 表示的含义: h: auto, b: Bit/s, k: kBit/s, m: MBit/s, H:auto, B: Byte/s, K: kByte/s, M: MByte/s
  • 例子: nload -u M eth0

18. lsof—{lsof}

lsof:list open files 查看当前系统文件的工具。在linux环境下,一切皆文件,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件如传输控制协议(TCP)和用户数据报协议(UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符

18.1. 命令参数

-a:列出打开文件存在的进程 -c<进程名>:列出指定进程所打开的文件 -g:列出GID号进程详情 -d<文件号>:列出占用该文件号的进程 +d<目录>:列出目录下被打开的文件 +D<目录>:递归列出目录下被打开的文件 -n<目录>:列出使用NFS的文件 -i<条件>:列出符合条件的进程(4、 6、协议、 :端口、 @ip ) -p<进程号>:列出指定进程号所打开的文件 -u:列出UID号进程详情 -h:显示帮助信息 -v:显示版本信息。 -n: 不反向解析网络名字

18.2. lsof示例

18.2.1. 进程管理

  1. 查看由登陆用户启动而非系统启动的进程
    lsof /dev/pts/1
  2. 指定进程号,可以查看该进程打开的文件
    lsof -p 9527

18.2.2. 文件管理

  1. 查看指定程序打开的文件
    lsof -c httpd
  2. 查看指定用户打开的文件
    lsof -u root | more
  3. 查看指定目录下被打开的文件
    lsof +D /var/log/
    lsof +d /var/log/
  • 参数+D为递归列出目录下被打开的文件,参数+d为列出目录下被打开的文件
  1. 查看所有网络连接
    lsof -i –n
    lsof -i@127.0.0.1
    • 通过参数-i查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况,例如:sshd等。也可以通过指定ip查看该ip的网络连接情况
  2. 查看端口连接情况
    lsof -i :80 -n
    • 通过参数-i :端口可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等
  3. 查看指定进程打开的网络连接
    lsof -i –n -a -p 9527
    • 参数-i、 -a、 -p等,-i查看网络连接情况,-a查看存在的进程,-p指定进程
  4. 查看指定状态的网络连接 lsof -n -P -i TCP -s TCP:ESTABLISHED
    • -n:no host names, -P:no port names,-i TCP指定协议,-s指定协议状态 通过多个参数可以清晰的查看网络连接情况、协议连接情况等

18.3. 恢复删除文件

前提是这个删除文件仍然被进程占用着还在内存中

```
lsof |grep /var/log/messages

rm -f /var/log/messages
lsof |grep /var/log/messages 或者 grep delete :这一步找到它的进程编号,下一步进入进程编号文件夹
cat /proc/653/fd/6
cat /proc/653/fd/6 > /var/log/messages
```

19. kill命令—{kill}

 向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开、头(可省略),不区分大小写

显示当前系统可用信号: kill –l 或者 trap -l

19.1. 常用信号:man 7 signal

(1) SIGHUP 无须关闭进程而让其重读配置文件 (2) SIGINT 中止正在运行的进程; 相当于Ctrl+c 例如kill -2 `pidof ping` (3) SIGQUIT 相当于ctrl+\ 有些命令用它退出,可用 kill -QUIT `pidof bc`或者 kill -3 (9) SIGKILL 强制杀死正在运行的进程:强制退出 (15) SIGTERM 终止正在运行的进程:正常退出 (18) SIGCONT 继续运行 (19) SIGSTOP 后台休眠

19.2. 指定信号的方法

(1) 信号的数字标识:1, 2, 9 (2) 信号完整名称:SIGHUP (3) 信号的简写名称:HUP

19.2.1. 举例:kill -1

cd /var/www/html echo welcome to my web >index.html curl 192.168.20.100 vim /etc/httpd/conf/httpd.conf :其中的页面文件位置修改为newhtml mkdir newhtml cd newhtml vim index.html :重新写一个新的页面文件 ps auxf 或者 ps -ef 或者 pidof httpd|apache 或者 pstree -p kill -1 apache的父进程pid(由root启动的那个pid) kill -n 1 pid :注意一个带-一个不带-

19.2.2. 举例:kill -15 (默认)

ps aux |grep mingetty kill mingettypid :此命令执行后发现pid号虽然没了,但是会生成一个新的pid号把它重新挂起 pstree -p :查看是哪一个父进程拉起mingetty,发现是1进程 kill 1 :杀不死1进程,但是此时再次执行 kill pidmingetty 发现它无法再自动起来了,说明此命令对于1进程还是有影响的 因此不要随便用kill杀进程,比如杀掉sshd服务,则远程将无法再次连接,必须在硬件主机上面重启sshd :systemctl start sshd 才可以再次使用,这将有可能出现严重问题

19.3. 按PID方式:

kill [-SIGNAL] pid … kill –n SIGNAL pid kill –s SIGNAL pid

19.4. 按名称:

killall [-SIGNAL] comm… :它可以一次性杀掉对应名字进程包含的所有pid ,而kill 一次只能杀掉一个

19.5. 按模式—{pkill}:

pkill [options] pattern (正则表达式)

19.5.1. pkill选项:

-SIGNAL : -u uid: effective user,生效者 -U uid: real user,真正发起运行命令者 -t terminal: 与指定终端相关的进程 -l: 显示进程名(pgrep可用) -a: 显示完整格式的进程名(pgrep可用) -P pid: 显示指定进程的子进程

19.5.2. 举例:

pkill -9 -t pts/1 :把终端上全部进程杀掉包括bash shell pkill pin.* :正则表达式模式法杀掉ping(或者pin开头的任意进程))

20. killall -0 cmdname 的用法

此命令不进行进程管理,但是会检查cmd名进程是否正常运行,类似于pidof ,把返回值存入$?中,用于判断cmd进程是否正常运行。

21. 任务作业管理

21.1. Linux的作业控制

  • 前台作业:通过终端启动,且启动后一直占据终端
  • 后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
  • 守护进程:和终端无关,后台运行

21.2. 让作业运行于后台

  • 运行中的作业: Ctrl+z ,它会放入后端但是让它处于stop休眠状态

  • 尚未启动的作业: COMMAND &

    • 注意:后台作业虽然被送往后台运行,但其依然与终端相关;退出当前终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系,有以下两种方式:
    • nohup COMMAND &> /dev/null &
    • screen;COMMAND

21.3. 查看当前终端所有作业:jobs

21.4. 作业控制:

fg [[%]JOB_NUM]:把指定的后台作业调回前台 bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行 kill [%JOB_NUM]: 终止指定的作业

21.5. 易混淆点:

  1. killall -18 手动开启休眠状态的进程 ,killall -19 手动停止正在运行的进程。这两个命令和前端,后端没有任何关系,和终端也没有关系,只要能找到进程,就可用它操作(也可用pstree -p 或则 pidof 或者 ps aux 找到进程编号然后kill -18 -19也可)

  2. 进程和终端相关是因为它是在终端内开了个子shell来运行的,只要终端关闭(比如远程sshd服务终端关闭),父进程都关闭了那么它下面的无论是前端还是后端任务都将会关闭,例如关闭终端相当于关闭6681进程,则ping命令当然会关闭,无论前端后端。

    ├─sshd(6994)─┬─sshd(6681)───bash(6683)───ping(6773) │ └─sshd(129671)───bash(129673)───pstree(6808)
  • 上面都是centos7中的逻辑,但是centos6中,如果终端关闭,则它下面的子进程会自动挂载到init上继续运行,注意区分。
  1. 因此用nohup将命令运行之后,当终端关闭它会挂载到systemd上继续运行。或者还可用screen程序,则终端掉了也不会影响命令的执行。
  2. 注意,command & ctrl z 的区别,
    • ctrl z:命令已经前台运行,将其调到后端不运行
    • command & :command命令没有运行,让其调到后端运行。
  3. 注意fg会把后端的进城调回到前端并运行,不管它在后端否运行还是不运行。同样的bg也是让进程调回到后端进行运行,只不过因为进程前段运行的时候无法操作,同时也没有jobs编号,所以已经运行进程要用ctrl+z调到后端停止运行,然后再用bg 启动运行。

21.6. nohup—{nohup}

 nohup会有各种输出信息,会默认存放到文件中,类似于计划任务,要将它重定向到垃圾箱。

 或者先重定向到自己的一个文件中,然后用脚本删除多少天以前的log日志。

 再或者直接重定向到系统自己控制的log缓存文件夹中,它会自动清除。不过需要注意不能反复重定向一个文件,不然它一直在修改此文件的mtime,根据规则就不会自动清除它了。

Usage: nohup COMMAND [ARG]... or: nohup OPTION Run COMMAND, ignoring hangup signals. --help display this help and exit --version output version information and exit If standard input is a terminal, redirect it from /dev/null. If standard output is a terminal, append output to 'nohup.out' if possible, '$HOME/nohup.out' otherwise. If standard error is a terminal, redirect it to standard output. To save output to FILE, use 'nohup COMMAND > FILE'.

21.7. 并行运行

同时运行多个进程,提高效率(相当于同时启动多个后台程序)

  1. 方法1,利用脚本运行(子shell)
vi all.sh f1.sh & f2.sh & f3.sh &
  • 然后运行此脚本
  1. 方法2 ,开启子shell命令环境运行
    (f1.sh &);(f2.sh &);(f3.sh &)
  2. 方法3:注意中括号边上有空格 ,在当前shell环境下运行
    { f1.sh & f2.sh & f3.sh & }
最后修改日期: 2021年7月7日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。