Linux - Shell - & 与 nohup

  1. 概述

    1. 后台
    2. nohup
  2. 背景

    1. & 符号引发的疑问
    2. jobs 的前置
  3. 类型

    1. 教程向
  4. 环境

    1. centos7

1. 场景: 后台运行

  1. 概述

    1. 场景
  2. 场景

    1. 需要在 linux 服务器上, 执行多个任务

      1. 你可以开 很多个 终端
      2. 当然也有别的办法
    2. 假设, 我不太像开启多个 终端

  3. 解决

    1. 让进程 后台执行
      1. 作为 守护进程, 继续在后台执行
  4. 机制

    1. 当前 shell 新建 子进程
      1. 当前 shell 继续 响应用户
      2. 子线程 在后台执行

2. &

  1. 概述

    1. & 操作符
  2. 命令

    > <cmd> &
    
  3. 结果

    1. 命令开始在后台执行

    2. 返回结果

      # [1]: 任务在 当前shell 的 job 编号
      # 28995: 任务的 pid
      [1] 28995
      
    3. 任务执行

    4. 任务结束

      # [1]: 1 号作业传来的消息
      # Done: 作业执行结果, 可能有很多
      # cmd: 执行的命令
      [1]+  Done  <cmd>
      
  4. 优劣

    1. 优势

      1. 可以腾出终端, 继续操作
      2. 当前终端的后台任务, 只能当前终端看到
    2. 劣势

      1. 终端挂了, 任务列表会丢
      2. 终端挂了, 任务也会挂
  5. 问题

    1. 问题1

      1. 问题

        1. 如果没有做调整, 任务的 IO 依然是对接的 stdout 和 stderr
        2. 即使在后台运行, 也会在 执行命令的终端, 打印日志或者其他输出
      2. 解决

        1. 执行前, 做 io 重定向
        2. nohup
    2. 问题2

      1. 问题

        1. 终端挂了, 任务也会挂
      2. 解决

        1. nohup

3. nohup

  1. 概述

    1. nohup
  2. nohup

    1. no hang up

      1. 不挂起
    2. 机制

      1. 执行
        1. 就算终端挂了, 任务依然执行
      2. 日志
        1. 默认
          1. 当前目录, 写入 nohup.out
          2. 如果无法写入, 会写入 ~/nohup.out
    3. 命令

      > nohup <cmd> &
      
    4. 结果

      # & 的日志
      [1] 5396
      # nohup: 已经由 nohup 执行
      ## 日志的位置, 在 当前目录的 nohup
      ## append 模式
      nohup: ignoring input and appending output to ‘nohup.out’
      

4. 后续

  1. jobs
  2. fg
  3. bg

ps

  1. ref
    1. Linux后台运行和关闭程序、查看后台任务
    2. Linux 中的 &
    3. Linux nohup 命令
posted @ 2020-11-23 22:00  轩辕拾銉  阅读(406)  评论(0编辑  收藏  举报