UNIX的程序與工作控制 程序的定義與特性 程序的建立 相關指令 背景執行 調整程序優先權 signal與kill 工作控制 at、batch、cron、crontab 參考課本第十七、十六章
程序的定義與特性(一) 定義:一個正在執行中的程式實體 程序(process)通常與程式同名,有時一個程式也會引 發多個程序 UNIX 是一個多人多工系統,每一個使用者在同一時間可 以執行多個程序。 核心(kernel)是程序的最終管理員,決定程序執行的時 間與優先權。 Process使用系統記憶體,在記憶體不足或process閒置等 情況下,kernel會把process相關的記憶體空間移往swap。 等到下次得到cpu時間再取回主記憶體中。
程序的定義與特性(二) process產生時,kernel會給予每一個程序一個唯 一的識別號碼,稱為Process identifier, PID,程序 識別碼。 kernel還會紀錄程序的其他屬性 真正的使用者id 有效的使用者id 真正的group id 有效的group id 執行優先權 執行時的目錄
程序的定義與特性(三) 每個process都有parent(啟動此process的 process)。 每個程序的祖先,可以追溯到系統開機時建立的第 一個程序(PID 0)。 process只有一個parent,但可以有很多child child process完成(死亡)時,會送一個訊號給 parent通知它。控制權就又回到parent上。 通常parent process會比 child process長壽。
程序的建立 核心執行程序的程式映像包含 本文區段(程式執行碼)、資料區段(程式中的變數)、使 用者區段(程序相關的屬性)。 fork:對呼叫他的程序建立一個複製的程序,並給予一個新的 PID。 exec:parent會以即將被執行的程式映像來覆寫剛剛的程序內 容(本文區段與資料區段被置換)。 wait:parent等待子程序的完成。 子程序會繼承parent的環境變數,但修改不會影響 parent的環境變數。
login shell 使用者的第一個程序:login shell echo $$ 可以印出shell的PID。 init 是系統的第二個程序(PID=1),也是login shell 的parent。 init會在每一個連接埠fork並exec一個 getty (/sbin/mingetty),等待user登入。 shell的內部命令不會產生新程序。
ps 指令(一) ps 指令:用來顯示系統中的process與其屬 性。 PID TTY TIME CMD 1070 pts/0 00:00:00 bash 1200 pts/0 00:00:00 ps PID 就是程序識別碼、TTY是與該程序相關的 終端機(有些程序並無相關的終端機)、TIME 顯示process使用CPU的時間、CMD顯示程序名 稱。
ps 指令(二) 每個系統的 ps 的選項有相當大的差異。 Linux上的常用選項 ps ax 列出所有程序 ps u 列出詳細列表 ps f 顯示process的祖先 ps w 寬輸出 通常用 ps auxw | more 來看系統的process
top 指令 top 指令會顯示出相當有用的資料 第一行顯示系統基本資料:時間、上線人數、負載 第二行顯示Process的狀況 第三行顯示CPU的狀況 第四行顯示主記憶體的狀況 第五行顯示swap的使用狀況 接下來顯示負載最重的一些process 如果沒有top,可以使用vmstat來監測系狀況 vmstat 1 每1秒鐘顯示一次系統狀況
背景執行 可以用 指令 & 這樣的方式使指令送到背景去執 行(不過使用者不能登出,但bash與csh除外)。 nohup 指令 & 可以保證使用者登出,指令還可 以執行。
調整程序優先權 用 nice 指令來調整優先權 nice 的典型值由1~19(Linux是-20~19,一 般程式執行時nice值為0,nice指令預設調整為 10) nice 值越高,優先權越低 可以用 ps -l 或 ps -axl 來看process nice值 一般把把較不重要而需要較長執行時間的程式 設定成優先權較低,以免影響正常作業。 nice 指令 或 nice -n 18 指令 renice 12 pid 可以直接改動 pid 的nice值為12
signal與kill(一) 使用者或系統可以送signal(信號)給process,如果該 process沒有設計來處理這個signal,process就會終止。 process可以忽略、補捉(做預先定義好的工作,例如: bbs中的「水球」)或不做任何事(程序會被終止)。 常用的signal編號: 1 掛斷 、2 中斷 3 產生core dump 9 強制殺掉 15 預設的終止信號 24 暫停
signal與kill(二) killall 可以殺掉所有某個名字的process 可以用kill 指令送信號給程序 kill PID kill -9 PID 可以強制殺掉process(砍掉shell process看看) killall 可以殺掉所有某個名字的process
工作控制 C shell、Kron shell、bash、tcsh等shell具有工 作控制機制 Ctl-z 用來中斷前景工作 fg 將背景工作移到前景來工作 bg 將工作移到背景 jobs 列出目前的工作 kill 殺掉工作
at、batch at :設定某件工作在某一個時間進行 at -q 或 atq 查詢進入排程的工作 atrm 清除工作 batch:在系統負載小於某一個數值(Fedora 內定 是 0.8)就執行某一個工作 也是用 atq 與 atrm 來處理工作。 at 與 batch 的工作都是靠atd來啟動執行 at.allow與at.deny可以控制使用者是否可以執行at 或batch(liunx系統在/etc底下)
cron與ctontab(一) 如果要系統規律的執行某些工作,就要使用 cron crond 用來啟動cron jobs的執行,cron的控制檔 案放在 /var/spool/cron 目錄下 cron 的控制格式如下: 每行控制一個工作,每個工作由六個欄位(由 空白分開)組成 分 時 那一天 月份 星期幾 命令 用 crontab 來載入控制檔 crontab -e 直接編輯 控制檔 crontab -u userid可用來載入userid的 cron 控制檔
cron與ctontab(二) cron.allow cron.deny可以用來控制使用者是否能 用cron功能,linux在/etc 底下 Linux的/etc/crontab可以用來控制系統的 cron。 主要是多了run-parts 來include目錄中的可執行 的控制檔案並且可以指定執行者的身份 time 指令:可以用來計算程序執行的時間 寄信指令:mail -s subject email < file
crontab 範例 # 每天凌晨零點五分做 5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1 # 每月一日晚上2:15分做 15 14 1 * * $HOME/bin/monthly # 沒有放假的日子晚上十點提醒Joe 0 22 * * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?% 23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday" 5 4 * * sun echo "run at 5 after 4 every sunday" #每小時的14,48分執行 ls 14,48 * * * ls