Linux 程序前台后台之间的切换

在 Linux 中, 我们执行命令的时候, 有时会忘记放到后台执行, 而阻塞在终端前台执行, 一般情况下会 control+c 掉再重新执行, 加入放入到后台的命令, 本篇文章介绍一种方法, 不需要 control+c 掉就能直接放入到后台执行, 且支持前台后台的切换

  • 在前台启动程序

我这里有个 webtty 的小程序, 现在我在前台执行它

1
2
3
4
5
6
7
8
9
10
11
> ttyd -p 8080 bash
[2017/01/05 14:31:42:7759] INFO: ttyd 1.2.2 (libwebsockets 1.7.5)
[2017/01/05 14:31:42:7759] INFO: tty configuration:
[2017/01/05 14:31:42:7760] INFO: start command: bash
[2017/01/05 14:31:42:7760] INFO: reconnect timeout: 10s
[2017/01/05 14:31:42:7760] INFO: close signal: SIGHUP (1)
[2017/01/05 14:31:42:7799] INFO: listening on port 8080
[2017/01/05 14:32:02:1003] INFO: HTTP / - 10.1.100.239 (10.1.100.239)
[2017/01/05 14:32:02:5699] INFO: HTTP /auth_token.js - 10.1.100.239 (10.1.100.239)
[2017/01/05 14:32:03:3588] INFO: WS /ws - 10.1.100.239 (10.1.100.239), clients: 1
[2017/01/05 14:32:03:3600] INFO: started process, pid: 29018

现在这个程序挂在了我终端的前台执行, 运行正常

  • 输入 control+z 暂停程序的执行
1
2
3
4
5
6
7
8
9
10
11
12
13
> ttyd -p 8080 bash
[2017/01/05 14:31:42:7759] INFO: ttyd 1.2.2 (libwebsockets 1.7.5)
[2017/01/05 14:31:42:7759] INFO: tty configuration:
[2017/01/05 14:31:42:7760] INFO: start command: bash
[2017/01/05 14:31:42:7760] INFO: reconnect timeout: 10s
[2017/01/05 14:31:42:7760] INFO: close signal: SIGHUP (1)
[2017/01/05 14:31:42:7799] INFO: listening on port 8080
[2017/01/05 14:32:02:1003] INFO: HTTP / - 10.1.100.239 (10.1.100.239)
[2017/01/05 14:32:02:5699] INFO: HTTP /auth_token.js - 10.1.100.239 (10.1.100.239)
[2017/01/05 14:32:03:3588] INFO: WS /ws - 10.1.100.239 (10.1.100.239), clients: 1
[2017/01/05 14:32:03:3600] INFO: started process, pid: 29018
^Z
[1]+ Stopped ttyd -p 8080 bash

现在再次访问 webtty 已经没有响应, 但是没有报错退出, 显然程序是被 “暂停⏸” 了, 而不是被退出了, 再开一个终端可以看见, 进程在, 端口也在, 进程状态如下

1
root     29016  0.0  0.1 142632  3504 pts/0    Tl   14:31   0:00 ttyd -p 8080 bash

  • 使用 bg 命令将暂停的程序放入到后台继续执行
1
2
3
4
> jobs # 查看后台任务状态
[1]+ Stopped ttyd -p 8080 bash
> bg %1 # 从上面可以查询到, 有一个任务, 任务 ID 为 1,现在是暂停的状态, 使用 bg %ID 的参数将此任务放入到后台执行
[1]+ ttyd -p 8080 bash &

这时, 系统会自动帮我们在启动命令的最后面加入一个 & 后台命令启动

此时 webtty 的工作又恢复了正常, 而且之前暂停时在 webtty 输入的内容也都显示了出来, 由此可以看出, control+z 阻塞了程序的入口

1
2
3
# 再次查看后台任务
> jobs
[1]+ Running ttyd -p 8080 bash &

状态显示已在运行

  • 将已经在后台运行的程序再拉回到前台执行
1
2
3
4
> jobs
[1]+ Running ttyd -p 8080 bash &
> fg %1 # 使用 fg %ID 的方式可以把后台运行的程序拉回到前台执行
ttyd -p 8080 bash
  • 关闭程序

  • 运行在前台的程序需要关闭执行按下 control+c 组合键即可

  • 运行在后台的程序需要关闭执行 kill %ID 即可

参考文章