Linux——系統管理

進程管理

首先我們要知道進程管理的目的:

1.判斷服務器的健康狀況

2.查看進程狀態

3.殺死進程

當然殺死進程不是一個正常操作,不像在windows中打開任務管理器隨便kill掉,殺死進程一般不是一個正常的退出方式,可能會導致某些問題。


我們按照順序來說,如何查看進程的健康狀態呢?

使用top命令:

top - 13:55:33 up 3 min,  2 users,  load average: 0.18, 0.33, 0.16
Tasks: 351 total,   2 running, 349 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.7 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1001332 total,   732424 free,   123868 used,   145040 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.   727740 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND            
   316 root      20   0       0      0      0 S  0.7  0.0   0:04.60 kworker/0:3        
  2678 root      20   0  146276   2256   1420 R  0.3  0.2   0:00.26 top                
     1 root      20   0   44516   7128   2596 S  0.0  0.7   0:05.07 systemd            
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.05 kthreadd           
     3 root      20   0       0      0      0 S  0.0  0.0   0:00.47 ksoftirqd/0        
     4 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0        
     5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H       
     6 root      20   0       0      0      0 S  0.0  0.0   0:00.07 kworker/u256:0     
     7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0        
     8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh             
     9 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/0            
    10 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/1            
    11 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/2            
    12 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/3            
    13 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/4            
    14 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/5            
    15 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/6            
    16 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/7 
top命令默認3秒刷新一次,windows的任務管理器是1秒刷新一次。

在這裏我們可以看到進程的健康狀況。

最主要的就是前面5行。

第一行,顯示時間,開機了多久,多少個用戶,5,10,15分鐘之前對應的平均負載。

第二行,進程總數,正在運行進程數,休眠數,停止數,殭屍進程數。

第三行,us 用戶空間佔用CPU百分比 sy 內核空間佔用CPU百分比 ni 用戶進程空間內改變過優先級的進程佔用CPU百分比 id 空閒CPU百分比 wa 等待輸入輸出的CPU時間百分比 hi 硬件中斷 si 軟件中斷。這裏我們主要看空閒CPU就可以了,也就是id。

第四行,內存空間。也是主要看的部分。

第五行,交換空間。

top是交互命令,可以使用h查看幫助手冊。


查看進程的狀態

ps aux或ps -le
[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.3  0.7  44516  7144 ?        Ss   13:52   0:05 /usr/lib/systemd/syste
root          2  0.0  0.0      0     0 ?        S    13:52   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    13:52   0:00 [ksoftirqd/0]
root          6  0.0  0.0      0     0 ?        S    13:52   0:00 [kworker/u256:0]
root          7  0.0  0.0      0     0 ?        S    13:52   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    13:52   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        S    13:52   0:00 [rcuob/0]
root         10  0.0  0.0      0     0 ?        S    13:52   0:00 [rcuob/1]
root         11  0.0  0.0      0     0 ?        S    13:52   0:00 [rcuob/2]
root         12  0.0  0.0      0     0 ?        S    13:52   0:00 [rcuob/3]
root         13  0.0  0.0      0     0 ?        S    13:52   0:00 [rcuob/4]
root         14  0.0  0.0      0     0 ?        S    13:52   0:00 [rcuob/5]
...

USER: 進程對應的用戶

PID: 進程號,值得一說的是。/usr/lib/systemd/syste在centOs7中是第一個進程,它是所有進程的父進程。如果是centOs6,則是/bin/init。

%CPU:  CPU使用率

%MEM: 內存使用率

VSZ: 虛擬內存使用

RSS: 實際內存使用

TTY: 終端號。tty1-6是本地終端號,tty7爲本地圖形終端號。遠程終端號位pts/0-255。如果是?則代表這是系統進程

STAT: 進程狀態,S表示休眠,s表示包含了子進程,R代表運行。T代表停止,+表示後臺運行等等

START: 進程啓動時間。

TIME: 耗費CPU的運算時間

COMMAND: 進程名稱

使用ps -ls可以看到進程的優先級。

我們還可以使用pstree查看進程樹。

[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─abrt-watch-log
        ├─abrtd
        ├─anacron
        ├─atd
        ├─auditd───{auditd}
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─firewalld───{firewalld}
        ├─login───bash
        ├─lsmd
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───5*[{polkitd}]
        ├─rngd
        ├─rsyslogd───2*[{rsyslogd}]
        ├─smartd
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─wpa_supplicant
就好像我們上面說的,systemd是所有進程的父進程,可以在這裏查看到。


殺死進程

kill  信號  進程號
信號是什麼呢?可以使用kill -l查看信號。

常用信號:

只有第9種信號(SIGKILL)纔可以無條件終止進程,其他信號進程都有權利忽略。    下面是常用的信號:
HUP     1     終端斷線
INT     2     中斷(同 Ctrl + C)
QUIT    3     退出(同 Ctrl + \)
TERM    15    終止
KILL    9     強制終止
CONT    18    繼續(與STOP相反, fg/bg命令)
STOP    19    暫停(同 Ctrl + Z)
也就是kill是發送信號的命令。

我們可以使用killall刪除一系列進程:

killall [參數]  [進程名]

我們還可以使用nice命令修改進程的優先級。

其實進程的優先級並不總是需要改變,這裏瞭解一下就好了。


工作管理
工作其實也就是後臺管理。因爲查看後臺的程序命令是jobs,所以一般叫做工作管理。


首先我們需要只要

1.後臺任務一般是綁定終端的,在這個終端下進入後臺的程序在其他終端是無法進行管理的。

2.放入後臺的任務需要持續一段時間的,如果一放入後臺就執行完,沒什麼意義。

3.需要交互的任務放入後臺無法運行。因爲需要交互的話,任務會進入阻塞狀態,需要得到輸入之後纔會進入運行狀態。而後臺任務無法獲得我們的輸入。


那麼如何放入後臺呢?

1.在命令最後面加入 &。

2.執行過程中,使用ctrl+z放入後臺。

兩者有什麼區別呢?使用&放入後臺的程序,是運行狀態,而使用ctrl+z的方式放入後臺是掛起狀態,不會執行。

我們可以使用jobs來查看後臺的進程。例如:

[root@localhost ~]# jobs
[1]+  Stopped                 top
這樣我們就能查看到後臺的進程和他們對應的狀態。

最前面的1是後臺進程工作號。是後臺任務的標識。

如何將後臺進程恢復到前臺:

fg  工作號
將掛起的進程恢復到執行狀態:

bg  工作號

有時候我們希望一個後臺進程不被終端綁定,希望他一直運行,怎麼辦呢?

第一個方法就是將進程變爲守護進程。但這個方法我們不常用。

第二個方式就是使用nohup命令:

[root@localhost ~]# nohup top &
[1] 2699
這樣就會脫離終端了。上面這個只是使用方法的實例,這樣做終端知道top需要交互,會拒絕執行這個命令。因爲沒有意義

第三個方法是將服務卸載/etc/rc.local中,這樣,每次開機都會開啓這個後臺進程。因爲這是父進程開啓的終端中打開的後臺進程,所以相當於沒有綁定終端。


定時任務

windows中也有定時任務,並且是圖形界面的。

而Linux中則需要在終端中執行。

Linux中分爲一次性定時任務和循環定時任務。

一次性定時任務
使用at命令:

at [參數] [時間]
at> 執行的指令
定時之後輸入命令,按ctrl +d就可以退出了。

之後可以通過at查看定時任務列表。

可以在/etc/at.deny中設置不能使用at命令的用戶。


循環定時任務

1.使用crontab命令。

crontab  [選項]
選項

-e: 編輯任務

-l: 查詢任務

-r: 刪除當前用戶所有任務


格式:

*  *  *  *  *  command 
第一個*:一小時當中第幾分鐘

第二個*:一天當中第幾個小時

第三個*:一個月中第幾天

第四個*:一年中第幾個月

第五個*:一週中星期幾


除此之外,我們需要知道幾個符號

*: 代表任意時間

,: 代表不連續的時間

-: 代表連續時間

*/n: 代表隔n執行

例如:每隔10分鐘執行:

*/10 * * * * * command


當然這種方式其實並不經常用。

系統提供了幾個文件,方便我們的管理。

/etc/cron.{}提供了hourly,daily,weekly,monthly文件,只要我們將文件放置在對應的文件中,就會相對應的每小時,每天,每週,每個月執行。

這幾個文件通過/etc/anacrontab來控制,我們來看下其中的內容:

[root@localhost ~]# vim  /etc/anacrontab 

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly
也就是說,他們會每天執行daily,每7天執行weekly,每${monthly}執行monthly。

所以我們只需要將命令放入對應的文件中,其實就能達到定時任務的目的。

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