Linux - Shell - & 与 nohup
-
概述
- 后台
- nohup
-
背景
- & 符号引发的疑问
- jobs 的前置
-
类型
- 教程向
-
环境
- centos7
1. 场景: 后台运行
-
概述
- 场景
-
场景
-
需要在 linux 服务器上, 执行多个任务
- 你可以开 很多个 终端
- 当然也有别的办法
-
假设, 我不太像开启多个 终端
-
-
解决
- 让进程 后台执行
- 作为 守护进程, 继续在后台执行
- 让进程 后台执行
-
机制
- 当前 shell 新建 子进程
- 当前 shell 继续 响应用户
- 子线程 在后台执行
- 当前 shell 新建 子进程
2. &
-
概述
- & 操作符
-
命令
> <cmd> &
-
结果
-
命令开始在后台执行
-
返回结果
# [1]: 任务在 当前shell 的 job 编号 # 28995: 任务的 pid [1] 28995
-
任务执行
-
任务结束
# [1]: 1 号作业传来的消息 # Done: 作业执行结果, 可能有很多 # cmd: 执行的命令 [1]+ Done <cmd>
-
-
优劣
-
优势
- 可以腾出终端, 继续操作
- 当前终端的后台任务, 只能当前终端看到
-
劣势
- 终端挂了, 任务列表会丢
- 终端挂了, 任务也会挂
-
-
问题
-
问题1
-
问题
- 如果没有做调整, 任务的 IO 依然是对接的 stdout 和 stderr
- 即使在后台运行, 也会在 执行命令的终端, 打印日志或者其他输出
-
解决
- 执行前, 做 io 重定向
- nohup
-
-
问题2
-
问题
- 终端挂了, 任务也会挂
-
解决
- nohup
-
-
3. nohup
-
概述
- nohup
-
nohup
-
no hang up
- 不挂起
-
机制
- 执行
- 就算终端挂了, 任务依然执行
- 日志
- 默认
- 当前目录, 写入 nohup.out
- 如果无法写入, 会写入 ~/nohup.out
- 默认
- 执行
-
命令
> nohup <cmd> &
-
结果
# & 的日志 [1] 5396 # nohup: 已经由 nohup 执行 ## 日志的位置, 在 当前目录的 nohup ## append 模式 nohup: ignoring input and appending output to ‘nohup.out’
-
4. 后续
- jobs
- fg
- bg
ps
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出