linux的作业控制(job control)
引用:http://blog.chinaunix.net/u2/68904/showart_1803789.html
?
把作業放到后臺運行:‘ & ’
舉個簡單的例子, 我們要將 /etc/ 整個備份成為 /tmp/etc.tar.gz 時,又不想要等待, 那么可以這樣做:
[root@linux ~]# tar -zpcf /tmp/etc.tar.gz /etc &[1] 24874 <== [job number] PID[root@linux ~]# <== 前臺可以繼續作業,不受影響! ?
在該指令的最后面加上一個‘ & ’代表將該指令丟到后臺中, 此時 bash 會給予這個指令一個‘工作號碼(job number)’,就是那個 [1] 啦! 至于后面那個 24874 則是該指令所觸發的‘ PID ’了! 我們可以繼續操作 bash 了!不過,那么丟到背景中的工作什么時候完成?完成的時候會顯示什么? 如果你輸入幾個指令后,突然出現這個資料:
[1]+ Done tar -zpcf /tmp/etc.tar.gz /etc
就代表 [1] 這個工作已經完成 (Done) ,該工作的指令則是接在后面那一串指令列。此外,這樣的情況最大的好處是: 不怕被 [ctrl]-c 中斷的啦!
此外,將工作丟到背景當中要特別注意資料的流向喔!舉例來說,如果我將剛剛那個指令改成:
[root@linux ~]# tar -zpcvf /tmp/etc.tar.gz /etc &
情況會怎樣?呵呵,在背景當中執行的指令,如果有 stdout 及 stderr 時, 他的資料依舊是輸出到螢幕上面的,所以,我們會無法看到提示字元,當然也就無法完好的掌握前景工作。 所以啰,最佳的狀況就是利用資料流重導向,將輸出資料傳送至某個檔案中。舉例來說,我可以這樣做:
[root@linux ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &[1] 24984[root@linux ~]#?
呵呵!如此一來,資料都給他傳送到 /tmp/log.txt 當中,當然就不會影響到我們前景的作業了。 這樣說,您應該可以更清楚資料流重導向的重要性了吧?!^_^
# 將‘目前’的工作丟到背景中‘暫?!?#xff1a;[ctrl]-z
想個情況:如果我正在使用 vi ,卻發現我有個檔案不知道放在哪里,需要到 bash 環境下去搜尋,此時,是否要結束 vi 呢?呵呵!當然不需要啊!只要暫時將 vi 給他丟到背景當中等待即可。 例如以下的案例:
[root@linux ~]# vi ~/.bashrc
# 在 vi 的一般模式下,按下 [ctrl]-z 這兩個按鍵
[1]+ Stopped /usr/bin/vim ~/.bashrc[root@linux ~]# <==順利取得了前景的操控權! ?
在 vi 的一般模式下,按下 [ctrl] 及 z 這兩個按鍵,螢幕上會出現 [1] ,表示這是第一個工作, 而那個 + 代表目前在背景下預設被取用的那個工作 (與 fg 這個指令有關 )! 而那個 Stopped 則代表目前這個工作的狀態。在預設的情況下,使用 [ctrl]-z 丟到背景當中的工作都是‘暫?!臓顟B喔!
# 觀察目前的背景工作狀態: jobs
[root@linux ~]# jobs [-lrs]
參數:
-l? :除了列出 job number 之外,同時列出 PID
-r? :僅列出正在背景 run 的工作;
-s? :僅列出正在背景當中暫停 (stop) 的工作。
范例:
范例一:觀察目前的 bash 當中,所有的工作,與對應的 PID
[root@linux ~]# jobs -l[1]+ 24988 Stopped /usr/bin/vim ~/.bashrc[2]- 25006 Stopped /usr/bin/vim ~/.bash_history ?
如果想要知道目前有多少的工作在背景當中,就用 jobs 這個指令吧!一般來說,直接下達 jobs 即可! 不過,如果您還想要知道該 job number 的 PID 號碼,可以加上 -l 這個參數啦! 在輸出的資訊當中,例如上表,仔細看到那個 + - 號喔!那個 + 代表預設的取用工作。 所以說:‘目前我有兩個工作在背景當中,兩個工作都是暫停的, 而如果我僅輸入 fg 時,那么那個 [1] 會被拿到前景當中來處理’!
# 將背景工作拿到前景來處理:fg
剛剛提到的都是將工作丟到背景當中去執行的,那么有沒有可以將背景工作拿到前景來處理的? 有啊!就是那個 fg 啦!舉例來說,我們想要將上頭范例當中的工作拿出來處理時:
[root@linux ~]# fg %jobnumber
參數:
%jobnumber :工作的號碼。注意,那個 % 是可有可無的!
范例:
范例一:先以 jobs 觀察工作,再將工作取出:
[root@linux ~]# jobs[1]+ Stopped /usr/bin/vim ~/.bashrc[2]- Stopped /usr/bin/vim ~/.bash_history[root@linux ~]# fg <==預設取出那個 + 的工作,亦即 [1][root@linux ~]# fg %2 <==直接規定取出的那個工作號碼! ?
經過 fg 指令就能夠將背景工作拿到前景來處理啰!
# 讓工作在背景下進行: bg
我們剛剛提到,那個 [ctrl]-z 可以將目前的工作丟到背景底下去‘暫?!?#xff0c; 那么如何讓一個工作在背景底下‘ Run ’呢?我們可以在底下這個案例當中來測試! 注意喔!底下的測試要進行的快一點!^_^
范例一:一執行 find / -perm +7000 后,立刻丟到背景去暫停!
[root@linux ~]# find / -perm +7000
# 此時,請立刻按下 [ctrl]-z 暫停!
[1]+ Stopped find / -perm +7000[root@linux ~]# ?
范例二:讓該工作在背景下進行,并且觀察他!!
[root@linux ~]# jobs ; bg %1 ; jobs[1]+ Stopped find / -perm +7000[1]+ find / -perm +7000 &[1]+ Running find / -perm +7000 & ?
看到哪里有差異嗎?呼呼!沒錯!就是那個狀態列~以經由 Stopping 變成了 Running 啰! 看到差異點,嘿嘿!指令列最后方多了一個 & 的符號啰! 代表該工作被啟動在背景當中了啦! ^_^
# 管理背景當中的工作: kill
剛剛我們可以讓一個已經在背景當中的工作繼續工作,也可以讓該工作以 fg 拿到前景來, 那么,如果想要將該工作直接移除呢?或者是將該工作重新啟動呢?呵呵! 這個時候就得需要給予該工作一個訊號 (signal) ,讓他知道該怎么作才好啊! 此時, kill 這個指令就派上用場啦!
[root@linux ~]# kill -signal %jobnumber[root@linux ~]# kill -l ?
參數:
-l? :這個是 L 的小寫,列出目前 kill 能夠使用的訊號 (signal) 有哪些?
signal :代表給予后面接的那個工作什么樣的指示啰!用 man 7 signal 可知:
-1 :重新讀取一次參數的設定檔 (類似 reload);
-2 :代表與由鍵盤輸入 [ctrl]-c 同樣的動作;
-9 :立刻強制刪除一個工作;
-15:以正常的程序方式終止一項工作。與 -9 是不一樣的。
范例:
范例一:找出目前的 bash 環境下的背景工作,并將該工作刪除。
[root@linux ~]# jobs[1]+ Stopped vim bashrc[root@linux ~]# kill -9 %1[1]+ 已砍掉 vim bashrc ?
范例:找出目前的 bash 環境下的背景工作,并將該工作終止掉。
[root@linux ~]# jobs[1]+ Stopped vim bashrc[root@linux ~]# kill -SIGTERM %1[1]+ 終止 vim bashrc ?
# -SIGTERM 與 -15 是一樣的!您可以使用 kill -l 來查閱!
特別留意一下, -9 這個 signal 通常是用在‘強制刪除一個不正常的工作’時所使用的, -15 則是以正常步驟結束一項工作(15也是預設值),兩者之間并不相同呦!舉上面的例子來說, 我用 vi 的時候,不是會產生一個 .filename.swp 的檔案嗎? 那么,當使用 -15 這個 signal 時, vi 會嘗試以正常的步驟來結束掉該 vi 的工作, 所以 .filename.swp 會主動的被移除,但若是使用 -9 這個 signal 時, 由于該 vi 工作會被強制移除掉,因此, .filename.swp 就會繼續存在檔案系統當中。 這樣您應該可以稍微分辨一下了吧?
其實, kill 的妙用是很無窮的啦!他搭配 signal 所詳列的資訊 (用 man 7 signal 去查閱相關資料) 可以讓您有效的管理工作與程序 (Process),此外,那個 killall 也是同樣的用法! 至于常用的 signal 您至少需要瞭解 1, 9, 15 這三個 signal 的意義才好。 此外, signal 除了以數值來表示之外,也可以使用訊號名稱喔! 舉例來說,上面的范例二就是一個例子啦!至于 signal number 與名稱的對應, 呵呵,使用 kill -l 就知道啦(L的小寫)!
總結
以上是生活随笔為你收集整理的linux的作业控制(job control)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch深度学习参加平安银行数据大
- 下一篇: linux恶意代码实验报告,如何在Cen