進程

一:進程和線程

1:內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、 安全功能等
2:Process: 運行中的程序的一個副本,是被載入內存的一個指令集合,而且可以載入內存多個。(下圖解釋進程的執行過程)

無標題.png

從上圖可以看出程序的執行必須要從硬盤調到內存中,成爲進程,才能執行。而且硬盤中相同的程序可以在在內存中運行多分。在內存中,每個進程會得到一個號碼,,也就是進程ID(PID),用來標記各個進程。

3:UIDGID、和SELinux語境決定對文件系統的存取和訪問權限,通常從執行進程的用戶來繼承存在生命週期
4:task structLinux內核存儲進程信息的數據結構格式
5:task list:多個任務的的task struct組成的鏈表
6:進程創建
init:第一個進程其他進程都是他的子進程。
進程:都由其父進程創建,
CoW,fork(), clone()

7:線程:線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。

8:線程與進程的區別可以歸納爲以下4點:

1)地址空間和其它資源(如打開文件):進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見。

2)通信:進程間通信IPC,線程間可以直接讀寫進程數據段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。

3)調度和切換:線程上下文切換比進程上下文切換要快得多。

4)在多線程OS中,進程不是一個可執行的實體。


二:進程優先級

1:進程優先級:每個進程都有相應的優先級,優先級決定它何時運行和接收多少 CPU 時間系統優先級: 數字越小,優先級越高。
2:nice值:我
們都知它是反應一個進程“優先級”狀態的值,其取值範圍是-20至19,一共40個級別。這個值越小,表示進程”優先級”越高,而值越大“優先級”越低

3:priority值:就是ps命令中看到的PRI值或者top命令中看到的PR值。

4:實時進程/非實時進程

內核在設計的時候,將實時進程單獨映射了100個優先級,這些優先級都要高與正常進程的優先級(nice值),它們的主要區別就是通過優先級來區分的。所有優先級值在0-99範圍內的,都是實時進程,所以這個優先級範圍也可以叫做實時進程優先級,而100-139範圍內的是非實時進程。

5:設置nice值

     renice -n # (-20~19) pid
     nice -n #(-20~19) -# command

圖片.png

6:查看nice值
        ps axo ni[ce]

圖片.png


三:進程管理常用命令

1:ps(ps有兩種方式)
(1)BSD方式
       a 所有用戶在所有終端上運行的前臺進程
       x 當前用戶運行的所有進程(包括前臺進程和後臺daemon)
       ax 所有用戶運行的所有進程
       aux 所有用戶運行的所有進程,結果中顯示用戶名
       f 顯示父子進程關係

圖片.png       -C 用進程名進行過濾

圖片.png
       axo配合
           o 自定義輸出列
               %cpu
               %mem
               pid
               uid
               gid
               cmd
               comm
               tty  顯示終端名,如爲?,表示daemon後臺進程
               ruser 命令的發起人
               euser 命令的真正執行人
               state
       k 排序或--sort

圖片.png
UNIX方式
    -e 顯示所有進程
    -f 顯示完整格式
    -ef 以完整格式顯示所有進程
    -eF 以更完整格式顯示所有進程
    -efH 顯示父子進程關係

圖片.png

        -eo 自定義顯示結果,如下
             ps -eo %cpu,%mem,pid,nice,pri,stat,comm
圖片.png
  
2:pgrep
    -u  UID/USERNAME 基於執行程序的用戶名進行搜索
    -l  顯示的結果中增加進程名
    -t  終端名
    -P  查看子進程

圖片.png

圖片.png

圖片.png

3:pidof 進程名   查詢對應進程名的PID
圖片.png

4:uptime :顯示當前時間,系統已啓動的時間、當前上線人數,系統平均負載
圖片.pngtop
5:vmstat:顯示虛擬內存信息

    r:可運行
    b:處於不可中斷睡眠狀態的進程個數

    swpd:當前虛擬內存的已使用空間
    free:物理內存的剩餘空間,直致不夠用時,纔會使用虛擬內存

    buffer:用於buffer的內存總量
    cache:用於cache的內存總量

    si:表示內存從swap讀入的總量
    so:表示從內存寫出到swap的總量

    bi:表示內存從硬盤讀入的總量
    bo:表示從內存寫出到硬盤的總量

    in:每秒中斷的速率
    cs:進程切換速率

    us:用戶空間時間
    sy:內核空間,系統空間
    id:空閒時間
    wa:等待時間
    st:被虛擬機偷走的時間
圖片.png    vmstat -s 詳細查看內存信息
圖片.png
   6: iostat:統計CPU和設備IO信息
圖片.png
 7:pmap:進程對應的內存映射

        pmap pid
        pmap -x pid
圖片.png
     ls -l /proc/40052/fd |wc -l
         通過查看進程文件描述符的數量是否增長來判斷是否有內存泄露的問題

8:kill
    -0 無作爲,可以用來單純判斷進程是否運行.
    -1 -HUP:強制進程重讀配置文件
    -2 -INT: 中止正在運行的進程;相當於Ctrl+c
    -3 -QUIT: 相當於ctrl+\
    -9 -KILL: 強制殺死正在運行的進程
    -15 -TERM: 終止正在運行的進程 (默認)\

killall 

    進程名

圖片.png

圖片.png

pkill
    -u 用戶名  殺死指定用戶所運行的所有進程
    pkill -t pts/1  殺死指定終端上運行的所有進程
圖片.png

圖片.png


四:進程的前後臺
1:常用命令:
    ctrl+z 將運行在前臺的進程暫停  或 kill -19 PID
    bg 將在當前終端上暫停的進程,放入後臺繼續運行  或kill -18 PID
    fg 將在當前終端上暫停的或在當前終端上後臺運行的進行,放入前臺繼續運行

圖片.png

2:使進程不再依附於終端在後臺運行
    nohup command &> /dev/null
    screen; command
    (command&)
圖片.png

(1):用第一種方法後,我們可以看到,當關閉終端後,該進程依然存在。圖片.png

(2):用第二種方法可以發現,關閉終端後,該進程依然存在,且依賴於screen進程,加入screen後發現進程還在執行。

圖片.png

圖片.png

(3):用第三種辦法,也可以達到效果。

圖片.png

圖片.png

3:並行運行多條命令

(1)將多個腳本寫在一個腳本里面。

    vim all.sh
        sh1&
        sh2&
        shn&
(2)直接在命令行裏輸入如下命令。
    (sh1&);(sh2&)
圖片.png

(3):在命令行輸入如下命令

    {sh1&sh2&sh3}


五:任務計劃

1:at

(1)at hh:mm
        atq 或 at -l 列出指定隊列中等待運行的作業
        at -c 隊列序號  查看指定序號隊列的詳細信息
        atrm 隊列序號 或 at -d 隊列序號 刪除指定序號的隊列

圖片.png

圖片.png

(2)at的其他設置方式

        echo wall 123 |at 20:00


        [root@centos7 ~]# at 20:00 << EOF
        > wall hello
        > wall 123
        > wall nihao
        > EOF


        at 20:00 -f at.txt

圖片.png

注意:之前我們一直在講at的設置,那有沒有想過這些at十一is很麼方式存在的呢?接下來我們來看一下,到/var/spool /at 目錄下我們可以發現以下文件,這就是at文件,他們保存在了硬盤中,也就是說開機後這些未執行的操作依然有效。

at在指定時間時,如果還沒過,就表示當天,如果過了,它會自動理解爲下一天。

圖片.png

(3):at計劃結果的查看

對於一些有輸出結果的計劃,我們要怎樣查看它的輸出呢?我們可以通過郵件來查看,系統會自動將結果以郵件的形式發送給我們。

圖片.png

(4)at的任務是否能運行依賴於atd服務

        centos6: service atd start
        centos7: systemctl start atd
(5)限制用戶不能使用at配置計劃任務
        當僅/etc/at.deny 存在時(默認)寫入deny的用戶不能配置at
        當/etc/at.allow存在時/etc/at.deny失效,只有寫在allow中的用戶才能配置at
        當/etc/at.allow及/etc/at.deny都不存在時,僅有root才能配置at


2:cron
    (1)/etc/crontab 系統級計劃任務
        56 10 * * * root /app/backup 僅能通過 root定義,不過可以以普通用戶的身份去執行計劃任務中的命令。(可以用普通用戶的身份執行,但不能定義計劃任務)

圖片.png

    日誌/var/log/crond
圖片.png

(2)特殊的日期表達方式
    @reboot        Run once after reboot. 當下次啓動計算機時,啓動到crond服務時運行該計劃。
    @yearly        0 0 1 1 *
    @annually        0 0 1 1 *
    @monthly        0 0 1 * *
    @weekly        0 0 * * 0
    @daily        0 0 * * *
    @hourly        0 * * * *

centos7:
    1.grub : linux16   最後加上空格rd.break    按Ctrl + x
    2.mount -o remount,rw /sysroot
    3.vi /sysroot/etc/crontab

圖片.png

圖片.png

圖片.png

centos6:
    1.grub : kernel 最後加空格1 先Esc加到主界面 再b啓動
    2.vim /etc/crontab

圖片.png

圖片.png

圖片.png


/etc/crontab 是系統級計劃任務的主配置文件
    -->  /etc/cron.d 是系統級計劃任務的擴展配置文件,其中的所有都應該是按crond的格式編寫,每一個文件都會生效
        --> /etc/cron.d/0hourly  
            01 * * * * root run-parts /etc/cron.hourly 又用run-parts命令,擴展到了/etc/cron.hourly目錄,其中的所有腳本均會在每小時的01分執行

(3)crontab
    crontab -e [-u username]
    crontab -l
    crontab -r 直接該用戶的crontab文件,故所有計劃全刪除,如只需刪除某條,直接-e刪除該行即可。
    crontab -i -r 功能同上,在刪除前尋問



(4)限制用戶不能使用crontab配置計劃任務
    當僅/etc/cron.deny 存在時(默認)寫入deny的用戶不能配置crontab
    當/etc/cron.allow存在時/etc/cron.deny失效,只有寫在allow中的用戶才能配置crontab
    當/etc/cron.allow及/etc/cron.deny都不存在時,僅有root才能配置crontab

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章