前言
在应用服务的开发和运维过程中,我们需要经常使用各种shell指令。了解shell指令前台运行和后台运行的区别,对我们管理应用服务有着很大的帮助。
场景一:
- 在调试或测试服务时,需要执行服务启动命令。我们希望能够监视服务的启动过程,并在必要时进行交互。例如,需要输入密码或者配置服务的参数。
- 此时选择前台方式运行命令可以帮助我们更容易地发现和解决启动过程中可能出现的错误或问题。如果服务启动失败,可以立即看到错误信息,并采取相应的措施。
场景二:
- 服务经过测试验证后可以成功启动,不再需要交互或监视,我们希望将其切换到后台运行,以释放当前终端的使用,并允许执行其他任务。
- 在后端运行服务还可以使其在系退出当前终端时继续运行,而不会因为当前shell会话的关闭而中断。
介绍
特点对比
特点 | 前台模式 | 后台模式 |
---|---|---|
是否占用终端界面 | 会占用终端界面,陷入等待,不会主动结束,无法同时运行其他应用程序 | 进程在后台运行,不占用用户界面,即一个shell会话可以同时运行多个应用程序 |
用户交互 | 通常会监听用户输入,同时会把输出直接显示在界面上 | 没有用户交互,输出通常保存到日志文件 |
当退出shell会话时 | 退出当前会话时,程序直接中断结束 | 退出当前会话时,可以让程序保持运行 |
示例:
- 当一个命令在前台方式运行时,终端提示符会一直被该命令占用,直到命令执行完毕。
- 当一个命令在后台方式运行时,界面打印出进程号,终端提示符会立即返回,让你继续输入其他命令。示例:
username@hostname:~$ your_command &
[1] 12345
username@hostname:~$
ps:上述示例中,&
符号表示将 your_command
放到后台运行。方括号中的数字和进程ID表示后台作业的编号和进程ID。
适用场景:
前台模式、后台模式和挂起状态在使用上各有侧重:
-
前台模式的使用场景:
- 需要用户交互的程序,如shell、文本编辑器等
- 执行较短的任务,用户需要看到直接输出
- 测试调试程序时,方便查看程序运行信息
- 只需要专注执行一个程序时使用
-
后台模式的使用场景:
- 长时间运行的任务,如守护进程、批处理作业等
- 不需要用户交互的程序,如系统监控、自动备份脚本等
- 需要同时运行多个程序时,把非主程序放入后台
- 输出结果重定向到文件时使用
总结:
前台模式用于交互和短期任务
后台模式用于长期运行无交互任务
具体应用
前台模式进程阻塞其他指令运行
- 如下:tail -f /dev/null指令阻塞了ls指令,前者是前台模式,但是前一个指令一直未结束,就会阻塞后者
- 把顺序反过来,ls执行完成后会继续执行下一个指令
前台模式切换到后台模式:
- 方法一:由
command
改成nohup command &
-
nohup
命令用来忽略 HUP(挂断)信号。这样当用户退出会话时,进程不会收到 HUP 信号而终止。 -
&
符号用于把前面的命令放到后台运行。 -
所以
nohup <command> &
的效果是:- 在后台运行command这个进程
- 不会被用户退出时的 HUP 信号终止
- 输出不会显示到终端,而是重定向到nohup.out文件
-
- 方法二:有些命令支持后台模式
- 如:gunicorn默认情况是前台执行,加上--daemon后变为后台执行
方法一是前台切换后台,与用户页面的连接会保留,仍然可以输出到用户页面。方法二是直接以后台模式运行未建立与用户页面的连接,无法直接输出到用户页面。
docker容器后台运行问题
- 使用docker run -d以后台模式运行容器后,发现容器会立刻停止,如下图。
- 如果想要启动centos容器持续运行,必须有个前台模式的进程正在运行,否则容器会立刻退出。可以在后面增加
tail -f /dev/null
,如下图: