天天看點

Linux 下的任務切換神器 Ctrl+Z

一、引言

不知道各位有沒有遇到過如下囧境:”正在開心地使用 vim 編輯檔案,突然發現忘記複制某些内容,隻能暫時儲存退出,複制好後重新打開檔案繼續編輯,或者幹脆再打開一個終端,搞得十分淩亂?”。那有沒有一種不退出 vim 程式,又能自由切到終端上執行其他指令的方法呢?當然有啦,而且不止一種(比如在

vim

指令模式下輸入

:!command

,不過這并不是今天想要介紹的内容),今天我們就利用 Ctrl+Z 快捷鍵來實作。

二、使用 Ctrl+Z 完成多任務切換

在 Linux 系統中,按下 Ctrl+Z 實際上是向目前程式發送了

挂起

中斷信号(SIGTSTP),作用是将其挂起并放入背景。注意,挂起之後,程式就停止執行了,但是并沒有退出。例如,我們編輯一個檔案

vim file.txt

,輸入些内容後,然後在指令模式,按下

ctrl+z

[[email protected] tmp]# vim file.txt
add some contents
// 按下 ctrl+z

[3]+  Stopped                 vim file.txt
           

我們會回到終端,可通過

ps -aux | grep file.txt | grep -v grep

檢視程序狀态:

[[email protected] 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

指令,可以檢視目前,背景程序有哪些:

[[email protected] tmp]# jobs -l
[1]+ 32034 Stopped                 vim file.txt
           

可以看到,目前隻有一個背景任務,編号為 1,狀态為 Stopped。

我們可以通過執行

fg <job 編号>

将其喚醒到前台,(如果不加編号,則喚醒最近被放入背景的任務):

[[email protected] tmp]# fg 1
           

執行完該指令,我們就重新進入

vim file.txt

的編輯界面了,也就從終端重新進入了

vim

程式:

add some contents
~
~
-- INSERT --
           

值得一提的是,我們可以同時打開多個程式,按下

ctrl+z

将其分别臨時挂起,然後通過

jobs

fg

指令的配合,在多個任務間自由切換,實作多任務管理。

[[email protected] tmp]# jobs
[1]   Stopped                 vim file.txt
[2]-  Stopped                 vim file-2.txt
[3]+  Stopped                 vim file-3.txt
[[email protected] tmp]# fg 2
           

附加說明:如果希望背景程序不維持在

背景停止

狀态,而是讓其繼續執行,可以通過

bg

指令将其轉為

背景執行

狀态:

[[email protected] tmp]# jobs
[1]-  Stopped                 vim file.txt
[6]+  Stopped                 tail -f /etc/hosts
[[email protected] tmp]# bg 6
[6]+ tail -f /etc/hosts &
[[email protected] tmp]# jobs
[[email protected] tmp]# jobs
[1]+  Stopped                 vim file.txt
[6]-  Running                 tail -f /etc/hosts &
           

可以看到,起初通過執行

ctrl+z

挂起的 6 号程序是

Stopped

的,通過執行

bg 6

,其狀态變為

Running

了。

Linux 下檢視支援的中斷信号,可以借助

kill -l

[[email protected] 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 終端下的多任務管理!

繼續閱讀