進程的概念
1. 在linux系統中,每一段執行的程序都稱為一個進程,被分配一個進程編號(id)。
2. 每個進程都對應一個父進程,一個父進程可以復制多個子進程。
3. 一個進程可能以兩種方式存在:前台和后台。前台是指用戶在屏幕上可以進行操作的,后台是指屏幕上看不到的實際操作。
4. 一般系統的服務都是以后台進程的方式存在,並且常駐系統中,直到關機才結束。
進程操作命令
1. 查看正在執行的所有進程
ps [-aux] [| more]
其中,-a表示顯示當前所有進程,-u表示以用戶格式顯示進程,-x表示顯示進程運行的參數。
上述三個參數一般都是要使用的。如果想分頁顯示,后面加 | more。
2. 根據命令查詢特定的進程
ps -aux | grep instruction [| more]
其中,instruction為命令名稱。例如,要查看正在執行的sshd進程,ps -aux | grep sshd。
3. 查看進程及其父進程
ps -ef [| more]
該命令會以全格式顯示當前所有進程,比上述命令多一行PPID,即父進程的id。
例如,要查詢sshd進程的父進程,ps -ef | grep sshd。
4. 終止進程
kill [-9] pid
其中,pid為要終止的進程編號;-9表示強制終止,用於某些核心進程(例如終端bash)。
5. 批量終止進程
killall pname
其中,pname為進程名稱,支持通配符,這在系統因執行多個同類型進程變慢時很有用。
6. 以樹狀結構顯示當前進程
pstree [-pu]
其中,-p表示顯示進程編號,-u表示顯示進程所屬的用戶。如下圖所示:
7. 動態監控進程
top [-i] [-d n] [-p pid]
交互操作:P(按占用cpu比例排序)、M(按占用內存排序)、N(按進程編號排序)、u(只監控某個用戶)、k(結束進程)、q(退出)。
這個命令跟ps很相似,區別是可以定時(默認3秒)刷新,支持交互操作。其中,-i表示只顯示正在運行的進程;-d用於指定刷新時間間隔(n秒);-p用於指定進程編號,只監控編號為pid的進程。
進程操作示例
1. 踢掉某個非法登錄的用戶
(1)查詢正在執行的sshd進程:ps -aux | grep sshd。
(2)將正在登錄的dubhlinn用戶踢掉,即終止進程19477:kill 19477。
(3)dubhlinn用戶會被強制退出,並提示:Connection to xxx closed by remote host.
2. 批量關閉已經打開的多個gedit編輯器
killall gedit
3. 強制關閉終端
(1)查詢已經打開的終端:ps -ef | grep bash
(2)關閉用戶dubhlinn的終端:kill 20642,發現沒有反應,因為終端是重要進程,會繞開kill命令,必須強制關閉。
kill -9 20642,終端被關閉。
進程列表簡介
通過ps -aux命令可以以列表形式顯示當前進程的詳細信息,那么這些列代表什么呢?
USER:進程所屬的用戶名;
PID:進程編號
%CPU:占用CPU的比例
%MEM:占用內存的比例
VSZ:占用虛擬內存的大小
RSS:占用物理內存的大小
TTY:終端名稱
STAT:進程狀態,S為睡眠,R為正在執行,Z為僵死,D為短期等待,N表示優先級低於普通進程
START:進程的啟動時間
TIME:進程使用CPU的總時間
COMMAND:進程的命令名稱和參數
服務的概念
linux系統的服務(service)本質是一種運行在后台的進程,監聽某個端口,等待其他應用的請求。例如,sshd服務監聽22端口,mysql服務監聽3306端口,tomcat服務監聽8080端口等。另一台電腦的終端可以通過22端口連接linux服務器的sshd服務,navicat可以3306端口連接服務器的mysql服務,瀏覽器可以通過8080端口連接服務器的tomcat服務。
服務操作命令
在CentOS7中,服務操作命令跟以往的版本有很大不同,用systemctl代替了原來的service。
1. 查看一個服務的當前狀態
systemctl status name.service
其中,name為服務名稱。
2. 開啟/關閉/重新啟動一個服務
systemctl start name.service
systemctl stop name.service
systemctl restart name.service
其中,name為服務名稱。例如關閉sshd服務:systemctl stop sshd.service,這時用ssh命令登錄系統會失敗並提示connection refused。開啟sshd服務:systemctl start sshd.service,這時又可以用ssh命令登錄系統了。這些命令只是臨時開啟或關閉服務,系統重啟后會失效,如果想設置某個服務開啟總是啟用/禁用,要用下面標題3中的命令。
3. 設置一個服務開機啟用/禁用
systemctl enable name.service
systemctl disable name.service
其中,name為服務名稱。
4. 查看服務列表
systemctl list-unit-files [| grep status/name]
其中,status表示按狀態篩選可以取enabled、disabled、static,表示只篩選這種狀態的服務;name表示按名稱篩選,支持模糊匹配。
注意,這個命令查到的服務狀態是指開機啟用/禁用,而不是當前的狀態,這時它與標題1中的systemctl status命令的區別。
5. 查看現在開放的防火牆端口
firewall-cmd --zone=public --list-ports
6. 開放、關閉一個端口
firewall-cmd --zone=public --add-port=port/tcp --permanent
firewall-cmd --zone=public --remove-port=port/tcp --permanent
其中,port為要開放或關閉的端口號,這兩個操作要重啟防火牆服務才能生效。
服務操作示例
以防火牆為例
1. 查看防火牆的當前狀態
systemctl status firewalld.service
可以看出,當前防火牆的狀態為開啟。
2. 關閉防火牆
systemctl stop firewalld.service
這時如果再調用systemctl status firewalld.service查看防火牆的當前樁體,會發現變成關閉。
3. 查詢服務列表
systemctl list-unit-files
找到防火牆的部分:
發現仍然是開機啟用狀態,因此調用systemctl stop命令指示臨時關閉防火牆,重啟系統后,防火牆仍然會默認啟用。
4. 設置防火牆為開機默認禁用
systemctl disable firewalld.service
再調用systemctl list-unit-files,找到防火牆的部分:
5. 開放8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
systemctl restart firewalld.service
先開放8080端口,再重啟防火牆服務,即可生效。8080端口通常用於tomcat服務,開放后外部可以訪問tomcat容器中的資源。