進程管理

1.進程概念
內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等
Process: 運行中的程序的一個副本,是被載入內存的一個指令集合
進程ID(Process ID,PID)號碼被用來標記各個進程
UID、GID、和SELinux語境決定對文件系統的存取和訪問權限,通常從執行進程的用戶來繼承
存在生命周期
task struct:Linux內核存儲進程信息的數據結構格式
task list:多個任務的task struct組成的鏈表
進程創建: init:第一個進程 父子關系
進程:都由其父進程創建,CoW fork(), clone()

2.進程的基本狀態
創建狀態:進程在創建時需要申請一個空白PCB(process control block進程控制塊),向其中填寫控制和管理進程的信息,完成資源分配。如果創建工作無法完 成,比如資源無法滿足,就無法被調度運行,把此時進程所處狀態稱為創建狀態
就緒狀態:進程已準備好,已分配到所需資源,只要分配到CPU就能夠立即運行
執行狀態:進程處于就緒狀態被調度后,進程進入執行狀態
阻塞狀態:正在執行的進程由于某些事件(I/O請求,申請緩存區失?。┒鴷簳r無法運行,進程受到阻塞。在滿足請求時進入就緒狀態等待系統調用
終止狀態:進程結束,或出現錯誤,或被系統終止,進入終止狀態。無法再執行

3.狀態之間轉換六種情況
運行——>就緒:1,主要是進程占用CPU的時間過長,而系統分配給該進程占 用CPU的時間是有限的;2,在采用搶先式優先級調度算法的系統中,當有更高 優先級的進程要運行時,該進程就被迫讓出CPU,該進程便由執行狀態轉變為 就緒狀態。
就緒——>運行:運行的進程的時間片用完,調度就轉到就緒隊列中選擇合適 的進程分配CPU
運行——>阻塞:正在執行的進程因發生某等待事件而無法執行,則進程由執 行狀態變為阻塞狀態,如發生了I/O請求
阻塞——>就緒:進程所等待的事件已經發生,就進入就緒隊列
以下兩種狀態是不可能發生的:
阻塞——>運行:即使給阻塞進程分配CPU,也無法執行,操作系統在進行調 度時不會從阻塞隊列進行挑選,而是從就緒隊列中選取
就緒——>阻塞:就緒態根本就沒有執行,談不上進入阻塞態

4.進程優先級
進程優先級:
系統優先級:數字越小,優先級越高 0-139(CentOS4,5)各有140個運行隊列和過期隊列0-98,99(CentOS6)
實時優先級: 99-0 值最大優先級最高
nice值:-20到19,對應系統優先級100-139或99
Big O:時間復雜度,用時和規模的關系
O(1), O(logn), O(n)線性, O(n^2)拋物線, O(2^n)

5.進程相關概念
進程內存:
Page Frame: 頁框,用存儲頁面數據,存儲Page 4k
LRU:Least Recently Used 近期最少使用算法,釋放內存
物理地址空間和線性地址空間
MMU:Memory Management Unit負責轉換線性和物理地址
TLB:Translation Lookaside Buffer 翻譯后備緩沖器,用于保存虛擬地址和物理地址映射關系的緩存 IPC: Inter Process Communication :進程間通信
同一主機: signal:信號 shm: shared memory :共享內存 semaphore:信號量,一種計數器
不同主機:socket: IP和端口號 RPC: remote procedure call :遠程過程調用協議 MQ:消息隊列,Kafka,ActiveMQ

6. 進程狀態
Linux內核:搶占式多任務
進程類型: 守護進程: daemon,在系統引導過程中啟動的進程,和終端無關進程
前臺進程:跟終端相關,通過終端啟動的進程
注意:兩者可相互轉化
進程狀態:
運行態:running
就緒態:ready
睡眠態: 可中斷:interruptable 不可中斷:uninterruptable
停止態:stopped,暫停于內存,但不會被調度,除非手動啟動
僵死態:zombie,結束進程,父進程結束前,子進程不關閉

7.系統管理工具
進程的分類:
CPU-Bound:CPU密集型,非交互
IO-Bound:IO密集型,交互
pstree命令: pstree – display a tree of processes
Linux系統狀態的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, pnohu
ps: process state
ps – report a snapshot of the current processes
Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中

8.查看進程ps
ps [OPTION]…
支持三種選項:
UNIX選項 如-A -e
BSD選項 如a
GNU選項 如–help
選項:默認顯示當前終端中的進程
? a 選項包括所有終端中的進程
? x 選項包括不鏈接終端的進程
? u 選項顯示進程所有者的信息
? f 選項顯示進程樹,相當于 –forest
? k | sort 屬性 對屬性排序,屬性前加- 表示倒序
? o 屬性… 選項顯示定制的信息 pid、cmd、%cpu、%mem
? L 顯示支持的屬性列表
ps常見選項
-C cmdlist 指定命令,多個命令用,分隔
-L 顯示線程
-e: 顯示所有進程,相當于-A
-f: 顯示完整格式程序信息
-F: 顯示更完整格式的進程信息
-H: 以進程層級格式顯示進程相關信息
-u userlist 指定有效的用戶ID或名稱
-U userlist 指定真正的用戶ID或名稱
-g gid或groupname 指定有效的gid或組名稱
-G gid或groupname 指定真正的gid或組名稱
-p pid 顯示指pid的進程
–ppid pid 顯示屬于pid的子進程
-M 顯示SELinux信息,相當于Z

ps輸出屬性
VSZ: Virtual memory SiZe,虛擬內存集,線性內存
RSS: ReSident Size, 常駐內存集
STAT:進程狀態
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前臺進程
l: 多線程進程
L:內存分頁并帶鎖
N:低優先級進程
查看當前終端所有作業:jobs
作業控制:
fg [[%]JOB_NUM]:把指定的后臺作業調回前臺
bg [[%]JOB_NUM]:讓送往后臺的作業在后臺繼續運行
kill [%JOB_NUM]: 終止指定的作業
并行運行
同時運行多個進程,提高效率
方法1 vim all.sh f1.sh& f2.sh& f3.sh&
方法2 (f1.sh&);(f2.sh&);(f3.sh&)
方法3 { f1.sh& f2.sh& f3.sh& }

21.任務計劃
Linux任務計劃、周期性任務執行
? 未來的某時間點執行一次任務
at
batch:系統自行選擇空閑時間去執行此處指定的任務
? 周期性運行某任務
Cron

at任務
包:at
at命令:at [option] TIME
常用選項:
-V 顯示版本信息:
-l: 列出指定隊列中等待運行的作業;相當于atq
-d: 刪除指定的作業;相當于atrm
-c: 查看具體作業任務
-f /path/from/somefile:從指定的文件中讀取任務
-m:當任務被完成之后,將給用戶發送郵件,即使沒有標準輸出
注意:作業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶
TIME:定義出什么時候進行 at 這項任務的時間
HH:MM [YYYY-mm-dd]
noon, midnight, teatime(4pm)
tomorrow
now+#{minutes,hours,days, OR weeks}

at時間格式
HH:MM 02:00
在今日的 HH:MM 進行,若該時刻已過,則明天此時執行任務
HH:MM YYYY-MM-DD 02:00 2016-09-20
規定在某年某月的某一天的特殊時刻進行該項任務
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某個時間點再加幾個時間后才進行該項任務
now + 5 minutes
02pm + 3 days

執行方式:
1)交互式 2)輸入重定向 3)at –f 文件
依賴與atd服務,需要啟動才能實現at任務
at隊列存放在/var/spool/at目錄中
/etc/at.{allow,deny}控制用戶是否能執行at任務
白名單:/etc/at.allow 默認不存在,只有該文件中的用戶才能執行at命令
黑名單:/etc/at.deny 默認存在,拒絕該文件中用戶執行at命令,而沒有在 at.deny 文件中的使用者則可執行
如果兩個文件都不存在,只有 root 可以執行 at 命令

周期性任務計劃cron
周期性任務計劃:cron
相關的程序包:
cronie: 主程序包,提供crond守護進程及相關輔助工具
cronie-anacron:cronie的補充程序,用于監控cronie任務執行狀況,如 cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨后啟動一次此任務
crontabs:包含CentOS提供系統維護任務

確保crond守護處于運行狀態:
CentOS 7: systemctl status crond
CentOS 6: service crond status
計劃周期性執行的任務提交給crond,到指定時間會自動運行
系統cron任務:系統維護作業 /etc/crontab
用戶cron任務:crontab命令
日志:/var/log/cron

系統cron任務:/etc/crontab
注釋行以 # 開頭
詳情參見 man 5 crontab
# Example of job definition:
# .—————- minute (0 – 59)
# | .————- hour (0 – 23)
# | | .———- day of month (1 – 31)
# | | | .——- month (1 – 12) OR jan,feb,mar,apr …
# | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
例如:晚上9點10分運行echo命令 10 21 * * * centos /bin/echo “Howdy!”

時間表示法:
? (1) 特定值 給定時間點有效取值范圍內的值
? (2) * 給定時間點上有效取值范圍內的所有值 表示“每…”
? (3) 離散取值 #,#,#
? (4) 連續取值 #-#
? (5) 在指定時間范圍上,定義步長
/#: #即為步長

時間格式
@reboot Run once after reboot
@yearly 0 0 1 1 *
@annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily 0 0 * * *
@hourly 0 * * * *
示例:每3小時echo和wall命令
0 */3 * * * centos /bin/echo “howdy”;/usr/bin/wall “welcome to Magedu!”

系統的計劃任務:
/etc/crontab /etc/cron.d/ 配置文件
/etc/cron.hourly/ 腳本
/etc/cron.daily/ 腳本
/etc/cron.weekly/ 腳本
/etc/cron.monthly/ 腳本

anacron系統
運行計算機關機時cron不運行的任務,CentOS6以后版本取消anacron服務,由 crond服務管理
對筆記本電腦、臺式機、工作站、偶爾要關機的服務器及其它不一直開機的系統很重要對很有用 配置文件:/etc/anacrontab,負責執行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly中系統任務。
? 字段1:如果在這些日子里沒有運行這些任務……
? 字段2:在重新引導后等待這么多分鐘后運行它
? 字段3:任務識別器,在日志文件中標識
? 字段4:要執行的任務
由/etc/cron.hourly/0anacron執行
當執行任務時,更新/var/spool/anacron/cron.daily 文件的時間戳

管理臨時文件
CentOS6使用/etc/cron.daily/tmpwatch定時清除臨時文件
CentOS7使用systemd-tmpfiles-setup服務實現
配置文件:
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles/*.conf

/usr/lib/tmpfiles.d/tmp.conf
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
命令:
systemd-tmpfiles –clean|remove|create configfile

用戶計劃任務
crontab命令定義
每個用戶都有專用的cron任務文件: /var/spool/cron/USERNAME
crontab命令:
crontab [-u user] [-l | -r | -e] [-i]
-l: 列出所有任務
-e: 編輯任務
-r: 移除所有任務
-i:同-r一同使用,以交互式模式移除指定任務
-u user: 僅root可運行,指定用戶管理cron任務
如:新建計劃任務
crontab -e 在打開的窗口編輯計劃任務,格式同上,注:無需寫用戶名
控制用戶執行計劃任務:
/etc/cron.{allow,deny}

at和crontab
一次性作業使用 at
重復性作業使用crontab
Create: at time crontab -e
List: at -l crontab -l

Details:?? at -c jobnum ???N/A

Remove: at -d jobnum crontab -r

Edit:?? ?????N/A?? ???????????????crontab -e

沒有被重定向的輸出會被郵寄給用戶

根用戶能夠修改其它用戶的作業

 

注意:運行結果的標準輸出和錯誤以郵件通知給相關用戶

(1) COMMAND > /dev/null

(2) COMMAND &> /dev/null

對于cron任務來講,%有特殊用途;如果在命令中要使用%,則需要轉義,將% 放置于單引號中,則可不用轉義

如: 43 16 5 5 * touch /data/`date +\%F.txt`

 

 

思考:

(1) 如何在秒級別運行任務?

* * * * * for min in 0 1 2; do echo “hi”; sleep 20; done

(2) 如何實現每7分鐘運行一次任務?

sleep命令:

sleep NUMBER[SUFFIX]…

SUFFIX:

s: 秒, 默認?? m: 分?? h: 小時?? d: 天

22.其他

(1)pri值越大,優先級越高

NI值越小,優先級越高

(2)后臺運行—>后臺休眠:killall -19 CMD

后臺休眠—>后臺運行:killall -18 CMD

(3)時間總不正確,設置自動同步時間

For Centos7

①ntpdate 172.20.0.1

②vim /etc/chrony.conf

server 172.20.0.1 iburst

③systemctl enable chrony

④systemctl start chrony

 

For Centos6

①ntpdate 172.20.0.1

②vim /etc/ntp.conf

③server 172.20.0.1 iburst

④chkconfig ntpd on

⑤service ntpd start

(4)在計劃任務的腳本中,建議將輸出重定向到/dev/null,以免增加無用郵件

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98519

(0)
煙花兒煙花兒
上一篇 2018-05-14 13:40
下一篇 2018-05-14 20:09

相關推薦

  • 如何制作LINUX服務腳本

    如何制作一個Linux啟動服務 ? ? ? ? ?Linux在啟動的時候都會跑很多系統自帶的服務腳本,來控制系統服務的開啟和關閉。這些服務是系統自帶的,我們可以查看這些服務及其對應的腳本(ls?/etc/init.d/)。這些服務有獨立服務,也有依賴服務,依賴服務有被依賴服務和依賴別的服務。今天我們就來看看怎么來制作一個系統獨立服務,方便我們以后需要自己手動…

    2018-05-10
  • 學習筆記(12)

    學習筆記(12)

    Linux筆記 2018-04-30
  • 磁盤管理(二)

    RAID

    2018-04-26
  • DNS服務、BIND

    DNS:domain name service,協議(C/S,udp53,tcp53) BIND:bekerley internat name domain 注意:named程序的啟動用戶是named用戶,非root用戶,因此需要注意權限和屬主。 本地名稱解析配置文件:hosts linux:/etc/hosts windows:%WINDOWS%/syst…

    2018-03-26
欧美性久久久久