linux之進程管理詳解


 |-進程管理
   
    進程常用命令
   
    |- w查看當前系統信息
   
    |- ps進程查看命令
   
    |- kill終止進程
   
    |- 一個存放內存中的特殊目錄/proc
   
    |- 進程的優先級
   
    |- 進程的掛起與恢復
   
    |- 通過top命令查看進程
   
    計划任務
   
    |- 計划任務的重要性
   
    |- 一次性計划at和batch
   
    |- 周期性計划crontab
   
    進程管理的概念
   
    進程和程序區別
   
    1.程序是靜態概念,本身作為一種軟件資源長期保存;而進程是程序的執行過程,它是動態概念,有一定的生命期,是動態產生和消亡的。
   
    2.程序和進程無一一對應關系。一個程序可以由多個時程公用;另一一方面,一個進程在活動中有可順序地執行若干個程序
   
    父子進程的關系
   
    1.子進程是由一個進程所產生的進程,產生這個子進程的進程稱為父進程
   
    2.在linux系統中,使用系統調用fork創建進程。fork復制的內容包括父進程的數據和堆棧段以及父進程的進程環境。
   
    3.父進程終止子進程自然終止。
   
    前台進程和后台進程
   
    前台進程
   
    在shell提示處理打入命令后,創建一個子進程,運行命令,Shell等待命令退出,然后返回到對用戶給出提示符。這條命令與Shell異步運行,即在前台運行,用戶在它完成之前不能執行別一個命令


      很簡單,我們在執行這個查找命令時,無法進行其它操作,這個查找就屬於前台進程

 


    
    后台進程
   
    在Shell提示處打入命令,若后隨一個&,Shell創建子進程運行此命令,但不等待命令退出,而直接返回到對用戶給出提示。這條命令與Shell同步運行,即在后台運行。"后台進程必須是非交互式的"

      再來看這個命令就變成了后台進程,我們用同樣的條件進行查找,把查找記過放到hzh/test/init.find這個文件中。不影響我們前台其它的操作。
   
    進程的狀態
      學過操作系統原理的同學應該可以看得懂,不懂再去翻翻書,不知道你有沒有想起當時教這門課的老師呢?呵呵
   
    常用進程命令
   
    w 查看當前系統信息
   
    w命令,我在之前的章節用曾用過,當時是查看當前用戶信息,當然也可以查看到系統相關的信息。
   
    作用:查看當前系統活動摘要。
   
    [root@bogon cron]# w
   
    14:48:39 up 2:46, 1 user,     load average: 0.00,   0.01,   0.00
   
    USER     TTY       FROM             LOGIN@     IDLE   JCPU   PCPU WHAT
   
    root       pts/1    192.168.203.1 12:27      0.00s   0.17s   0.02s w
   
    w顯示信息的含義:
   
    JCPU:     以終端代號來區分,該終端所有相關的進程的進程執行時,所消耗的CPU時間會顯示在這里
   
    PCPU:   cpu執行程序消耗的時間
   
    WHAT:    用戶下在執行的操作
   
    load average :分別顯示系統在過去1、5、15分鍾內的平均負載程度。
   
    FROM:  顯示用戶從何處登錄系統,":0"的顯示代表該用戶時人X Windows下,打開文本模式窗口登錄的
   
    IDLE:   用戶閑置的時間,這是一個計時器,一旦用戶執行任何操作,該計時器便會被重置
   
    查看個別用戶信息:w [用戶名]
   
    [root@localhost ~]# w root
   
    23:32:01 up 52 min, 1 user, load average: 0.00, 0.00, 0.00
   
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
   
    root pts/1 192.168.203.1 22:53 0.00s 0.10s 0.01s w root
   
    ps進程查看命令
   
    ps應該是查看進程用得最普遍的命令,我在之前的面試中都被多次問到過。因為linux不是面試我的重點,所以,我后來特意去查了一下。ps我以前的理解就是photoshop的縮寫。哈哈!因為以前本專門跑去學過平面設計。吼吼,扯遠了!
   
    進程查看命令:ps
   
    常用選項:
   
    -a:顯示所有用戶的進程
   
    -u:顯示用戶名和啟動時間
   
    -x:顯示 沒有控制終端的進程
   
    -e:顯示所有進程,包括沒有控制終端的進程
   
    -l:長格式顯示
   
    -w:寬行顯示,可以使用多個w進行加寬顯示
   

 


    應用實例:
   
    ps 查看隸屬自己的進程
   
    root@fnngj-virtual-machine:~# ps
   
    PID TTY TIME CMD
   
    1370 pts/0 00:00:00 bash
   
    3185 pts/0 00:00:00 ps
   
    root@root:~# ps -l
   
    F S    UID  PID     PPID    C   PRI   NI   ADDR   SZ     WCHAN     TTY      TIME      CMD
   
    4 S    0     5941   5801   4   80    0   -       1882   wait      pts/2    00:00:00     bash
   
    4 R    0     6000   5941   0   80    0   -       1121    -         pts/2    00:00:00     ps
   
    看一下上面的選項都指的什么
   
    PID :      進程號
   
    PPLD:   父進程的進程號
   
    TTY :    進程啟動的終端
   
    STAT :  進程當前狀態(S休眠狀態,D不可中斷的休眠狀態,R運行狀態,Z僵死狀態,T停止)
   
    NI :        進程優先級
   
    TIME:     進程自從啟動以后啟用CPU的總時間
   
    COMMAND/CMD:進程的命令名
   
    USER:    用戶名
   
    %CPU:   占用CPU時間和總時間的百分比
   
    %MEM:  占用內存與系統內存總量的百分比
   
    實列:
   
    ps -u or -l 查看隸屬於自己進程詳細信息
   
    root@root:~# ps -u or -l
   
    ps -le or -aux 查看所有用戶執行的進程的詳細信息
   
    root@root:~# ps le or -aux
   
    ps -aux --sort pid 可按進程執行的時間、PID、UID等對進程進行排序
   
    root@root:~# ps -aux --sort pid
   
    ps -uU fnngj 查看某個用記啟動的進程
   
    root@root:~# ps -uU fnngj
   
    ps -le | grep init 查看指定進程信息
   
    root@root:~# ps -le | grep init
   
    kill終止進程
   
    在winddow下面,我們要結束一個進程,最簡單的方式就是關閉這個程序,相應的進程也會隨之結束,遇到不能關閉的情況。會打開任務管理器結果掉。那么在linux下如果做呢?我們可以使用kill命令來終止進程。
   
    為什么要殺死進程?
   
    * 該進程點用了過多的CPU時間
   
    * 該進程縮住了一個終端,使其他前台進程無法運行
   
    * 運行時間過長,但沒有預期效果
   
    * 產生了過多到屏幕或磁盤文件的輸出
   
    * 無法正常退出
   
    kill用法:
   
    關閉進程:kill  [進程號]
   
    root@root:~# kill -l
   
    1) SIGHUP    2) SIGINT    3) SIGQUIT    4) SIGILL    5) SIGTRAP
   
    6) SIGABRT    7) SIGBUS    8) SIGFPE    9) SIGKILL    10) SIGUSR1
   
    11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
   
    16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
   
    21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
   
    26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
   
    31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
   
    38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
   
    43) SIGRTMIN+9    44) SIGRTMIN+10   45) SIGRTMIN+11   46) SIGRTMIN+12   47) SIGRTMIN+13
   
    48) SIGRTMIN+14   49) SIGRTMIN+15   50) SIGRTMAX-14   51) SIGRTMAX-13   52) SIGRTMAX- 12
   
    53) SIGRTMAX-11   54) SIGRTMAX-10   55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
   
    58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
   
    63) SIGRTMAX-1    64) SIGRTMAX
   
    我們看到每個編號對應一個含義,如 9) SIGKILL ;9標注的是SIGKILL ,那么我們可用9來終止進程。
   
    關閉進程:
   
    kill -s 9 [進程號]  (強行關閉)
   
    kill -9   [進程號]  (強行關閉)
   
    上面的兩種形式都可以強行關閉進程。
   
    重啟進程:
   
    有時候我們需要把進程重新啟動一下,可以下面的命令完成。
   
    kill -1  [進程號]  (重啟進程)
   
    root@root:~# kill -1 3567    重啟PID為3567的進程
   
    關閉圖形程序:
   
    關閉圖形程序: xkill
   
    當你在終端下輸入這個命令時,你的鼠標會變成一個小叉子,你只去點你想要關閉的窗口就可以關閉了
   
    其它:
   
    結束所有進程:    killall
   
    查找服務進程號: pgrep  [服務名稱]
   
    關閉進程:          pkill    [進程名稱]
   
    一個存放內存中的特殊目錄/proc
   
    這個目錄比較特殊,他並不在我們磁盤上,而在我們的內存當中;當前系統運行的所有進程都動態的存放在這個目錄中。
   
    root@root:~# ls /proc
   
    1 14 15 187 287 820 dma net
   
    10 1401 1524 19 3 827 driver pagetypeinfo
   
    1037 1403 1525 1906 32 830 execdomains partitions
   
    1043 1413 1527 1919 34 832 fb sched_debug
   
    1047 1414 1531 2 35 834 filesystems schedstat
   
    11 1415 1536 20 36 840 fs scsi
   
    1172 1418 1544 2024 454 842 interrupts self
   
    12 1423 1555 2025 459 843 iomem slabinfo
   
    ……
   

 


    上面每個編號就是以我們當前進程PID所命令的目錄名。
   
    當然,當前目錄下也存放了一些我們系統的信息
   
    查看我們當前cpu的信息
   
    root@root:~# cat /proc/cpuinfo
   
    processor : 0
   
    vendor_id : GenuineIntel
   
    cpu family : 6
   
    model : 23
   
    model name : Pentium(R) Dual-Core CPU T4500 @ 2.30GHz
   
    stepping : 10
   
    cpu MHz : 2294.000
   
    cache size : 1024 KB
   
    fdiv_bug : no
   
    hlt_bug : no
   
    f00f_bug : no
   
    coma_bug : no
   
    fpu : yes
   
    fpu_exception : yes
   
    cpuid level : 13
   
    wp : yes
   
    flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov
   
    pat
   
    pse36 clflush dts acpi mmx fxsr sse sse2 ss nx constant_tsc up arch_perfmon
   
    pebs
   
    bts xtopology tsc_reliable aperfmperf pni ssse3 hypervisor dts
   
    bogomips : 4588.00
   
    clflush size : 64
   
    cache_alignment : 64
   
    address sizes : 40 bits physical, 48 bits virtual
   
    power management:
   
    查看內存信息
   
    root@root:~# cat /proc/meminfo
   
    MemTotal: 508344 kB
   
    MemFree: 10668 kB
   
    Buffers: 10700 kB
   
    Cached: 96056 kB
   
    SwapCached: 34124 kB
   
    Active: 231384 kB
   
    Inactive: 231576 kB
   
    Active(anon): 178524 kB
   
    Inactive(anon): 178316 kB
   
    Active(file): 52860 kB
   
    Inactive(file): 53260 kB
   
    ……
   
    查看當前分區的信息
   
    root@root:~# cat /proc/partitions
   
    major minor #blocks name
   
    8 0 20971520 sda
   
    8 1 20446208 sda1
   
    8 2 1 sda2
   
    8 5 522240 sda5
   
    進程的優先級
   
    我們學過操作系統原理的同學都知道,我們系統在執行程序時有會先后順序的,但為什么我們的電腦可以邊聽音樂,邊聊QQ,邊上網,甚至還可以同時掛幾個游戲。因為我們CPU運行超快。他可以把每個程序的進程排好隊,這個執行一下,那個執行一下。所以,我們會覺得各種程序是並行運行的。
   
    當然,進程也會分個快慢緩急的,所以要對進程分個優先級。同學們在食堂排隊打飯,總理來了,這優先級多高啊。同學們紛紛讓開,先給總理打。
   
    * 優先級取值范圍為(-20,19)
   
    linux給我們提供的優先級的范圍為-20到19,我們啟動一個進程時,默認的優先級為0 ,-20的優先級為最大,或者說最高。當然,我們在設置的時候可以寫-30,但系統默認為-20.
   
    nice命令
   
    指定程序的運行優先級
   
    格式:nice -n command
   
    例如:nice --5 command
   
    renice 命令
   
    改變一個正在運行的進程的優先級
   
    格式: renice n pid
   
    例如:renice -5 777
   
    例子:
   
    [root@bogon cron]# ps -le
   
    [root@bogon cron]# renice -20  [PID]
   
    nohup命令可以在用戶退出時繼續執行某一進程
   
    一般的命令在用戶退登錄后就停止執行了,nohup命令可以使進程在用戶退出登錄后仍舊繼續執行,nohup命令將執行后的數據信息和錯誤信息默認存儲到文件nohup.out中
   
    格式:
   
    nohup program &
   
    例子:
   
    [root@bogon cron]# nohup find / -name init* > /hzh/test/find.init.20120520 &
   
    如果我們沒指定/hzh/test/find.init.20120520這個保存位置的話,系統默認會把查詢的結果放到nohup.out的文件中。我們一般不會去使用默認方式保存。
   
    進程的掛起與恢復
   
    當我們執行一條命令時,發現太慢或輸出內容太多,最常用到的做法就是終止(ctrl+c),那么掛起呢?通俗一點就是暫停唄!^_^!!
   
    進程中止(掛起)和終止
   
    掛起(ctrl+z)
   
    終止(ctrl+c)
   
    [root@bogon ~]# find / -name init* > /hzh/test/find.init.20120520
   
    [1]+ Stopped find / -name init* >/hzh/test/find.init.20120520
   
    被暫停的進程會提示我們Stopped
   
    小知識:系統中有兩種運行的進程,我們在前台是看不到的。一種是后台執行的命令,一種就是被暫停的。那我們通過什么方式查看被暫停和后台執行的進程呢?
   
    查看被掛起的進程(jobs)
   
    進程的恢復:
   
    恢復到前台繼續運行(fg)
   
    恢復到后台繼續運行(bg)
   
    [root@bogon ~]# jobs     通過jobs命令可以查看后被暫停的進程
   
    [1]+ Stopped find / -name init* >/hzh/test/find.init.20120520
   
    [root@bogon ~]# fg        fg會將暫停的進程恢復到前台繼續執行。
   
    find / -name init* >/hzh/test/find.init.20120520
   
    [root@bogon ~]# bg      bg會將暫停的進程恢復到后台繼續執行
   
    [1]+ find / -name init* >/hzh/test/find.init.20120520 &
   
    通過top命令查看進程
   
    top命令與前面介紹的ps命令相似,已經介紹了ps,為什么還要top?top有它自己的優點呢。它比ps顯示的信息更詳細。而且是動態的噢,信息是在不斷變化的噢!
   
    [root@bogon ~]# top
   
    top - 12:45:16 up 43 min, 1 user, load average: 0.00, 0.04, 0.06
   
    Tasks: 57 total, 1 running, 56 sleeping, 0 stopped, 0 zombie
   
    Cpu(s): 0.3% us, 0.3% sy, 0.0% ni, 99.3% id, 0.0% wa, 0.0% hi, 0.0% si
   
    Mem: 1034536k total, 232864k used, 801672k free, 60188k buffers
   
    Swap: 1052248k total, 0k used, 1052248k free, 118692k cached
   
    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
   
    6848 root 15 0 28948 8444 2524 S 0.3 0.8 0:05.44 X
   
    7181 root 16 0 7036 2436 1968 S 0.3 0.2 0:00.26 sshd
   
    7244 root 16 0 1964 976 772 R 0.3 0.1 0:00.45 top
   
    1 root 16 0 3116 544 464 S 0.0 0.1 0:00.97 init
   
    2 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
   
    3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
   
    4 root 5 -10 0 0 0 S 0.0 0.0 0:00.03 events/0
   
    5 root 5 -10 0 0 0 S 0.0 0.0 0:00.01 khelper
   
    6 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 kthread
   
    7 root 15 -10 0 0 0 S 0.0 0.0 0:00.00 kacpid
   
    88 root 5 -10 0 0 0 S 0.0 0.0 0:00.01 kblockd/0
   
    89 root 15 0 0 0 0 S 0.0 0.0 0:00.00 khubd
   
    106 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pdflush
   
    107 root 15 0 0 0 0 S 0.0 0.0 0:00.18 pdflush
   
    108 root 25 0 0 0 0 S 0.0 0.0 0:00.00 kswapd0
   
    109 root 6 -10 0 0 0 S 0.0 0.0 0:00.00 aio/0
   
    255 root 25 0 0 0 0 S 0.0 0.0 0:00.00 kseriod
   
    常用選項:
   
    d :   指定刷新的時間間隔
   
    c :     顯示整個命令而不僅僅顯示命令名
   
    在命令運行的時候按鍵盤d,會出現如下提示要求你輸入刷新的間隔時間
   
    Change delay from 3.0 to: 10(秒)
   
    常用命令:
   
    u :   查看指定用戶的進程
   
    k :   終止執行中的進程
   
    h or ?   獲得幫助
   
    r:      重新設定進程優先級
   
    s:    改變刷新的時間間隔
   
    W:  將當前設置寫入~/.toprc文件中
   
    這里不細講了,感興趣的可以用  man top  命令查看top的詳細幫助。

 


   
    為什么要計划任務
   
    為什么要設置計划任務
   
    我們在系統的管理中,很多時候不是及時的去操作,比如對某一網站數據的備份,備份的過程需要占用大量的系統資源,凌晨三四點的時候系統訪問用戶最少,系統最空閑。但我們的系統的系統管理員總不能老那個時間爬起來操作吧。如果在家遠程操作的話,老婆不願意了。哈哈!
   
    計划任務的命令
   
    計划命令分一次性計划和周期性計划。比如我要在今年10月1結婚,這是一次性的計划。不能每年的10月1結婚吧,真有女女願意結,咱經濟上也吃不消呀。睡覺就是周期性的計划。比如,我給自己規定每天晚上的11點半睡覺。那么到時間我就上床睡覺。
   
    at    安排作業在某一時刻執行一次
   
    batch  安排作業在系統負載不重時執行一次
   
    cron    安排周期性運行的作業
   
    一次性計划at和batch
   
    at命令指定時間的方式
   
    絕對計時方法:
   
    midnight noon teatime
   
    hh:mm [today]
   
    hh:mm tomorrow
   
    hh:mm 星期
   
    hh:mm MM/DD/YY
   
    相對計時方法:
   
    now+n minutes
   
    mow+n hours
   
    now+n days
   
    用法:
   
    指定在今天下午17:30執行某命令(假設現在時間是下午14:30,2012年1月11日)
   
    命令格式:
   
    at 5:30pm
   
    at 17:30
   
    at 17:20 today
   
    at now+3 hours
   
    at now+180 minutes
   
    at 17:30 12.1.11
   
    at 17:30 1.11.12
   
    好!現格式知道了,玩個實例吧!
   
    [root@bogon ~]# at now+5 minutes
   
    at>
   
    我們定的時間是5分鍾之后,現在可以在at下面輸入各種任務,保存!5分鍾之后執行;不過,我們需要注意,在用命令時最好寫命令的絕對路徑,為了安全。
   
    [root@bogon ~]# at now+5 minutes
   
    at> /usr/bin/wall < /etc/motd    做一個廣播,把etc/motd 文件廣播出去
   
    at>                   可以繼續寫其它的計划
   
    at> <EOT>
   
    job 2 at 2012-05-20 13:43      ctrl+d保存計划並退出
   
    是否還擔心我們的計划是否啟動,通過下面兩個命令查看at進程是否正常啟動
   
    [root@bogon test]# at -l
   
    3 2012-05-20 13:57 a root
   
    [root@bogon test]# atq
   
    3 2012-05-20 13:57 a root
   
    如果真的沒有啟動的話,可以通過手工方式重新啟動一下
   
    [root@bogon ~]# /etc/rc.d/init.d/atd start
   
    刪除at計划任務
   
    [root@bogon test]# at -d
   
    查看at計划任務
   
    [root@bogon test]# ls /var/spool/at/
   
    batch命令
   
    作用:
   
    安排一個或多個命令在系統負載較輕進運行一次(一般情況下負載較輕指平均負載降到0.8以下)
   
    使用方法同at
   
    周期性計划命令crontab
   
    作用:用於生成cron進程所需要的crontab文件
   
    crontab的命令格式
   
    crontab {-l|-r|-e}
   
    -l   顯示當前的crontab
   
    -r   刪除當前的crontab
   
    -e   使用編輯器編輯當前crontab文件
   
    好多人都覺得周期計划任務設置起來比較麻煩,其實我們只要掌握規律就很好設置。
   
    crontab -e
   
    規則:  把知道的具體的時間添上,不知道的都添加上*
   
    分鍾    小時   天    月    星期   命令/腳本
   
    假如,我們每天早上4點要做一下操作,以下面方式表示:
   
    分鍾    小時    天    月  星期    命令/腳本
   
    *         18     *     *   1,3      [具體的操作]
   
    假如,我們每周一和三下午的6點要做一下操作,以下面方式表示:
   
    分鍾    小時   天   月   星期    命令/腳本
   
    *         4      *    *    *    [具體的操作]
   
    案例:在上學的時候都有上機課,周一到周五,下午5點30上課結果。我們需要在5點30發一個通知,5點45自動關機。設定計划任務需要分兩步完成,第一步提醒,第二步關機
   
    分鍾   小時    天   月    星期    命令/腳本
   
    30     17      *    *    1-5    /usr/bin/wall < /hzh/test/guanji.wall
   
    45     17      *    *    1-5    /usr/bin/shudown -h now
   
    操作方法:
   
    [root@bogon test]#  crontab -e    回車會進入一個vi文本中
   
    根據我上面介紹格式編寫內容,然后保存退出
   
    crontab: installing new crontab 表示創建計划成功
   
    通過下面方式進行查看計划:
   
    [root@bogon test]# cd /var/spool/cron
   
    [root@bogon cron]# ls
   
    root
   
    [root@bogon cron]# cat root
   
    30 17 * * 1-5 /usr/bin/shudown -h now  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM