Bash中的job管理

2022-09-23 13:09:08 字數 2599 閱讀 3649

本來不準備寫這篇部落格的,因為任務管理(job管理)非常非常常用,以至於覺得根本沒有必要去寫這樣乙個東西。但想了下,還是記錄一下吧,也許有人會用到呢。

不知你是否碰到過這樣的情況,當你興致勃勃的開啟vim,寫**寫到正酣時,運營mm或者產品mm氣喘吁吁的跑過來:「趕緊幫我跑一下xx的資料,一會做ppt要用」。可是不想直接關閉當前的vim,而且某些系統下,又不能新開tty(如設定了maxlogins引數)去執行這些任務,這可怎麼辦?這其實就涉及到了任務(job)管理。

那麼什麼是任務管理?顧名思義,就是指在bash中對同乙個tty中的多個工作進行新增、刪除、處理等。由於bash中的每個工作實際上是當前bash的子程序,因此,從根本上說,job管理就是指對程序的管理。注意上述的表述中,使用了「同乙個tty」這一字眼,這時因為,我們是無法通過tty1的job管理去管理tty2中的job的。例如,我們在tty3終端通過ctrl+z將vim放置到後台暫停,在當前tty中,通過jobs命令檢視到的後台任務列表如下圖所示:

而這時登入新的tty,通過jobs命令檢視,發現並沒有jobs位於後台:

1.  通過ctrl+z方式將job拋到後台

剛才我們已經看到了,在vim編輯的過程中,通過ctrl+z快捷鍵的方式,可以將當前vim放入後台暫停,同時tty終端會輸出如下字樣的提示:

[1]+ stopped vim其中[1]指的是job的編號,在之後將工作放置到前台,或者殺死後台程序的時候會用到。

stopped代表當前程序的狀態(實際上,通過ctrl+z方式放置到後台的job預設都是stopped狀態),vim指的是被放置到後台的job。等等,那個加號+是什麼意思?如果我們再放置2個job到後台,通過jobs命令檢視當前後台的jobs列表,輸出如下:

發現不僅有+號,還有-號。其實+號指輸入fg命令時,缺省會將標識為+號的job取到前台來執行,-號則是+號job被fg之後的備胎。

2.  將命令丟到後台執行 &

在bash下,經常會做一些比較耗費時間的工作,比如讀取log的指令碼,可能需要10分鐘以上才能完成,總不能一直盯著吧?這時,最好的辦法在命令後面加上&,將其放入後台執行

作為測試,我們在test.php中輸入如下內容:

<?php $i = 0;

while($i++ < 30)

然後將其拋入後台執行:

我們看到,即使是在後台執行,程式的輸出還是會輸出到bash的標準輸出,即使你按了ctrl+c也不會有任何作用。這可以通過重定向解決:

php test.php 2>&1 >>test.log &通過jobs命令檢視jobs的狀態:

跟剛才的幾乎一樣,除了這次拋入後台的是running狀態。在任務執行完畢之後,螢幕會輸出如下字樣:

表明當前工作已經完成。

3.  將後台工作拿到前台來處理 fg (%jobnumber)

前面只講了如何將工作放置到後台以及如何檢視後台jobs狀態。現在資料跑完了,運營mm走了,繼續開啟剛才後台的vim編碼吧。這需要用到fg命令

命令格式:fg [%jobnumber] . 其中中的內容可省,這時預設取出的是標識為+的job.如果要取出指定的job,需要傳入job編號:

fg %1即可取出編號為1的job

4.  讓工作在後台的狀態變成執行中 bg (% jobnumber)

我們知道,通過ctrl+z放置放置到後台的job,預設是stopped狀態的,如果要讓程序在後台執行,應該怎麼做呢?bg命令就是幹這個的。

再次執行2中的指令碼,不過這次在執行後,我們立即按下ctrl+z使之暫停。jobs檢視狀態:

標號為3的job即是我們剛剛加入的。

執行bg %3

再次檢視jobs:

可以看到,job已經由stopped狀態程式設計running狀態,並且命令後面多了乙個&

5.  殺死後台的工作 kill

現在,後台的程序多了起來,如果有些job不需要執行了,放在後台總歸是不好的。這時,可以通過kill命令刪除後台的jobs. 命令格式:kill – signal %jobnumber

這與kill殺死一般的程序基本沒什麼區別,不同的是,這裡是job的編號而不是程序的pid.

signal是傳入的訊號,常用的有:

-l 列出kill的可用訊號

-1 重新讀取配置

-9 立即強制終止(不會有清理工作)

-15 正常終止乙個job(會有一些後續的清理工作)。

為了保險起見,慎重使用-9引數。

最後,給幾個hint:

(1). vim編輯過程中ctrl+z暫停手頭的工作,做一些其他的處理,是經常使用的操作。例如:為了防止修改的**不小心被同步到線上去,我們常常需要check編輯的檔案已經放入了rsync的ignore-list中。

(2). 通過&放置到後台的命令,雖然不會被ctrl+c終端,但是預設所有的輸出都會輸出到螢幕,這應該通過重定向來解決。如果輸出的內容不需要或者忽略看,可以簡單的重定向到/dev/null裝置。

(3). 如果乙個指令碼執行的時間較長,簡單放入後台不管可能會因為tty中斷而導致job中斷(即使是在後台,tty中斷的情況下,job也會中斷的)。這時可以通過nohup命令將執行指令碼放置到系統的後台而不是中斷的後台,該命令類似於:

nohup php test.php 2>&1  現在,享受job管理帶來的便利吧。

Bash中的job管理

本來不準備寫這篇部落格的,因為任務管理 job管理 非常非常常用,以至於覺得根本沒有必要去寫這樣乙個東西。但想了下,還是記錄一下吧,也許有人會用到呢。不知你是否碰到過這樣的情況,當你興致勃勃的開啟vim,寫 寫到正酣時,運營mm或者產品mm氣喘吁吁的跑過來 趕緊幫我跑一下xx的資料,一會做ppt要用...

企業 Saltstack 裡的Job管理

master在下發指令任務時,會附帶上產生的jid。minion在接收到指令開始執行時,會在本地的 var cache salt minion proc目錄下產生該jid命名的檔案,用於在執行過程中master檢視當前任務的執 況。指令執行完畢將結果傳送給master後,刪除該臨時檔案。我們在推送後...

oracle中job的應用

oracle中job的應用 1 建立儲存過程 create or replace procedure pro name asbegin insert into agri exhibition basecur messid,title,type,pub date select id,title,sor...