转载自公众号:linux-cn

我来举一个简单的例子,看看如何使用 & 号将下面这个命令放到后台运行:

  1. cp -R original/dir/ backup/dir/

这个命令的目的是将 original/dir/ 的内容递归地复制到 backup/dir/ 中。虽然看起来很简单,但是如果原目录里面的文件太大,在执行过程中终端就会一直被卡住。

所以,可以在命令的末尾加上一个 & 号,将这个任务放到后台去执行:

  1. cp -R original/dir/ backup/dir/ &

任务被放到后台执行之后,就可以立即继续在同一个终端上工作了,甚至关闭终端也不影响这个任务的正常执行。需要注意的是,如果要求这个任务输出内容到标准输出中(例如 echols),即使使用了 &,也会等待这些输出任务在前台运行完毕。

当使用 & 将一个进程放置到后台运行的时候,Bash 会提示这个进程的进程 ID。在 Linux 系统中运行的每一个进程都有一个唯一的进程 ID,你可以使用进程 ID 来暂停、恢复或者终止对应的进程,因此进程 ID 是非常重要的。

这个时候,只要你还停留在启动进程的终端当中,就可以使用以下几个命令来对管理后台进程:

◈ jobs 命令可以显示当前终端正在运行的进程,包括前台运行和后台运行的进程。它对每个正在执行中的进程任务分配了一个序号(这个序号不是进程 ID),可以使用这些序号来引用各个进程任务。

  1. $ jobs
  2. [1]- Running cp -i -R original/dir/* backup/dir/ &
  3. [2]+ Running find . -iname "*jpg" > backup/dir/images.txt &

◈ fg 命令可以将后台运行的进程任务放到前台运行,这样可以比较方便地进行交互。根据 jobs命令提供的进程任务序号,再在前面加上 % 符号,就可以把相应的进程任务放到前台运行。

  1. $ fg %1 # 将上面序号为 1 的 cp 任务放到前台运行
  2. cp -i -R original/dir/* backup/dir/

如果这个进程任务是暂停状态,fg 命令会将它启动起来。

◈ 使用 ctrl+z 组合键可以将前台运行的任务暂停,仅仅是暂停,而不是将任务终止。当使用 fg 或者 bg 命令将任务重新启动起来的时候,任务会从被暂停的位置开始执行。但 sleep[4] 命令是一个特例,sleep 任务被暂停的时间会计算在 sleep 时间之内。因为 sleep 命令依据的是系统时钟的时间,而不是实际运行的时间。也就是说,如果运行了 sleep 30,然后将任务暂停 30 秒以上,那么任务恢复执行的时候会立即终止并退出。◈ bg 命令会将任务放置到后台执行,如果任务是暂停状态,也会被启动起来。

  1. $ bg %1
  2. [1]+ cp -i -R original/dir/* backup/dir/ &

如上所述,以上几个命令只能在同一个终端里才能使用。如果启动进程任务的终端被关闭了,或者切换到了另一个终端,以上几个命令就无法使用了。

如果要在另一个终端管理后台进程,就需要其它工具了。例如可以使用 kill[5] 命令从另一个终端终止某个进程:

  1. kill -s STOP <PID>

这里的 PID 就是使用 & 将进程放到后台时 Bash 显示的那个进程 ID。如果你当时没有把进程 ID 记录下来,也可以使用 ps 命令(代表 process)来获取所有正在运行的进程的进程 ID,就像这样:

  1. ps | grep cp

执行以后会显示出包含 cp 字符串的所有进程,例如上面例子中的 cp 进程。同时还会显示出对应的进程 ID:

  1. $ ps | grep cp
  2. 14444 pts/3 00:00:13 cp

在这个例子中,进程 ID 是 14444,因此可以使用以下命令来暂停这个后台进程:

  1. kill -s STOP 14444

注意,这里的 STOP 等同于前面提到的 ctrl+z 组合键的效果,也就是仅仅把进程暂停掉。

如果想要把暂停了的进程启动起来,可以对进程发出 CONT 信号:

  1. kill -s CONT 14444

这个给出一个可以向进程发出的常用信号[6]列表。如果想要终止一个进程,可以发送 TERM 信号:

  1. kill -s TERM 14444

如果进程不响应 TERM 信号并拒绝退出,还可以发送 KILL 信号强制终止进程:

  1. kill -s KILL 14444

强制终止进程可能会有一定的风险,但如果遇到进程无节制消耗资源的情况,这样的信号还是能够派上用场的。

另外,如果你不确定进程 ID 是否正确,可以在 ps 命令中加上 x 参数:

  1. $ ps x| grep cp
  2. 14444 pts/3 D 0:14 cp -i -R original/dir/Hols_2014.mp4
  3. original/dir/Hols_2015.mp4 original/dir/Hols_2016.mp4
  4. original/dir/Hols_2017.mp4 original/dir/Hols_2018.mp4 backup/dir/

这样就可以看到是不是你需要的进程 ID 了。

最后介绍一个将 ps 和 grep 结合到一起的命令:

  1. $ pgrep cp
  2. 8
  3. 18
  4. 19
  5. 26
  6. 33
  7. 40
  8. 47
  9. 54
  10. 61
  11. 72
  12. 88
  13. 96
  14. 136
  15. 339
  16. 6680
  17. 13735
  18. 14444

pgrep 可以直接将带有字符串 cp 的进程的进程 ID 显示出来。

可以加上一些参数让它的输出更清晰:

  1. $ pgrep -lx cp
  2. 14444 cp

在这里,-l 参数会让 pgrep 将进程的名称显示出来,-x 参数则是让 pgrep 完全匹配 cp 这个命令。如果还想了解这个命令的更多细节,可以尝试运行 pgrep -ax

总结

在命令的末尾加上 & 可以让我们理解前台进程和后台进程的概念,以及如何管理这些进程。

在 UNIX/Linux 术语中,在后台运行的进程被称为守护进程。如果你曾经听说过这个词,那你现在应该知道它的意义了。

Linux后台进程(和jobs、bg、fg)相关推荐

  1. Linux - 后台运行 ctrl + z , jobs , bg , fg

    一.& 最经常被用到 这个用在一个命令的最后,可以把这个命令放到后台执行 二.ctrl + z 可以将一个正在前台执行的命令放到后台,并且暂停 三.jobs 查看当前有多少在后台运行的命令 四 ...

  2. linux:作业控制 jobs命令 kill命令 bg和fg命令

    作业控制 如前所述,在一个命令行的末尾加上"&"就使该命令成为了后台作业.后台作业的运行级别低于前台作业(进程). 若set命令的monitor选项被打开,即执行命令set ...

  3. linux 前后台任务命令 bg、fg、ctrl+z、ctrl+d和ctrl+c 使用

    一.& (常用) & 用在一个命令的最后,使用之后可以把这个命令放到后台执行 例: 二.ctrl + z 将一个前台执行的命令挂起 三.jobs 查看当前有多少在后台运行的命令 job ...

  4. fg jobs bg

    & 执行程序的后面加&可以将程序转到后台(这个后台是当前会话的后台,并不是守护进程)执行,即$./a.out &,这样我们在打开诸如$gedit test.txt的时候可以写成 ...

  5. Linux进程管理(ps,pgrep,kill,killall,pkill,nohup,bg,fg)

    文章目录 Linux进程管理 什么是进程?什么是线程?二者的区别? Linux进程管理命令 ps命令 使用方法案例 ps带减号和不带减号的区别 查看进程树的命令pstree pgrep命令 kill命 ...

  6. Linux命令之 —— grep \ls \ ll \ sed \ bg fg \ ipset \ wc \ ifconfig \ awk

    0. grep命令 1. Linux ls  -ld 1 2. Linux 中ls -l // ll 命令详解  (7个字段):文件属性 1 3. shell中的if判断 4. Linux中 > ...

  7. Linux后台进程管理以及ctrl+z(挂起)、ctrl+c(中断)、ctrl+\(退出)和ctrl+d(EOF)的区别

    一.后台进程管理命令 fg.bg.jobs.&.ctrl + z.ctrl + c.ctrl + \.ctrl + d 1. & 加在一个命令的最后,可以把这个命令放到后台执行 ,如g ...

  8. Linux后台进程管理

    fg.bg.jobs.&.ctrl + z命令 一. & 加在一个命令的最后,可以把这个命令放到后台执行 ,如gftp &, 二.ctrl + z 可以将一个正在前台执行的命令 ...

  9. linux 后台进程

    后台运行模式 在命令行输入命令之后,在最后面加一个&符号,即可实现命令后台运行.如果想要显示信息也不打印在屏幕上,可以按照如下方式进行. xxx >/dev/null 2>& ...

最新文章

  1. 《python从入门到精通》——使用位移运算符对密码进行加密
  2. SQL2005 express升级到2008企业版解决4096限制问题
  3. Apache+PHP环境搭建
  4. 2021河南高考成绩查询郸城一高,郸城一高在河南有多牛 2021年高考成绩
  5. php进程通讯方式,PHP进程模型、进程通讯方式、进程线程的区别分别有哪些?
  6. 数据中心节能制冷---冷却塔帮忙
  7. GNU make manual 翻译(八十二)
  8. 激战 5G:国内外技术的分水岭
  9. 如何终止线程的运行(C/C++)
  10. 通达信期货接口有必要开通五档行情?
  11. ocx注册以及检测(转)
  12. 惊蛰(insects awaken)
  13. yy神曲url解析php_单文件PHP版视频解析源码(中间件)
  14. 区块链是什么通俗解释_区块链技术是什么?区块链的通俗解释原来是这样!
  15. 相濡以沫,不如相忘于江湖...
  16. php and mysql登录注册页面
  17. DNA测序也有批次效应?
  18. Unity 3D 入门基础
  19. 第五季完美童模 亲善大使周懿辰现场走秀回顾
  20. 三维重建之人体重建PIFU,PIFuHD

热门文章

  1. C++学习笔记39:进程概念
  2. 解决 asp.net 伪静态 IIS设置后 真正的HTML无法显示的问题
  3. redis用zset做延时消息
  4. angualr Http error处理
  5. 实例方法、静态方法和类方法的区别
  6. python-study-10
  7. 在使用FireFox浏览器时,经常打开新标签,页面总是不断自动刷新,解决办法
  8. [ActionScript 3.0] 记录几个ByteArray 十六进制 String等相互转换的方法
  9. 详谈Hibernate框架关系映射!
  10. Android源码中添加 修改应用