1. 程式人生 > >後臺執行進程的方法

後臺執行進程的方法

openstack

後臺進程:

我們每次在終端窗口執行命令的時候,進程總會一直占用著終端,走到進程結束,這段時間內,我們在終端的輸入是沒有用的。而且,當終端窗口關閉或網絡連接失敗後,再次打開終端,會發現進程已經中斷了。這是因為用戶註銷或者網絡斷開時,SIGHUP信號會被發送到會話所屬的子進程,而此 SIGHUP 的默認處理方式是終止收到該信號的進程。所以若程序中沒有捕捉該信號,當終端關閉後,會話所屬進程就會退出。

我們要實現後臺執行的目的,實際上是要完成如下兩個目標:

  • 使進程讓出前臺終端,讓我們可以繼續通過終端與系統進行交互。

  • 使進程不再受終端關閉的影響,即系統在終端關閉後不再向進程發送 SIGHUP 信號或即使發送了信號程序也不會退出。

以下的命令就圍繞著這兩個目標來實現。

&

首先是我們最經常遇到的符號 &,將它附在命令後面可以使進程在後臺執行,不會占用前臺界面。它實際上是在會話中開啟了一個後臺作業,對作業的操作我們後面再說。

但我們會發現,如果此時終端被關閉後,進程還是會退出。這是因為,& 符號只有讓進程讓出前臺終端的功能,無法讓進程不受 SIGHUP 信號的影響。

nohup

nohup 應該是另外一個我們常用的命令了,它的作用如其字面意思,使進程不受 SIGHUP 信號的影響。但我們在使用 nohup php test.php 後會發現,進程還會一直占用前臺終端,但即使終端被關閉或連接斷開了,程序還是會執行,另外我們會發現在當前文件夾下多了個名為 nohup.out 的文件。

這是因為 nohup 的功能僅僅是讓進程不受 SIGHUP 信號的影響,並不會讓出前臺終端,而且它還會在命令執行目錄下建立 nohup.out 用以存儲進程的輸出。如果進程不需要輸出,且不想讓 nohup 創建文件,可以將標準輸出和標準錯誤輸出重定向。

我們常將 nohup 和 & 搭配到一塊使用,執行命令如下 nohup command >/dev/null 2>&1 & 這樣,就可以放心的等待進程運行結果了。


後臺執行進程的方法