大家知道進程是Unix操作系統的是守護神。可在任務已經執行完成了,但是卻沒有正常結束進程。又或者進程無緣無故占用了大量的系統資源,導致系統速度減慢,影響了其他作業的正常運行。對於這些不服管教的進程,系統工程師只能夠拿起手中的屠刀,實行“殺無赦”政策。下面,我們來學習2種方法來解決這個問題。
通過父進程來殺死子進程。
在Unix操作系統中,進程有父子進程的關系。某個進程可能會創建另外一個進程,這個創建者就是父進程,而新建立的進程就是子進程。通常情況下,Unix操作系統如果停止了一個父進程,則該父進程產生的所有子進程都將自動終止。但是,這個過程可能會破壞數據文件或者其他一些難以預料的結果。故正常情況下,筆者是建議系統工程師先關閉掉所有的子進程,然後再關閉父進程。
但是,當采取了任何手段,包括kill -9手段之後仍然無法正常殺死頑固進程之後,Unix操作系統工程師只好采用這個終極殺手,即通過關閉父進程來自動關閉不聽話的子進程。
但是,正如上面所說的,這很可能會導致一些連鎖反映。所以在采用這種方式之前,系統工程師還是要預先估計一下可能會帶來的後果。如可以把這個父進程所產生的子進程能夠關閉的先關閉掉。然後再通過殺死父進程來自動終止子進程。這可以把對操作系統的不利影響降低到最低。
利用系統注銷功能來關閉殺不掉的進程。
若通過關閉父進程仍然殺不死子進程的話,那麼管理員還可以通過注銷系統的方式來殺死進程。這就好象Windows系統注銷一樣,會關閉當前的所有進程與任務。不過有時候系統工程師可能不想關閉所有的進程,如一些關系到服務器運行的進程。此時,系統工程師在注銷Unix操作系統之前,需要采取一定的手段,讓系統注銷後仍然能夠保持某些進程正常運轉。
如果系統工程師想在系統注銷後仍然執行一個或者多個進程,則可以采用nohup命令。如此設置後,即使在系統注銷後,在後台執行的進程仍然可以繼續執行,不會終止。這個手段就可以把系統注銷對於用戶的不利影響降低到最低。如果Unix操作系統是企業中的一台服務器,而不是客戶端,那麼這個特性將會對企業很有利。
nohup命令運行由Command參數和任何相關的Arg參數指定的命令,而忽略所有掛斷信號。為此在系統注銷後仍然可以使用nohup命令運行後台中的程序。注意無論是否將 nohup命令的輸出重定向到終端,輸出都將附加到當前目錄的nohup.out 文件中。如果當前目錄的nohup.out文件不可寫,則輸出重定向到$HOME/nohup.out 文件中。
如果上面這些文件都不可以用的話,那麼Command參數指定的命令不可調用。故系統工程師如果事後要查看這些Unix操作系統注銷後仍然運行在後台進程的結果,就可以依次查看以上這兩個文件。
Unix操作系統注銷後,通常再頑固的進程都會被殺死掉。不過有時候會因為進程實在難纏,注銷的過程時間可能會比較長。若操作系統在長時間後仍然無法注銷的話,那只有強制重新啟動電腦了。不過重新啟動後很可能會出現啟動故障。
重新啟動系統來終止進程是不得已而為止的做法了。所以,我們盡量不要選擇這個方法,希望大家都能夠提高自己的Unix操作系統的操作水平。