一、引言
不知道各位有没有遇到过如下囧境:”正在开心地使用 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 <job 编号>
将其唤醒到前台,(如果不加编号,则唤醒最近被放入后台的任务):
[root@dev tmp]# fg 1
执行完该命令,我们就重新进入 vim file.txt
的编辑界面了,也就从终端重新进入了 vim
程序:
add some contents
~
~
-- INSERT --
值得一提的是,我们可以同时打开多个程序,按下 ctrl+z
将其分别临时挂起,然后通过 jobs
和 fg
命令的配合,在多个任务间自由切换,实现多任务管理。
[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 终端下的多任务管理!