国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 操作系統 > 正文

Bash中的任務(job)管理

2024-06-28 13:23:34
字體:
來源:轉載
供稿:網友
Bash中的任務(job)管理

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

  不知你是否碰到過這樣的情況,當你興致勃勃的打開VIM,寫代碼寫到正酣時,運營MM或者產品MM氣喘吁吁的跑過來:“趕緊幫我跑一下xx的數據,一會做PPT要用”??墒遣幌胫苯雨P閉當前的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){    echo $i;    sleep(1);}

然后將其拋入后臺執行:

我們看到,即使是在后臺執行,程序的輸出還是會輸出到Bash的標準輸出,即使你按了CTRL+C也不會有任何作用。這可以通過重定向解決:

php test.php 2>&1 >>test.log &

通過jobs命令查看jobs的狀態:

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

表明當前工作已經完成。

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

前面只講了如何將工作放置到后臺以及如何查看后臺jobs狀態?,F在數據跑完了,運營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命令將運行腳本放置到系統的后臺而不是當前tty的后臺,該命令類似于:

nohup php test.php 2>&1  &

現在,享受job管理帶來的便利吧。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石渠县| 霍城县| 徐州市| 内黄县| 沙雅县| 大冶市| 耿马| 姜堰市| 依兰县| 五家渠市| 黑山县| 松滋市| 昭觉县| 铅山县| 慈利县| 通辽市| 策勒县| 宁都县| 屏南县| 沙洋县| 黎城县| 石渠县| 集贤县| 蒲江县| 朔州市| 安庆市| 宁陕县| 融水| 辉县市| 武威市| 栾城县| 高雄县| 阿拉善右旗| 天镇县| 泌阳县| 铁岭县| 封开县| 通辽市| 磐安县| 马山县| 贞丰县|