天天看點

程序和任務計劃

                                    程序和任務計劃

-----------------------------------------------------------------------------------------------------------------------------------

程序:正在執行中的程式,在記憶體中占用空間,程式和程序不是一一對應的,一個程式可以對應多個程序

核心的功用:程序管理、檔案系統、網絡功能、記憶體管理、驅動程式、安全功能等

Process: 運作中的程式的一個副本,是被載入記憶體的一個指令集合

  程序ID(Process ID,PID)号碼被用來标記各個程序

  UID、GID、和SELinux語境決定對檔案系統的存取和通路權限,UID:使用者身份,GID:組身份

  通常從執行程序的使用者來繼承

  存在生命周期

task struct:Linux核心存儲程序資訊的資料結構格式

task list:多個任務的的task struct組成的連結清單

程序建立:

  init:第一個程序

    父子關系

  程序:都由其父程序建立,CoW 

    fork(), clone()

CoW:copy or write,寫實複制,資料未發生變化時,父程序pid1和子程序pid2會指向相同的記憶體空間,也就意味着父程序和子程序共享相同的記憶體空間,它們看到的資料是一樣的。當修改子程序記憶體空間時,會複制一塊原來指向的記憶體空間到新的記憶體空間,子程序pid2指向新的記憶體空間,再進行資料修改,這麼做優點是當不進行程序修改時父程序和子程序共享記憶體空間,節省了資源,機制類似于LVM的快照。

程序樹指令:pstree

程式和任務計劃

{}裡為線程

程序和線程差別:程序是完成1個任務所需資源的集合,程序可以看作是1個任務或者1個項目,項目需要人員和資源,其中的人員就是線程,是以1個程序對應多個線程,線程至少為1,同一個線程之間使用的資源是共享的

類比:人員(線程),資源(記憶體空間,檔案等)

程序和程序之間内部資源互不影響

程序process

線程thread

cpu将程式任務切成了很短的時間片,給人錯覺是同時執行,其實程式是輪流執行,不是同時執行

cpu的上下文切換會帶來大量資源消耗,程序越多,資源消耗越多,是以父程序生成不多的子程序,由子程序生成線程,讓線程提供給用戶端,進而減少上下文切換,不過線程缺點是有一個線程崩潰,其它線程也會收到影響

程序的基本狀态和轉換

程式和任務計劃

DMA:直接記憶體通路,不需要經過cpu,隻需要cpu發一個指令給DMA裝置,讓磁盤檔案讀入DMA,DMA發給總線,總線再發給記憶體,這樣cpu不用全程負責,節省資源

程序的基本狀态

<1>建立狀态:程序在建立時需要申請一個空白PCB(process control block程序控制塊),向其中填寫控制和管理程序的資訊,完成資源配置設定。如果建立工作無法完成,比如資源無法滿足,就無法被排程運作,把此時程序所處狀态稱為建立狀态

<2>就緒狀态:程序已準備好,已配置設定到所需資源,隻要配置設定到CPU就能夠立即運作

<3>執行狀态:程序處于就緒狀态被排程後,程序進入執行狀态

<4>阻塞狀态:正在執行的程序由于某些事件(I/O請求,申請緩存區失敗)而暫時

無法運作,程序受到阻塞。在滿足請求時進入就緒狀态等待系統調用

<5>終止狀态:程序結束,或出現錯誤,或被系統終止,進入終止狀态。無法再執行

狀态之間轉換六種情況

<1>運作——>就緒:1,主要是程序占用CPU的時間過長,而系統配置設定給該程序占

用CPU的時間是有限的;2,在采用搶先式優先級排程算法的系統中,當有更高

優先級的程序要運作時,該程序就被迫讓出CPU,該程序便由執行狀态轉變為

就緒狀态。

<2>就緒——>運作:運作的程序的時間片用完,排程就轉到就緒隊列中選擇合适

的程序配置設定CPU

<3>運作——>阻塞:正在執行的程序因發生某等待事件而無法執行,則程序由執

行狀态變為阻塞狀态,如發生了I/O請求

<4>阻塞——>就緒:程序所等待的事件已經發生,就進入就緒隊列

以下兩種狀态是不可能發生的:

<1>阻塞——>運作:即使給阻塞程序配置設定CPU,也無法執行,作業系統在進行調

度時不會從阻塞隊列進行挑選,而是從就緒隊列中選取

<2>就緒——>阻塞:就緒态根本就沒有執行,談不上進入阻塞态

程序優先級

程序優先級:

    系統優先級:數字越小,優先級越高

        0-139(CentOS4,5)

          各有140個運作隊列和過期隊列

        0-98,99(CentOS6)

    實時優先級: 99-0 值最大優先級最高

    nice值:-20到19,對應系統優先級100-139或99,nice值越低,優先級越高

Big O:時間複雜度,用時和規模的關系

    O(1), O(logn), O(n)線性, O(n^2)抛物線, O(2^n),此順序排下來性能越來越差

程式和任務計劃

cpu會給運作隊列的程序配置設定時間片,當時間片内程序沒有運作完,該隊列内的程序會去等待隊列,當所有程序都沒有完成,等待隊列會變成運作隊列,運作隊列變成等待隊列,繼續運作

程序相關概念

 程序記憶體:

   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

程序狀态

<1>Linux核心:搶占式多任務

<2>程序類型:

     守護程序: daemon,在系統引導過程中啟動的程序,和終端無關程序,在背景執行,不占用終端資源

     前台程序:跟終端相關,通過終端啟動的程序,占用終端資源

     注意:兩者可互相轉化

<3>程序狀态:

     運作态:running

     就緒态:ready

     睡眠态:

       可中斷:interruptable

       不可中斷:uninterruptable

     停止态:stopped,暫停于記憶體,但不會被排程,除非手動啟動

     僵死态:zombie,結束程序,父程序結束前,子程序不關閉

搶占式多任務觸發條件

<1>時間片到了會釋放cpu

<2>來高優先級程序,目前程序沒有執行完也會釋放cpu

系統管理工具

<1>程序的分類:

   CPU-Bound:CPU密集型,非互動

   IO-Bound:IO密集型,互動

<2>Linux系統狀态的檢視及管理工具:pstree, ps, pidof, pgrep, top, htop,

glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup

<3>pstree指令:

    pstree - display a tree of processes

<4>ps: process state,顯示目前程序的一個快照

    ps - report a snapshot of the current processes

    Linux系統各程序的相關資訊均儲存在/proc/PID目錄下的各檔案中

檢視程序程序ps

ps [OPTION]...

支援三種選項:

   UNIX選項 如-A -e

   BSD選項 如a

   GNU選項 如--help

 選項:BSD風格

   預設顯示目前終端中的程序

   a 選項包括所有終端中的程序

   x 選項包括不連結終端的程序,顯示?的地方是和終端無關,顯示的是守護程序

   u 選項顯示程序所有者的資訊

   f 選項顯示程序樹,相當于 --forest

   k|--sort 屬性 對屬性排序,屬性前加- 表示倒序,

   o 屬性… 選項顯示定制的資訊 pid、cmd、%cpu、%mem,ps axo pid,cmd,%cpu

   L 顯示支援的屬性清單

ps axo euser,ruser,euser表示起作用的使用者,ruser表示啟動的使用者,對于suid特殊權限檢視友善

  Unix風格

   -C cmdlist 指定指令,多個指令用,分隔,ps -C cmd1 -C cmd2…

   -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輸出屬性

<1>VSZ: Virtual memory SiZe,虛拟記憶體集,線性記憶體

<2>RSS: ReSident Size, 常駐記憶體集

<3>STAT:程序狀态

  R:running 運作

  S: interruptable sleeping 可中斷的睡眠

  D: uninterruptable sleeping 不可中斷的睡眠

  T: stopped

  Z: zombie

  +: 前台程序

  l: 多線程程序

  L:記憶體分頁并帶鎖

  N:低優先級程序

  <: 高優先級程序

  s: session leader,會話(子程序)發起者

ps aux 結果清單中VSZ表示虛拟記憶體,作業系統承諾給程序的記憶體,RSS表示實體空間實際給配置設定的空間

ps

ni: nice值

pri: priority 優先級

psr: processor CPU編号

rtprio: 實時優先級

示例:

  ps axo pid,cmd,psr,ni,pri,rtprio

常用組合:

  aux

  -ef

  -eFH

  -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm

  axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

taskset 程序綁定到cpu上,taskset -cp 0 29623,程序29623綁定到0号cpu上

把固定程序綁到cpu上,可以提升cpu性能

ps -fU test,test使用者開啟的程序

ps示例

 查詢你擁有的所有程序:

ps -x

 顯示指定使用者名(RUID)或使用者ID的程序:

ps -fU apache

ps -fu 48

 顯示指定使用者名(EUID)或使用者ID的程序:

ps -fu wang

ps -fu 1000

 檢視以root使用者權限(實際和有效ID)運作的每個程序:

ps -U root -u root

 列出某個組擁有的所有程序(實際組ID:RGID或名稱):

ps -fG nginx

 列出有效組名稱(或會話)所擁有的所有程序:

ps -fg mysql

ps -fG 27

 通過程序ID來顯示所屬的程序:

ps -fp 1234

 以父程序ID來顯示其下所有的程序,如顯示父程序為1154的所有程序:

ps -f --ppid 1234

 顯示指定PID的多個程序:

ps -fp 1204,1239,1263

 要按tty顯示所屬程序:

ps -ft pst/0

 以程序樹顯示系統中的程序如何互相連結:

ps -e --forest

 以程序樹顯示指定的程序

ps -f --forest -C sshd

ps -ef --forest | grep -v grep | grep sshd

 要顯示一個程序的所有線程,将顯示LWP(輕量級程序)以及NLWP(輕量級進

程數)列:

ps -fL -C nginx

 要列出所有格式說明符:

ps L

 檢視程序的PID,PPID,使用者名和指令:

ps -eo pid,ppid,user,cmd

 自定義格式顯示檔案系統組,ni值開始時間和程序的時間:

ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime

 使用其PID查找程序名稱:

ps -p 1244 -o comm=

 要以其名稱選擇特定程序,顯示其所有子程序

ps -C sshd,bash

 查找指定程序名所有的所屬PID,在編寫需要從std輸出或檔案讀取PID的腳本時

這個參數很有用:

ps -C httpd,sshd -o pid=

檢查一個程序的執行時間

ps -eo comm,etime,user | grep nginx

 查找占用最多記憶體和CPU的程序:

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head

 顯示安全資訊:

ps -eM

ps --context

 使用以下指令以使用者定義的格式顯示安全資訊。

ps -eo euser,ruser,suser,fuser,f,comm,label

 使用watch實用程式執行重複的輸出以實作對就程進行實時的監視,如下面的命

令顯示每秒鐘的監視:

watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'

<1>程序優先級調整:

   靜态優先級:100-139

   程序預設啟動時的nice值為0,優先級為120

   隻有根使用者才能降低nice值(提高優先性)

<2>nice指令:

   nice [OPTION] [COMMAND [ARG]...],nice -n 10 sleep 10将sleep10指令nice優先級設為10

<3>renice指令:

   renice [-n] priority pid...,renice -n -10 52999,程序号為52999的指令nice優先級改為-10

<4>檢視:

   ps axo pid,comm,ni

搜尋程序

<1>最靈活:ps 選項 | 其它指令

<2>按預定義的模式:pgrep

   pgrep [options] pattern

   -u uid: effective user,生效者

   -U uid: real user,真正發起運作指令者

   -t terminal: 與指定終端相關的程序

   -l: 顯示程序名,隻顯示指令,不顯示參數,後面支援通配符或者正規表達式

   -a: 顯示完整格式的程序名,顯示完整指令和參數

   -P pid: 顯示指定程序的子程序

<3>按确切的程式名稱:/sbin/pidof

   pidof bash,可以用來判斷某個程序是否存在,某個服務是否進行

面試 搜尋app的程序并關閉:pgrep “app” ,之後kill,或者pkill

系統工具

<1>uptime

顯示目前時間,系統已啟動的時間、目前上線人數,系統平均負載(1、5、10分

鐘的平均負載,一般不會超過1)

<2>系統平均負載:

指在特定時間間隔内運作隊列中的平均程序數

<3>通常每個CPU核心的目前活動程序數不大于3,那麼系統的性能良好。如果每

個CPU核心的任務數大于5,那麼此主機的性能有嚴重問題

<4>如果linux主機是1個雙核CPU,當Load Average 為6的時候說明機器已經被

充分使用

程序管理工具

top:有許多内置指令,輸入top指令進入清單後排序按鍵:

  排序:

    P:以占據的CPU百分比,%CPU

    M:占據記憶體百分比,%MEM

    T:累積占據CPU時長,TIME+

  首部資訊顯示:

    uptime資訊:l指令

    tasks及cpu資訊:t指令

    cpu分别顯示:1 (數字)

    memory資訊:m指令

  退出指令:q

  修改重新整理時間間隔:s

  終止指定程序:k

    儲存檔案:W

欄位資訊簡介

  us:使用者空間

  sy:核心空間

  ni:調整nice時間

  id:空閑

  wa:等待IO時間

  hi:硬中斷

  si:軟中斷(模式切換)

  st:虛拟機偷走的時間

<1>選項:

   -d #: 指定重新整理時間間隔,預設為3秒

   -b: 全部顯示所有程序

   -n #: 重新整理多少次後退出

<2>htop指令:EPEL源

  選項:

   -d #: 指定延遲時間;

   -u UserName: 僅顯示指定使用者的程序

   -s COLUME: 以指定字段進行排序

子指令:

   s: 跟蹤標明程序的系統調用

   l: 顯示標明程序打開的檔案清單

   a:将標明的程序綁定至某指定CPU核心

   t: 顯示程序樹

top -p -H 程序号,根據該程序檢視它的線程

記憶體空間

記憶體空間使用狀态:

   free [OPTION]

     -b 以位元組為機關

     -m 以MB為機關

     -g 以GB為機關

     -h 易讀格式

     -o 不顯示-/+buffers/cache行

     -t 顯示RAM + swap的總和

     -s n 重新整理間隔為n秒

     -c n 重新整理n次後即退出

free中

buffers是緩沖區,速度不同,解決速度不比對的問題

cached是緩存

-/+ buffers/cache:已經用的記憶體,used減去buffers和cached的數字就是-buffers/cache得到的,空餘的free加上buffers和cached的就是+ buffers/cache

記憶體工具

<1>vmstat指令:虛拟記憶體資訊

   vmstat [options] [delay [count]]

   vmstat 2 5

<2>procs:

   r:可運作(正運作或等待運作)程序的個數,和核心數有關

   b:處于不可中斷睡眠态的程序個數(被阻塞的隊列的長度)

<3>memory:

   swpd: 交換記憶體的使用總量

   free:空閑實體記憶體總量

   buffer:用于buffer的記憶體總量

   cache:用于cache的記憶體總量

<4>swap:

   si:從磁盤交換進記憶體的資料速率(kb/s)

   so:從記憶體交換至磁盤的資料速率(kb/s)

<5>io:

   bi:從塊裝置讀入資料到系統的速率(kb/s)

   bo: 儲存資料至塊裝置的速率

<6>system:

   in: interrupts 中斷速率,包括時鐘

   cs: context switch 程序切換速率

<7>cpu:

   us:Time spent running non-kernel code

   sy: Time spent running kernel code

   id: Time spent idle. Linux 2.5.41前,包括IO-wait time.

   wa: Time spent waiting for IO. 2.5.41前,包括in idle.

   st: Time stolen from a virtual machine. 2.6.11前, unknown.

<8>選項:

   -s: 顯示記憶體的統計資料

vmstat 1 一秒執行一次

vmstat 1 10 一秒執行一次,執行十次退出

系統監控工具

<1>glances指令:EPEL源

<2>glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-

t refresh] [-f file] [-o output]

可以坐在自己主機前檢視其它裝置

C/S模式下運作glances指令

伺服器模式:

  glances -s -B IPADDR

  IPADDR: 指明監聽的本機哪個位址

用戶端模式:

  glances -c IPADDR

  IPADDR:要連入的伺服器端位址

<1>dstat指令:系統資源統計,代替vmstat,iostat,需要安裝

<2>dstat [-afv] [options..] [delay [count]]

   -c: 顯示cpu相關資訊

       -C #,#,...,total

   -d: 顯示disk相關資訊

       -D total,sda,sdb,...

   -g:顯示page相關統計資料

   -m: 顯示memory相關統計資料

   -n: 顯示network相關統計資料

   -p: 顯示process相關統計資料

   -r: 顯示io請求相關的統計資料

   -s: 顯示swapped相關的統計資料

<1>iotop指令是一個用來監視磁盤I/O使用狀況的top類工具iotop具有與top相似的UI,其中包括PID、使用者、I/O、程序等相關資訊,可檢視每個程序是如何使用IO,需要安裝

<2>iotop輸出

  第一行:Read和Write速率總計

  第二行:實際的Read和Write速率

  第三行:參數如下:

    線程ID(按p切換為程序ID)

    優先級

    使用者

    磁盤讀速率

    磁盤寫速率

    swap交換百分比

    IO等待所占的百分比

    線程/程序指令

  -o, --only隻顯示正在産生I/O的程序或線程,除了傳參,可以在運作過程中按o生效

  -b, --batch非互動模式,一般用來記錄日志

  -n NUM, --iter=NUM設定監測的次數,預設無限。在非互動模式下很有用

  -d SEC, --delay=SEC設定每次監測的間隔,預設1秒,接受非×××資料例如1.1

  -p PID, --pid=PID指定監測的程序/線程

  -u USER, --user=USER指定監測某個使用者産生的I/O

  -P, --processes僅顯示程序,預設iotop顯示所有線程

  -a, --accumulated顯示累積的I/O,而不是帶寬

  -k, --kilobytes使用kB機關,而不是對人友好的機關。在非互動模式下,腳本程式設計有用

  -t, --time 加上時間戳,非互動非模式

  -q, --quiet 禁止頭幾行,非互動模式,有三種指定方式

    -q 隻在第一次監測時顯示列名

    -qq 永遠不顯示列名

    -qqq 永遠不顯示I/O彙總

互動按鍵

  left和right方向鍵:改變排序

    r:反向排序

    o:切換至選項--only

    p:切換至--processes選項

    a:切換至--accumulated選項

    q:退出

    i:改變線程的優先級

哪個磁盤造成IO嚴重?iotop可查詢

<1>Lsof:list open files檢視目前系統檔案的工具。在linux環境下,一切皆檔案,使用者通過檔案不僅可以通路正常資料,還可以通路網絡連接配接和硬體如傳輸控制協定 (TCP) 和使用者資料報協定 (UDP)套接字等,系統在背景都為該應用程式配置設定了一個檔案描述符

<2>指令參數

   -a:列出打開檔案存在的程序

   -c<程序名>:列出指定程序所打開的檔案

   -g:列出GID号程序詳情

   -d<檔案号>:列出占用該檔案号的程序

   +d<目錄>:列出目錄下被打開的檔案

   +D<目錄>:遞歸列出目錄下被打開的檔案

   -n<目錄>:列出使用NFS的檔案

   -i<條件>:列出符合條件的程序(4、6、協定、:端口、 @ip )

   -p<程序号>:列出指定程序号所打開的檔案

   -u:列出UID号程序詳情

   -h:顯示幫助資訊

   -v:顯示版本資訊。

   -n: 不反向解析網絡名字

<3>程序管理

<4>檢視由登陸使用者啟動而非系統啟動的程序

   lsof /dev/pts1

<5>指定程序号,可以檢視該程序打開的檔案

   lsof -p 9527

<6>檔案管理

<7>檢視指定程式打開的檔案

   lsof -c httpd

<8>檢視指定使用者打開的檔案

   lsof -u root | more

<9>檢視指定目錄下被打開的檔案

   lsof +D /var/log/

   lsof +d /var/log/

   參數+D為遞歸列出目錄下被打開的檔案,參數+d為列出目錄下被打開的檔案

<10>網絡管理

<11>檢視所有網絡連接配接

   lsof -i –n,lsof [email protected] 

   通過參數-i檢視網絡連接配接的情況,包括連接配接的ip、端口等以及一些服務的連接配接情況,例如:sshd等。也可以通過指定ip檢視該ip的網絡連接配接情況

<12>檢視端口連接配接情況(面試題)

   lsof -i :80 -n

   通過參數-i:端口可以檢視端口的占用情況,-i參數還有檢視協定,ip的連接配接情況等

<13>檢視指定程序打開的網絡連接配接

   lsof -i –n -a -p 9527

   參數-i、-a、-p等,-i檢視網絡連接配接情況,-a檢視存在的程序,-p指定程序

<14>檢視指定狀态的網絡連接配接

   lsof -n -P -i TCP -s TCP:ESTABLISHED

   -n:no host names, -P:no port names,-i TCP指定協定,-s指定協定狀态通過多個參數可以清晰的檢視網絡連接配接情況、協定連接配接情況等

<15>恢複删除檔案

   lsof |grep /var/log/messages 

   rm -f /var/log/messages      前提是使用這個檔案的程式沒有關閉

   lsof |grep /var/log/messages  檢視誰在用這個檔案哪個程式在用

   cat /proc/653/fd/6           進到653程序下的fd檔案夾

   ls fd/ -l                     看到删除的檔案還在

   cat /proc/653/fd/6 > /var/log/messages 恢複

kill指令:

  向程序發送控制信号,以實作對程序管理,每個信号對應一個數字,信号名稱以SIG開頭(可省略),不區分大小寫

  顯示目前系統可用信号: kill –l,trap -l

  常用信号:man 7 signal

  1) SIGHUP: 無須關閉程序而讓其重讀配置檔案,kill -SIGHUP 程序号

  2) SIGINT: 中止正在運作的程序;相當于Ctrl+c,kill -2 `pidof bc`

  3) SIGQUIT:相當于ctrl+\

  9) SIGKILL: 強制殺死正在運作的程序

  15) SIGTERM:終止正在運作的程序,kill指令預設選項

  18) SIGCONT:繼續運作

  19) SIGSTOP:背景休眠

  指定信号的方法:

  (1)信号的數字辨別:1, 2, 9

  (2)信号完整名稱:SIGHUP (3) 信号的簡寫名稱:HUP

按PID:kill [-SIGNAL] pid …

   kill –n SIGNAL pid;kill –s SIGNAL pid

按名稱:killall [-SIGNAL] comm…,killall bash,結束全部bash的程序,killall -9 強制結束

按模式:pkill [options] pattern,可接正規表達式

   -SIGNAL

   -l: 顯示程序名(pgrep可用)

   -a: 顯示完整格式的程序名(pgrep可用)

作業管理

<1>Linux的作業控制

   前台作業:通過終端啟動,且啟動後一直占據終端,ctrl+z放到背景休眠

   背景作業:可通過終端啟動,但啟動後即轉入背景運作(釋放終端)

<2>讓作業運作于背景

  (1) 運作中的作業: Ctrl+z

  (2) 尚未啟動的作業: COMMAND &

<3>背景作業雖然被送往背景運作,但其依然與終端相關;退出終端,将關閉背景作業。如果希望送往背景後,剝離與終端的關系

   nohup COMMAND &>/dev/null &

   screen;COMMAND

<4>檢視目前終端所有作業:jobs

<5>作業控制:

   fg [[%]JOB_NUM]:把指定的背景作業調回前台

   bg [[%]JOB_NUM]:讓送往背景的作業在背景繼續運作

   kill [%JOB_NUM]: 終止指定的作業”

前屏指令後跟空格和&可直接切換為背景作業,例如ping 192.168.1.1 &

背景停止轉背景運作:jobs指令後bg jobnumber,或者kill -18

背景運作轉背景停止:fg jobnumber後ctrl+c或者kill -19

并行運作

同時運作多個程序,提高效率

<1>方法1

  vi all.sh

  ./f1.sh&

  ./f2.sh&

  ./f3.sh&

<2>方法2

  (./f1.sh&);(./f2.sh&);(./f3.sh&)

<3>方法3

  { ./f1.sh& ./f2.sh& ./f3.sh& } 前後有空格

任務計劃

周期性執行任務

  未來的某時間點執行一次任務

     at    使用者指定時間去執行任務

     batch 系統自行選擇空閑時間去執行任務

   周期性運作某認為

     cron

開機自啟動,以atd為例

CentOS6 chkconfig atd on

CentOS7 systemctl enabled atd

檢視是否看機啟動

CentOS6 chkconfig --listatd

CentOS7 systemctl is-enabled atd

目前是否是啟動狀态

CentOS6 service atd status

CentOS7 system status atd

啟動目前服務

CentOS6 service atd start

CentOS7 systemctl start atd

關閉目前服務,以防火牆為例

CentOS6 chkconfig iptables off

CentOS7 systemctl disable firewalld

/etc/sysconfig/selinux

selinux=disabled

保證時間同步的前提才能配置計劃任務

同步時間:

CentOS6實作NTP同步時間

ntpdate 172.20.0.1

自動同步時間配置檔案目錄vim /etc/ntp.conf

#Use public 下

server 172.20.0.1 iburst

server ntp.aliyun.com iburst

chkconfig –list ntpd

chkconfig ntpd on

service ntpd status

service ntpd start

程式和任務計劃

如果需要做一個内部伺服器,每台裝置需要以它為标準同步時間,還需要在紅方塊處注釋掉

程式和任務計劃

CentOS7實作同步時間

chrony

systemctl enable chronyd

vim /etc/chrony.conf

allow ip位址

local stratum 10取消注釋

systemctl restart chronyd

程式和任務計劃

配置任務:

at隻适合做一次性的任務,任務存放目錄/var/sool/at

at 10:15 回車

at> wall “hello”

at> ctrl + d 退出

程式和任務計劃

at -l 列出等待運作計劃任務

at -c 1 檢視計劃任務内容

atq =at -l

at now+1minutes 一分鐘後執行

at裡标準輸出不會在螢幕顯示 ,而是以郵件形式發送,是以執行過程中不要産生标準輸出,比如說echo不會在螢幕顯示,比如說

程式和任務計劃

标準輸出丢入無底洞,将不會産生大量文本的郵件

腳本編寫2:00備份檔案的腳本

程式和任務計劃

指令寫入atjob.txt,at -f atjob.txt 4:00,4::00時候将會執行該任務

at -d =atrm,删除任務計劃

at -m 當任務完成會給使用者發送郵件,即使沒有标準輸入也會發送郵件

<1>HH:MM 02:00

   在今日的 HH:MM 進行,若該時刻已過,則明天此時執行任務

<2>HH:MM YYYY-MM-DD 02:00 2016-09-20

   規定在某年某月的某一天的特殊時刻進行該項任務

<3>HH:MM[am|pm] [Month] [Date]

   04pm March 17

   17:20 tomorrow

<4>HH:MM[am|pm] + number [minutes|hours|days|weeks]

   在某個時間點再加幾個時間後才進行該項任務

   now + 5 min

   02pm + 3 days

/etc/at.{allow,deny}控制使用者是否能執行at任務

白名單:/etc/at.allow 預設不存在,隻有該檔案中的使用者才能執行at指令

黑名單:/etc/at.deny 預設存在,拒絕該檔案中使用者執行at指令,而沒有在at.deny 檔案中的使用者則可執行

如果兩個檔案都不存在,隻有 root 可以執行 at 指令

既不在白名單,又不在黑名單,無法執行at任務

既在白名單,又在黑名單,可以執行at任務

沒有白名單,隻拒絕黑名單的使用者

cron

周期性任務計劃

依賴cronie主程式包

cronie-anacron:cronie的補充程式

crontabs 提供系統維護任務

cron設定開機啟動

計劃中%有特殊含義,是以寫個腳本在計劃裡調用,圖中back.sh裡用到了備份腳本指令,位置對齊,*表示不定義,有每的意思

程式和任務計劃

下圖表示1号10号或者周日執行

程式和任務計劃

下圖表示每兩小時,每十分鐘,星期一到星期五

程式和任務計劃

<4>系統cron任務:/etc/crontab

<5>注釋行以 # 開頭

<6>詳情參見 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分以test使用者身份運作echo指令

     10 21 * * * test /bin/echo "Howdy!"

時間格式

<1>@reboot Run once after reboot

<2>@yearly 0 0 1 1 *

<3>@annually 0 0 1 1 *

<4>@monthly 0 0 1 * *

<5>@weekly 0 0 * * 0

<6>@daily 0 0 * * *

<7>@hourly 0 * * * *

<8>示例:每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/ 腳本

以上這些隻有root能用,對于普通使用者,實用指令crontab

crontab -e 建立檔案,格式與/etc/crontab一樣

crontab [-u user] [-l | -r | -e] [-i]

   -l: 列出所有任務

   -e: 編輯任務

   -r: 移除所有任務

   -i:同-r一同使用,以互動式模式移除指定任務

   -u user: 僅root可運作,指定使用者管理cron任務-u 指定以誰的使用者名

任務存放位置/var/spool/cron/USERNAME

白名單黑名單/etc/cron.{allow,deny},規則和at的白名單黑名單規則一樣

繼續閱讀