一般來說,程序在其執行者離線之後就不會繼續執行。
若要讓指令在其執行者離線後能繼續執行,可用:
nohup 指令 &
而且,指令執行後的標準輸出,將被記錄在檔案中。
這個記錄檔通常是使用者家目錄下的nohup.out(若沒有這個檔案,則在執行nohup後會自動建立)。
一般來說,程序在其執行者離線之後就不會繼續執行。
若要讓指令在其執行者離線後能繼續執行,可用:
nohup 指令 &
而且,指令執行後的標準輸出,將被記錄在檔案中。
這個記錄檔通常是使用者家目錄下的nohup.out(若沒有這個檔案,則在執行nohup後會自動建立)。
shell前景(foreground)與shell背景(background):
在一個shell中,所謂的「前景程序」,是說該程序在執行時會把執行的過程顯示在螢幕上讓使用者能掌控進度,但同時,使用者也無法再進行下一個指令,必須等到此程序告一段落。而所謂的「背景程序」便不同了,該程序在執行時不會把過程顯示在螢幕上(只顯示執行結果),而使用者可以在程序進行的同時輸入其他指令(產生其他程序),而程序間不會互相干擾。
※ 註:背景程序無法用按<ctrl>+<c>終止。
(1) 執行指令時,可將此該指令會產生的程序設定為背景程序,其寫法是在欲輸入的指令後方加一個空白字元和一個&符號,即是:
指令 &
例如,今有一個名為file1的檔案,要將之複製到名為dir1的資料夾中,若file1所占容量很大,則複製起來必會花不少時間。則可以輸入:
cp -p file1 dir1 &
便可將這個程序移到背景中處理,以免複製的過程佔用到螢幕。
上例指令執行之後,螢幕會顯示一行資訊,如:
[1] 20451
其中,用[]包起來的1,指的是該背景程序的「編號」。
而後面的20451,指的是這個程序的PID。
(2) 將當前正在執行的前景程序放入背景執行:
按下<ctrl>+<z>即可。
(3) 查看目前有哪些背景程序:
使用 jobs 選項。其中,選項有:
※ -l:表示要顯示出背景程序的PID。
※ -r:表示只需要顯示目前正在執行中的背景程序。
※ -s:表示只需要顯示目前已經暫停執行的背景程序。
輸入後,會顯示出背景程序的資料(每一行代表一個背景程序),例如:
[1]+ 20583 Stopped vim kkk
說明如下:
[1] |
表示此程序的編號是1。 |
+ |
加號+表示這個程序是最近第一個被加入到背景的程序,若為減號-表示這個程序是最近第二個被加入到背景的程序。 |
20583 |
這是該程序的PID。 |
Stopped |
該程序的狀態。Stopped代表暫停執行,Running代表執行中。 |
vim kkk |
這是產生此程序的指令碼。 |
(4) 將目前正在背景中的程序,拿回前景來處理:
fg %N
其中,N是程序的編號。即是jobs指令所顯示的資料中,[]內的數字。此指令可以將編號N的背景程序拿回前景來處理。
(5) 執行目前在背景中暫停的程序(程序仍在背景,只是由Stopped改為Running):
bg %N
其中,N是程序的編號。此指令可以執行編號N的背景程序。
(6) 強制刪除目前正在背景中的程序,並終止其執行:
kill -9 %N
其中,N是程序的編號。此指令可以強制刪除編號N的背景程序。
※註:kill這個指令可以管理的不只背景程序,更多的用法之後將會說明。
1. 簡介:
在作業系統中執行一項指令、或執行一個程式,其過程在記憶體中進行,且被稱為「程序(process)」。也可將程序理解為「作業系統所要進行的一次工作、或任務」。重點說明如下:
(1) 一個程序有其「執行者」,也就是指令或程式的執行者,可能是系統帳號、或一般使用者、或root。一旦當指令或程式被執行,系統就會自動將此次執行定義為一個程序,執行完畢後,程序就消失了。
(2) 每個程序都有其識別碼,稱為PID(process ID),每個程序的PID都是獨一無二的,不會與其他程序相同。程序剛被定義時,就會被賦予一個PID,也會被賦予一個UID(通常等於執行者的UID),以及一個GID(通常等於執行者之有效群組的GID)。
※ 註:系統中的程序都有一些相關的紀錄檔或設定檔,這些檔案被存放在/proc目錄之中。此目錄之下有些子目錄是以數字來命名,這些數字就是PID,而這些目錄中的資訊,就是該PID之程序的相關資訊。
(3) 很多時候,一個程序在執行時,會需要利用到外部檔案中的資料。這時,系統會去檢查此程序的UID和GID,看是否符合該外部檔案的權限,若符合就允許程序去存取此外部檔案,否則就不允許。
(4) 很多時候,一個程序在執行時會將其工作分類,並產生另一個程序去執行某部分工作,然後將結果回傳,再繼續原本的工作。例如程序A在進行時產生了程序B,我們就把A稱為B的「父程序」、把B稱為A的「子程序」。子程序的PID當然和父程序不同,不過通常,其UID和GID和父程序相同,因此子程序的權限和父程序也是相同的。
※ 一個子程序的「PPID(parent PID)」,就是其父程序的PID。
※ 父程序產生子程序分為兩個步驟,第一個步驟叫「fork」,第二個步驟叫「exec」:
fork:父程序自我複製出一個新程序,這個新程序的PID和原程序PID不同,其PPID和原程序PID相同,而欲執行的內容一模一樣。
exec:這新程序的欲執行內容被重新載入,與原程序欲執行的內容不同。此新程序就正式成為子程序。
(5) 有些程序是自開機後,就一直不斷的執行(可能是每隔一小段時間就會自動執行),這種程序通常是以系統帳號的身分去執行,被稱為「常駐系統程序(daemon)」。
(6) shell(如bash)本身也是一個程序(也有PID)。而在shell下執行的程序也都算是此shell的子程序。
管理登錄檔的一些技巧:
(1) 為避免登錄檔遭到有心人士竄改,登錄檔權限須設定為只有root才能讀寫,也可設為「對內部資料只能添寫而不能改寫、不能刪減」。
(2) 登錄檔資料庫:又稱「登錄檔伺服器」。應用於多個主機(如辦公室環境)的情況下,將某台主機與其他主機連線,將多個主機的登入檔集中到該台主機存放,該台主機就成了「登錄檔伺服器」。用於一次查詢多個主機的登錄檔時,可以一次集中查詢,免於逐台查詢的麻煩。
(3) 登錄檔備份:登錄檔要定期備份(備份在光碟或外接硬碟…等),以利於追蹤、分析主機的歷史行為。
(4) logwatch:logwatch是分析登錄檔的軟體,會自動分析登錄檔並將分析結果告知使用者。有些Linux版本在安裝時就已內建logwatch,有些則無。其功能在此不細述。
登錄檔輪替(logrotate):
隨著使用者在系統上所做的事情越來越多,登錄檔中所記錄的訊息也會越來越多,當然也就增加了登錄檔的容量大小。因登錄檔寫入的機會很頻繁,故因檔案太大導致的「讀寫效率不彰」也會很明顯,而主機若太常讀寫一個大檔案,也可能加快硬碟的耗損。所以,從登錄檔被建立開始、經過一段週期時間後,系統就需要自動進行「登錄檔輪替」以解決上述問題。
登錄檔輪替,就是將原先的登錄檔改名(在檔名後面加個數字),譬如/var/log/XXX這個登錄檔改名為/var/log/XXX.1(也可能改名後再將檔案壓縮,故在數字之後還加了壓縮檔的副檔名),然後建立一個名為/var/log/XXX的新空白登錄檔,以後所有的訊息自然就寫在這個新空白登錄檔,而不去寫入/var/log/XXX.1這個大檔案。當又經過一段週期時間後,就再進行一次登錄檔輪替…。如下圖所示:
總之,重點是:
※ 無論何時,訊息只記錄在當時的/var/log/XXX登錄檔。
※ /var/log/XXX.N這種登錄檔,N這個數字越大,代表是時間越久之前的登錄檔。
(1) 登錄檔輪替的相關設定:
登錄檔輪替的相關設定,即是設定輪替執行的條件,與輪替時是否執行某些指令…等等。可以為每個登錄檔做個別的設定,也可以統一為每個登錄檔做設定。
※ 要注意:若某個登錄檔的個別設定之設項目,與統一設定的設定項目相互衝突,則以個別設定的設定項目為準。
※ 如果有些設定項目,在個別設定中沒有設定,則以統一設定為準。
通常,負責統一設定的檔案是/etc/logrotate.conf,而負責每個登錄檔之個別設定的檔案則位於/etc/logrotate.d/這個目錄底下。其語法是一樣的:
(1-1) 針對個別登錄檔設定,其語法架構為:
登錄檔路徑
{
設定項目
}
(1-2) #符號後面的文字為「註解」。無任何實際效果。
(1-3) 一個設定項目佔一行,常用的設定項目如下:
各設定項目的值 |
各設定項目的意義 |
※ daily:表示每天輪替一次。 ※ weekly:表示每周輪替一次。 ※ monthly:表示每月輪替一次。 |
進行輪替的週期時間
|
minsize N單位 |
N是數字。表示登錄檔的容量若到了一定大小(也就是N單位的大小),就要進行輪替,並不以時間週期來做輪替。 單位可為K(表示Kb)、M(表示Mb)、G(表示Gb)。 |
compress |
表示在輪替時,要將登錄檔進行壓縮之後再改名。 |
rotate N |
表示僅保留N個改名後的登錄檔。意即/var/log/XXX.N在進行輪替後,會被刪除。 |
sharedscripts prerotate 指令 endscript |
表示在執行輪替時,要先執行指令,再進行輪替。 |
sharedscripts postrotate 指令 endscript |
表示在輪替完畢之後,就要執行指令。 |
(2) 實際執行登錄檔輪替:
使用指令: logrotate 選項 登錄檔設定檔
其中,選項有:
※ 無選項:在輪替條件達成的情況下才會執行輪替。
※ -v:顯示輪替在執行時的過程。
※ -f:不管輪替的條件有無達成,強制執行輪替。
範例如(本範例在ubuntu系統下):logrotate -vf /etc/logrotate.d/rsyslog
可立即執行系統登錄檔的輪替,並顯示出輪替的過程。