shell的前台作业与后台作业
前台作业(Foreground Jobs)
- 交互性:前台作业是用户启动并需要直接交互的进程
2. 直接交互:用户可以看到该进程的输出并直接从键盘输入到该进程 - 控制焦点:一个shell在任何时候都只能且只有一个前台作业
- 信号相应:前台作业可以接收如Ctrl+C(产生SIGINT信号)等终端生成的信号,从而停止该作业。
后台作业(Background Jobs)
- 非交互性:后台作业时shell背后运行的进程,它不需要直接与用户通过终端交互
- 它不会占用终端的输入(终端的输入不会给它),也不会占用终端的输出(除非期输出被特别重定向)。
2. 因此也不会接收终端产生的信号,例如SIGINT信号
- 它不会占用终端的输入(终端的输入不会给它),也不会占用终端的输出(除非期输出被特别重定向)。
- 多任务处理:一个shell能同时运行多个后台作业,这些后台作业通常不会阻塞终端,用户可以直接在终端进行其他操作。
控制前台和后台作业
Shell提供了多种命令来管理前台和后台作业:
- 启动后台作业:只要在命令末尾添加“ & ”符号,就饿可以使命令在后台运行(例如 sleep 60 &)。
- 作业控制:使用 jobs 命令可以查看当前的后台作业状态;fg 命令可以将后台作业调回前台;bg 命令可以将停止的作业继续在后台运行。
- 终止和信号:使用 kill 命令发送信号给特定作业。
为什么用ssh远程连接,然后用&运行后台作业,断开ssh后,运行的后台也会停止运行了?
因为当我们通过SSH连接到设备终端,并在终端运行的后台作业(启动进程去运行)时,这个进程通常会成为SSH会话的一部分;当我们断开SSH(结束会话)时,所有属于该会话的进程通常会接收到SIGHUP(挂断信号),从而终止进程。因此这里不管前台还是后台作业,都会随着会话关闭而终止进程。
那如何使得通过ssh远程连接并运行的后台作业 不会随着ssh断开而终止呢?
- 我们可以在运行后台作业时,用nohup设置该作业忽略SIGHUP(挂断信号),这样它就不会因为ssh会话关闭而终止了。
指令设置如下:
nohup your-command &
4900

被折叠的 条评论
为什么被折叠?



