通过进程的前后台切换方式实现不同应用的切换。
背景:linux启动一个程序后,切换到后台执行,想继续在linux操作。
在Linux中,你可以使用以下几种方法使一个程序在后台启动并退出,但仍然保持其进程运行:
一、Linux启动一个程序在后台执行
1. 使用nohup
和&
:
$ nohup your_program &
使用nohup
命令可以使程序忽略挂断信号(SIGHUP),这样即使你退出了终端,程序也会继续运行。&
符号使程序在后台运行。
2. 使用ctrl+Z
:
如果你已经在前台启动了程序,可以使用ctrl+z
命令将其移到后台:
$ ./your_program # 运行在前台
$ 按 Ctrl + Z # 将程序暂停,并将其移到后台
$ bg #在后台继续运行程序
$ disown -h # 使程序在你退出终端时仍然运行
3.使用screen
:
screen
是一个在UNIX和Linux系统上运行的终端复用器,它允许用户在同一台机器上的一个物理终端上启动多个虚拟终端。
它可以创建一个新的会话,并在该会话中运行你的程序。这样,即使你退出了终端,会话仍然保持活动状态。你可以重新连接到这个会话,查看和控制程序。
screen的功能
screen的功能大体有三个:
会话恢复
:只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。多窗口
:在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。会话共享
:Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。
如何使用screen
:安装 sudo apt install screen
3.1 创建会话
$ screen -S session_name your_program
3.2 要重新连接到此会话:
$ screen -r session_name
3.3 中途退出会话,但程序继续运行:
如果你想从 screen
会话中退出,但不终止正在运行的程序,你可以按下 Ctrl
+ A
,然后按下 D
。
这将会从 screen
会话中分离,但程序仍然在后台运行。
示例:使用secreen开启多个会话在会话中执行程序。
每个会话相当于一个逻辑终端,可以退出会话,让程序依然运行。
$ screen -S appDemo_session ./appDemo.lua
# 开启新的会话,并执行appDemo脚本程序
> help
Available commands:
1. show
2. exit
3. help
4. run
>
# 按ctrl+A D 退出会话
[detached from 1546455.appDemo_session]
$ screen -r appDemo_session
[detached from 1546455.appDemo_session]
$
$
$ screen -ls # 查看所有会话
There is a screen on:
1546455.appDemo_session (2024年01月24日 10时01分53秒) (Detached)
1 Socket in /run/screen/S-zsh.
$
3.4 结束一个 screen
会话:
如果你想结束一个 screen
会话并停止其中的程序,你可以首先使用 screen -r [会话名称或ID]
重新连接到该会话,然后按下 Ctrl
+ C
来终止程序。
接着,你可以使用 exit
或按 Ctrl
+ D
来结束该 screen
会话。
$ screen -S appDemo_session ./appDemo.lua
-------------以下在在会话中的逻辑终端显示,退出后会消失
> help
Available commands:
1. show
2. exit
3. help
4. run
> exit
exitCLI
-------------
[screen is terminating]
$
3.5 创建多个窗口:
在同一个 screen
会话中,你可以使用 Ctrl
+ A
然后再按 C
来创建一个新的窗口。
每个窗口可以有自己的命令行历史。要切换窗口,只需按 Ctrl
+ A
然后按 N
(下一个)或 P
(上一个)。
要关闭窗口,只需按 Ctrl
+ A
然后按 K
,然后选择要关闭的窗口。
3.6 命名窗口:
你可以给窗口命名以方便识别。只需按 Ctrl
+ A
然后按 A
(重命名)。输入新名称并按回车。
3.7 查看所有窗口,
可以按下Ctrl+a
,然后按下w
键。这将显示当前screen
会话中的所有窗口列表,包括窗口的编号和名称。
$ screen -S appDemo_session ./appDemo.lua
-------------以下在在会话中的逻辑终端显示,退出后会消失
> help
Available commands:
1. show
2. exit
3. help
4. run
>
$ ls
appDemo.lua
# 按ctrl+A 然后按K,输入y表示结束当前窗口
Really kill this window [y/n]
在一个会话中创建多个窗口
$ ls
appDemo.lua
# 按三次ctrl+a,然后按c,创建三个各自独立的窗口,每个窗口有自己的命令行历史
# 然后按 ctrl+a,然后按w查看所有窗口
0$ appDemo.lua 1$ bash 2-$ bash 3*$ bash
# 现在相当于一个会话appDemo_session中有四个窗口,需要在四个窗口都exit才能退出该会话
二、ctrl+Z停止了进程之后,怎么再进入该程序?
在Unix和Linux系统中,当你使用Ctrl+Z
将一个程序暂停并放到后台时,该程序实际上是被挂起(暂停)了。
为了再次运行这个程序,你可以使用以下方法:
- bg (Background) :
使用bg
命令可以将挂起的程序放到后台继续运行。
bg
- fg (Foreground) :
如果你想要将程序重新移到前台,可以使用fg
命令。
fg %1
其中%1
是你想要移到前台的挂起程序的编号。你可以使用jobs
命令查看挂起的程序的编号。
3. jobs:
使用jobs
命令可以列出当前挂起的程序。这些程序的编号可以帮助你确定要使用fg
或bg
命令时应该使用的编号。
jobs -l # 列出所有挂起的程序及其PID
- kill:
如果你想要结束一个挂起的程序,可以使用kill
命令。但是,首先确保你真的想要结束它。
kill %1
请注意,上述方法主要适用于shell环境中。如果你在图形界面中(如使用X Window System)运行程序,那么你可能需要使用不同的方法来控制程序的运行。
三、综合example示范
$ ./student
===== 学生信息管理系统 =====
1. 录入学生信息
2. 显示学生信息
3. 查询学生信息
4. 修改学生信息
5. 删除学生信息
6. 退出
请选择操作: ^Z
[1]+ 已停止 ./student
$ bg
[1]+ ./student &
[1]+ 已停止 ./student
$ jobs -l
[1]+ 1545288 停止 (tty 输入) ./student
$ ./stu11
Student Information Management System
1. Add Student
2. Display Students
3. Search Student
4. Delete Student
5. Exit
Enter your choice: ^Z
[2]+ 已停止 ./stu11
$ jobs -l
[1]- 1545288 停止 (tty 输入) ./student
[2]+ 1545290 停止 ./stu11
$
$ ./appDemo.lua
> help
Available commands:
1. show
2. exit
3. help
4. run
> ^Z
[2]+ 已停止 ./appDemo.lua
$ jobs -l
[1]- 1545480 停止 ./stu11
[2]+ 1545484 停止 ./appDemo.lua
$ bg
[2]+ ./appDemo.lua &
$ fg %2
./appDemo.lua
Unknown command. Type 'help' for available commands.
> help
Available commands:
1. show
2. exit
3. help
4. run
> ^Z
[2]+ 已停止 ./appDemo.lua