我真不知道在后台运行应用程序有什么好处。就像通过命令行
一样。Application &
我们到底为什么要在后台运行应用程序?我什么时候应该决定这样做?
答案1
通常,执行时间过长且不需要用户交互的应用程序会被发送到后台,以便我们可以在终端中继续工作。
在后台运行的作业与在前台运行的作业的处理方式相同,只是它们的 STDOUT、STDIN 和 STDERR 有所不同。
如果您的作业需要很长时间,例如文件压缩或备份,您可以将这些作业发送到后台。
jobs
您可以使用命令列出在后台运行的作业。
$ ./job1.sh &
[1] 9747
$ ./job2.sh &
[2] 9749
$ ./job3.sh &
[3] 9751
$ jobs
[1] Running ./job1.sh &
[2]- Running ./job2.sh &
[3]+ Running ./job3.sh &
每当作业发送到后台 shell 时,都会在此处显示进程的job id
和。pid
如果我们希望进程返回前台,我们可以使用fg
命令将其恢复。
$ fg 1
./job1.sh
但请注意,当您关闭终端 (shell) 时,SIGHUP 将被发送到从 shell 生成的所有后台进程,导致这些进程死亡。为了防止这种情况,您可以使用disown
命令从作业表中删除这些进程,从而防止进程被杀死。
一种最好的方法是使用命令启动后台进程,nohup
这样 SIGHUP 信号就不会终止该进程,并且它将在后台安全运行。
huponexit
还可以通过设置bash shell 的选项来防止将 SIGHUP 发送到子进程(bg 作业) 。
$ shopt -s huponexit
在最新版本的 Bash 中默认设置此选项,但如果未设置,我们可以添加此选项~/.bashrc
以使其成为默认行为。
答案2
如果您执行一个需要 5 分钟才能结束的应用程序,例如复制作业,那么 shell 在程序运行时会被阻塞,整整 5 分钟。然后,复制作业位于所谓的前台进程组中,由登录+
指示ps
。在那 5 分钟内您可能需要做一些其他工作,但 shell 被阻止了。
另一方面,当您在后台 ( cp source target &
) 执行复制作业时,您的作业将在后台执行,而不会阻塞当前 shell。你可以继续做其他事情。fg
如果您愿意,可以将进程带回前台。