Linux 下的任务切换神器 Ctrl+Z

一、引言

不知道各位有没有遇到过如下囧境:”正在开心地使用 vim 编辑文件,突然发现忘记复制某些内容,只能暂时保存退出,复制好后重新打开文件继续编辑,或者干脆再打开一个终端,搞得十分凌乱?”。那有没有一种不退出 vim 程序,又能自由切到终端上执行其他命令的方法呢?当然有啦,而且不止一种(比如在 vim 命令模式下输入 :!command,不过这并不是今天想要介绍的内容),今天我们就利用 Ctrl+Z 快捷键来实现。

二、使用 Ctrl+Z 完成多任务切换

在 Linux 系统中,按下 Ctrl+Z 实际上是向当前程序发送了挂起中断信号(SIGTSTP),作用是将其挂起并放入后台。注意,挂起之后,程序就停止执行了,但是并没有退出。例如,我们编辑一个文件 vim file.txt,输入些内容后,然后在命令模式,按下 ctrl+z

[root@dev tmp]# vim file.txt
add some contents
// 按下 ctrl+z

[3]+  Stopped                 vim file.txt

我们会回到终端,可通过 ps -aux | grep file.txt | grep -v grep 查看进程状态:

[root@dev tmp]# ps -aux | grep file.txt | grep -v grep
root     28714  0.0  0.1 149380  5016 pts/1    T    16:35   0:00 vim file.txt

可以看到,进程状态为 T,即停止状态。

我们通过 jobs 命令,可以查看当前,后台进程有哪些:

[root@dev tmp]# jobs -l
[1]+ 32034 Stopped                 vim file.txt

可以看到,目前只有一个后台任务,编号为 1,状态为 Stopped。
我们可以通过执行 fg 将其唤醒到前台,(如果不加编号,则唤醒最近被放入后台的任务):

[root@dev tmp]# fg 1

执行完该命令,我们就重新进入 vim file.txt 的编辑界面了,也就从终端重新进入了 vim 程序:

add some contents
~
~
-- INSERT --

值得一提的是,我们可以同时打开多个程序,按下 ctrl+z 将其分别临时挂起,然后通过 jobsfg 命令的配合,在多个任务间自由切换,实现多任务管理。

[root@dev tmp]# jobs
[1]   Stopped                 vim file.txt
[2]-  Stopped                 vim file-2.txt
[3]+  Stopped                 vim file-3.txt
[root@dev tmp]# fg 2

附加说明:如果希望后台进程不维持在后台停止状态,而是让其继续执行,可以通过 bg 命令将其转为后台执行状态:

[root@dev tmp]# jobs
[1]-  Stopped                 vim file.txt
[6]+  Stopped                 tail -f /etc/hosts
[root@dev tmp]# bg 6
[6]+ tail -f /etc/hosts &
[root@dev tmp]# jobs
[root@dev-01 tmp]# jobs
[1]+  Stopped                 vim file.txt
[6]-  Running                 tail -f /etc/hosts &

可以看到,起初通过执行 ctrl+z 挂起的 6 号进程是 Stopped 的,通过执行 bg 6,其状态变为 Running 了。

Linux 下查看支持的中断信号,可以借助 kill -l

[root@dev tmp]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

总结:灵活运用 ctrl+z / jobs / fg / bg 就能实现简单的 Linux 终端下的多任务管理!

你可能感兴趣的:(Linux)