其實在Unix操作系統中有多種手段可以殺死這些異常的進程。通常情況下,我們建議是殺進程的工作要有序的進行,盡量采取一些對操作系統影響小的方法。在這裡,我們來介紹2種方法,大家一起來學習下吧。
在本機上殺死進程
系統工程師可以直接在Unix操作系統的命令中斷采用相關的命令來殺死異常進程。如可以按鍵盤上的DEL鍵、Ctrl+D鍵、Break鍵等等殺死進程。系統工程師按下這些鍵的任何一個,都會向系統進程發送中斷信號。注意,通常情況下只有root用戶才能夠殺死其他擁護的進程或者系統進程;而其他用戶只能夠殺死自己的進程。
如現在Unix操作系統中要部署一個Oracle數據庫服務器。為了管理方便,Unix操作系統工程師建立了一個Oracle用戶,用來進行數據庫系統的維護與管理。此時,Oracle這個用戶就會運行幾個進程,如tns等進程。正常情況下,Oracle用戶以及root用戶都可以殺死這個進程。但是如果這個系統中還有其他用戶,則無法殺死這個進程。
另外如果用戶想殺的進程是shell的子進程,則還可以采用kill命令家進程的作業號的方式。如kill % 作業號等等。Shell是Unix操作系統中很好的一個交互工具,也有人把它叫做命令行界面,是Unix操作系統下最傳統、歷史最悠久的用戶和計算機的交互截面。
系統管理員可以在這裡直接輸入相關的命令來執行各種各樣的維護任務,包括殺死異常進程等等。其實它跟微軟操作系統下的命令行界面很相似,不過也有一些差異的地方。如Unix操作系統下的shell既是用戶與系統交互的界面,也是控制系統的腳本語言。這就是兩者最大的差異。Shell做重要的特點就是隱藏了操作系統的底層細節,故對於工程師來說這是首選的維護系統的工具。
其實大部分時候工程師都是在shell環境下管理進程,包括上篇文章中談到的查看進程信息、把後台進程調到前台等等。故在本機上殺死進程也大部分是在shel環境下進行。為此系統工程師用的更多的可能還是利用kill命令來殺死shell子進程。
從另一個終端來殺進程
有時候可能進程比較頑固,若從當前終端來殺它的話,還殺不掉。此時管理員就可以通過曲線救國的方式,從另一個終端登陸到Unix操作系統,然後采用kill命令來殺死異常進程。這個主要的步驟如下。
第一步從另一個終端登陸操作系統。通常情況下,Unix操作系統支持多個終端。當系統工程師發現在當前終端無法殺死某個進程的話,則不用急於通過重新啟動或者強制關機等方式來殺死這些殺不掉的進程。這是下下之策。遇到這種情況,系統工程師可以從另外一個終端登陸到操作系統,然後嘗試使用kill命令來殺死進程。
第二步使用ps –u命令來查找需要殺死進程所對應的進程號或者作業號。ps 命令將活動進程的當前狀態和有關的內核線程寫到標准輸出中。這個命令有很多參數,如-m、-l、s、u 和 v等等。
注意當采用-m參數時則系統將使用額外的行顯示與進程相關的線程。不帶任何參數時,ps 命令將會顯示關於當前工作站的信息。而使用-o參數時,ps命令檢查內存或調頁區域並確定進程創建時的命令名和參數是什麼。如果 ps 命令不能找到該信息,存儲在內核中的命令名顯示在方括號中。如果想快速查找特定作業的進程信息,采用-u參數是不錯的選擇。如ps –u oracle 等等。
第三步使用kill命令殺死異常進程,如kill 26014。Kill命令就會向目標進程發送一個信號以中斷這個進程。通常情況下,此時就可以殺死那些比較頑固的進程。如果在kill命令後面沒有加上進程號或者作業號,則系統會采用默認的信號值15,這是一個終止命令。
如果此時還沒有殺死這個進程的話,那麼可以采用更強烈的方式,即kill -9 進程號。對於頑固進程來說,這條命令可能會更加有用。這主要是因為這個命令使進程在接收到中斷信號後,不能關閉它在使用的任何文件。正是因為有這個後遺症,故只有在采用上面那幾種手段無效的情況下,才推薦使用這個終極殺手。
使用這2個方法,我們就可以關閉Unix操作系統中不友好的進程了。希望大家可以好好的學習Unix操作系統的知識。