Linux Shell學習筆記四

來源:互聯網
上載者:User

第6學時 進程

6.1 啟動一個進程

在UNIX中無論何時執行一個命令,它都建立或啟動一個新進程。

例如:當使用ls命令列一個目錄內容時,就啟動一個進程。

 

作業系統使用一個叫做pid或進程ID的5位元字ID來跟蹤進程。系統中每個進程都有一個唯一的pid。

pid最終可能重複是因為所有可能的數字都被用完,所以下一個pid又從頭開始。

在任何時刻,系統中沒有兩個相同的pid進程,因為pid是UNIX用來跟蹤每個進程的。

 

6.1.1.前台進程

預設下,使用者啟動的每個進程都在前台運行。進程從鍵盤得到輸入並把輸出送到螢幕上。

在運行命令時,不能運行其他命令(啟動任何其他進程)。這時可以輸入命令,但由於UNIX鍵盤輸入緩衝區的原因,

直到前面命令執行完後才會顯示出來。

UNIX提供一些措施來在後台啟動進程、懸掛前台進程和在前台和後台之間移動進程。

 

6.1.2 後台進程

一個後台進程運行時不必與鍵盤串連。如果後台進程要求鍵盤輸入,則進行等待。

在後台運行一個進程的優點是使用者可以運行其他命令,使用者不需要等待一個進程完成再啟動另一個。

 

啟動一個後台進程最簡單的方式是在命令的後面增加一個&符號

例如:$ ls cho*.doc &

 

要求輸入的後台進程

如果使用者運行一個要求輸入的後台進程,而且沒有把它重新導向為用讀檔案來代替鍵盤輸入,則進程停止。

如果使用者把進程和任務監測置為可用,則在一個空命令提示字元後按Enter或啟動一個命令時會返回一個資訊。

 

1.把一個前台進程移動到後台

除了使用&在後台運行一個進程外,使用者還可以把一個前台進程移動到後台。

一個前台進程運行時,Shell不處理任何新命令。使用者在輸入新命令前,必須懸掛前台進程得到一個提示符。

 

當前台進程被懸掛時,有一個命令提示字元可以讓使用者輸入其他命令,原來的進程仍在記憶體中,但不佔用CPU時間。

要恢複前台進程有兩個選擇---後台和前台。

bg命令使使用者能把懸掛進程置到後台;fg命令則可以把進程返回到前台。

使用CTRL+Z,停止一個進程。bg恢複一個進程。

 

2.把一個後台移動到前台

當有一個進程在後台或是懸掛,使用者可以使用fg命令把它移動到前他。

預設下,最後一個被懸掛或移動到背景進程將被移到前台。

 

3。使後台進程保持繼續運行(nohup命令)

當退出系統或串連意外中斷時,使用者可以防止一個後台進程終止。nohup命令可以防止使用者的進程受到HUP訊號,從而進程可以

只需將nohup放在運行命令的前面即可。

由於nohup被設計為無終端時運行,所以它希望使用者把輸出重新導向到一個檔案中。如果不這樣做,nohup自動重新導向到一個

叫做nohup.out中。

 

4.等待後台進程結束(wait命令)

在做其他事情前等待一個進程結束有兩種方法。使用者可以隔幾分鐘按一下enter,直到得到一個完成的資訊。或使用wait命令

使用wait有三種方式--無選項、使用進程ID、使用加%號首碼的任務標號

例如:$ wait %1

這時不能輸入其他命令,直到任務結束。

 

6.2 列出正在啟動並執行進程

使用者可以在前台或後台啟動一個進程,懸掛他們,並在前台和後台之間移動,但怎麼才能知道正在啟動並執行是哪些進程呢?

可以使用jbos或ps命令;

6.2.1 ps命令

在預設情況下,它顯示正在啟動並執行進程。它還可以接受許多不同選項。

對每個正在啟動並執行進程,它提供四條資訊:pid、TTY(進程啟動並執行終端)、進程消耗的CPU時間、以及啟動並執行命令名。

ps中-f選項是最長用的,它提供更多的資訊

資訊列表如下:

列名描述

UID進程所屬使用者ID

PID進程ID

PPID父進程ID(啟動它的進程ID)

C進程使用CPU時間

STIME進程開始時間

CMD啟動該進程的命令

 

6.3 殺死一個進程(kill命令)

$ kill %1

%1表示任務號

使用者可以使用進程ID而不是加%的任務標號來殺死一個特定進程。要使用進程ID來殺死進程,可以使用命令:

$ kill 6639  #(PID號)

 

6.4 父進程和子進程

在上面$ ps -f例子中,每個進程被賦予兩個ID:進程ID(pid)和父進程ID(ppid)。系統中的每個使用者進程都有一個父進程。

使用者啟動並執行大部分命令把Shell當作父進程。

Shell的父進程通常是作業系統或終端通訊進程。

 

6.4.1 任務ID和進程ID

後台進程和懸掛進程通常由任務標號操作,這個數字與進程ID不同,它是因為較短才被使用。

 

6.4.2 SubShells

當使用者運行Shell指令碼時,除了指令碼中的任何命令外,還建立了另一個Shell解譯器的拷貝。

新Shell被稱為一個SubShells,就像一個目錄包含在另一個目錄下時成為子目錄一樣。

例如:shell指令檔psit

#! /bin/ksh

ps -ef | grep root

exit 0

當運行時,psit的返回結果是:

$ psit

root 9830 3662 0 22:57:00 pts/6 0:00 ksh psit

root 9831 9830 0 22:57:01 pts/6 0:00 ps -ef

root 9832 9830 0 22:57:01 pts/6 0:00 grep root

root 3662 3657 0 22:57:01 pts/6 0:00 -ksh

從上看出,當運行psit此指令檔時,會產生一個父進程 ksh psit,其中執行的命令都將成為其子進程。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.