FantasticMao 技术笔记
BlogGitHub
  • README
  • C & Unix
    • C
      • 《C 程序设计语言》笔记
      • C 语言中的陷阱
      • CMake 示例
      • GNU make
      • LLVM Clang
      • Nginx 常用模块
      • Vim 常用命令
    • Unix-like
      • 《深入理解计算机系统》笔记
      • 《UNIX 环境高级编程》笔记 - UNIX 基础知识
      • 《UNIX 环境高级编程》笔记 - 文件 IO
      • 《UNIX 环境高级编程》笔记 - 标准 IO 库
      • 《鳥哥的 Linux 私房菜》笔记 - 目录配置
      • 《鳥哥的 Linux 私房菜》笔记 - 认识与学习 bash
      • 《鳥哥的 Linux 私房菜》笔记 - 任务管理
      • OpenWrt 中的陷阱
      • iptables 工作机制
  • Go
    • 《A Tour of Go》笔记
    • Go vs C vsJava
    • Go 常用命令
    • Go 语言中的陷阱
  • Java
    • JDK
      • 《Java 并发编程实战》笔记 - 线程池的使用
      • 设计模式概览
      • 集合概览
      • HashMap 内部算法
      • ThreadLocal 工作机制
      • Java Agent
    • JVM
      • 《深入理解 Java 虚拟机》笔记 - Java 内存模型与线程
      • JVM 运行时数据区
      • 类加载机制
      • 垃圾回收算法
      • 引用类型
      • 垃圾收集算法
      • 垃圾收集器
    • Spring
      • Spring IoC 容器扩展点
      • Spring Transaction 声明式事务管理
      • Spring Web MVC DispatcherServlet 工作机制
      • Spring Security Servlet 实现原理
    • 其它
      • 《Netty - One Framework to rule them all》演讲笔记
      • Hystrix 设计与实现
  • JavaScript
    • 《写给大家看的设计书》笔记 - 设计原则
    • 《JavaScript 权威指南》笔记 - jQuery 类库
  • 数据库
    • ElasticSearch
      • ElasticSearch 概览
    • HBase
      • HBase 数据模型
    • Prometheus
      • Prometheus 概览
      • Prometheus 数据模型和指标类型
      • Prometheus 查询语法
      • Prometheus 存储原理
      • Prometheus vs InfluxDB
    • Redis
      • 《Redis 设计与实现》笔记 - 简单动态字符串
      • 《Redis 设计与实现》笔记 - 链表
      • 《Redis 设计与实现》笔记 - 字典
      • 《Redis 设计与实现》笔记 - 跳跃表
      • 《Redis 设计与实现》笔记 - 整数集合
      • 《Redis 设计与实现》笔记 - 压缩列表
      • 《Redis 设计与实现》笔记 - 对象
      • Redis 内存回收策略
      • Redis 实现分布式锁
      • Redis 持久化机制
      • Redis 数据分片方案
      • 使用缓存的常见问题
    • MySQL
      • 《高性能 MySQL》笔记 - Schema 与数据类型优化
      • 《高性能 MySQL》笔记 - 创建高性能的索引
      • 《MySQL Reference Manual》笔记 - InnoDB 和 ACID 模型
      • 《MySQL Reference Manual》笔记 - InnoDB 多版本
      • 《MySQL Reference Manual》笔记 - InnoDB 锁
      • 《MySQL Reference Manual》笔记 - InnoDB 事务模型
      • B-Tree 简述
      • 理解查询执行计划
  • 中间件
    • gRPC
      • gRPC 负载均衡
    • ZooKeeper
      • ZooKeeper 数据模型
    • 消息队列
      • 消息积压解决策略
      • RocketMQ 架构设计
      • RocketMQ 功能特性
      • RocketMQ 消息存储
  • 分布式系统
    • 《凤凰架构》笔记
    • 系统设计思路
    • 系统优化思路
    • 分布式事务协议:二阶段提交和三阶段提交
    • 分布式系统的技术栈
    • 分布式系统的弹性设计
    • 单点登录解决方案
    • 容错,高可用和灾备
  • 数据结构和算法
    • 一致性哈希
    • 布隆过滤器
    • 散列表
  • 网络协议
    • 诊断工具
    • TCP 协议
      • TCP 报文结构
      • TCP 连接管理
由 GitBook 提供支持
在本页
  • 什么是任务管理
  • job control 的管理
  • 将待执行的任务丢到背景中执行:&
  • 将当前的任务丢到背景中执行:Ctrl + z
  • 查看背景中的任务的运行状态:jobs
  • 将背景中的任务切换到前景中执行:fg
  • 将背景中的任务切换到执行状态:bg
  • 管理背景中的人物:kill
  • 离线管理
  1. C & Unix
  2. Unix-like

《鳥哥的 Linux 私房菜》笔记 - 任务管理

什么是任务管理

在 bash 中执行任务管理(job control)需要注意的限制条件是:

  1. 这些任务必须是当前 shell 进程的子进程;

  2. 前景:用户可以控制与下达指令的环境被称为前景;

  3. 背景:可以自己运行的任务,用户无法用 Ctrl + c 来终止,但是可以使用 fg 和 bg 来切换任务;

  4. 「背景」中执行的任务不能等待 terminal 和 shell 的输入。

job control 的管理

bash 只能管理自己的任务,而不能管理其它 bash 的任务,即使是 root 用户也不能管理其它的 bash 底下的任务。

用户可以控制与下达指令的环境被称为「前景」,反之则是「背景」。在背景中的任务的执行状态分为暂停(Stopped)和运行中(Running)。

将待执行的任务丢到背景中执行:&

在只有一个 bash 的环境下,如果想要同时进行多个工作,那么可以将某些任务直接丢到「背景」中执行。使用 & 可以达成这个目的。

host:~$ sleep 5 &
[1]  1234             # 1 表示 job number,1234 表示进程 pid
host:~$
[1]-  Done  sleep 5   # 1 表示 job number

主要注意的是,在「背景」中执行的任务的 stdout 和 stderr 是依旧显示在屏幕上的,解决办法是使用「重定向」。

将当前的任务丢到背景中执行:Ctrl + z

假设用户正在 Vim 中编辑文件时,如果需要回到 bash 来执行命令的话,可以使用 Ctrl + z 命令。

host:~$ vim ~/.bashrc        # 按下 Ctrl + z
[1]+  Stopped  vim .bashrc
host:~$                      # 回到 bash 来执行命令

查看背景中的任务的运行状态:jobs

jobs 命令可以查询当前「背景」当中有多少个任务。

host:~$ jobs
[1]-  Stopped  vim .bashrc   # - 表示最近最后第二个被放入背景中的任务
[2]+  Stopped  vim .vimrc    # + 表示最近被放入背景中的任务,

将背景中的任务切换到前景中执行:fg

fg 命令(fg 是 foreground 的缩写)可以将背景中的任务切换到前景中执行。

host:~$ fg %1   # 重新进入 Vim,符号 % 是可选的

将背景中的任务切换到执行状态:bg

使用 Ctrl + z 命令放入「背景」中执行的任务,默认是暂停状态,可以使用 bg 命令(bg 是 background 的缩写)将它切换为运行中状态。

host:~$ git clone https://github.com/xxx/xxx           # 按下 Ctrl + z
[1]+  Stopped   git clone https://github.com/xxx/xxx
host:~$ bg %1                                          # 运行 git clone 命令,符号 % 是可选的

管理背景中的人物:kill

kill 命令可以通过信号来中断、终止、重启任务,具体的信号可以参考 kill -l 和 man 7 signal。

host:~$ kill -15 %1        # 符号 % 是必选的
host:~$ kill -SIGTERM %1   # 符号 % 是必选的

离线管理

在任务管理中提及的「背景」是指在 terminal 模式下可以避免被 ctrl + c 中断的一种场景,但是任务还是属于当前 shell 进程的子进程,不能将这种行为理解成把任务放入到了操作系统的背景中来执行。因此任务管理的「背景」中的任务依旧是会与 terminal 有所关联。

假设用户是以 ssh 命令连接至远程的 Linux 主机,并且将任务以 & 的方式执行,那么在用户退出 ssh 命令的时候,该任务也会因为中断而停止。

nohup 命令可以使任务在当用户退出之后还能继续执行,可以搭配使用 nohup 和 & 命令来执行需要长期在后台运行的任务。

host:~$ nohup [命令和参数]     # 在 terminal 前景中执行
host:~$ nohup [命令和参数] &   # 在 terminal 背景中执行

最后更新于1年前