在后台运行进程到底意味着什么?
$program
和之间的区别 $program&
:是否只是输入文件描述符不是从 shell 继承的,还是还有其他/更多的东西?
答案1
program &
仍将具有相同的stdin
和stdout
as program
,但program &
通常(取决于您的终端设置)将无法读取,stdin
除非系统通过SIGTTIN
信号停止(请参阅https://en.wikipedia.org/wiki/Job_control_(Unix)#Implementation)。
后台进程不会接收来自键盘快捷键 ( Ctrl-C, Ctrl-\, Ctrl-Z
) 的信号,当然,在后台运行进程将允许您继续使用 shell(例如,启动其他进程)。
答案2
这意味着很多事情。
- 后台进程不会阻碍您的终端。它是“异步”运行的,因为我们不等待它完成。如果强行断开它仍然会死掉。
- 因此,响应不一定是“主动”而是“被动”,将输出重定向到文件以供以后检查是一种很好的形式。
- 除非考虑批处理解决方案(命令文件或响应文件或期望),否则交互式输入将会出现问题。
- 对于“长时间运行”的作业,您可能需要考虑作为服务启动。
- 如果后台有问题,另请参阅 tmux 和 screen 以获得替代方案。
答案3
当您在前台启动一个进程时,shell 将等待它完成(使用wait()
系统调用系列之一),然后再读取下一个命令。当您在后台启动进程时,shell 不会等待它完成或更改状态;而是会等待它完成或更改状态。它立即读取并执行下一个命令。
请注意,无论您是否开始对于后台进程,您可以随意在后台和前台之间移动它(使用^Z
和bg
,或使用fg
)。在这方面,所有工作都是平等的。唯一的限制是在任何给定时间最多只能有一个前台作业,并且如果后台作业尝试使用 shell 的 tty,它们就会停止。
每当没有前台作业时,shell 就会读取下一个命令(从脚本文件或标准输入)并执行它。