0.進程處理方式
standalone 獨立運行
xinetd 進程托管
atd、crond計划任務
(1)獨立運行:
一直在獨立運行,比如apache、nginx服務器,一直在監聽80端口的請求,有了請求可以馬上響應,由於一直在監聽所以一直在占用CPU資源。服務啟動后一直在系統駐留,等待客戶訪問並能很快應答。
[root@VM_0_12_centos ~]# netstat -ano | grep "LISTENING" |more #查看監聽狀態的端口 unix 2 [ ACC ] STREAM LISTENING 9471 /run/systemd/private
(2)xinetd 托管進程
不會一直在系統中駐留,會交給xinetd托管,當有請求的時候xinetd調用進程。占用資源少,但是響應時間也慢。
(3)atd、crond計划任務 就是定期定時執行任務
沒有辦法精確到秒,因為at,crond執行任務的時候不像standalone一直在監聽請求,也不會像xinetd有請求就啟動進程回應,它們的處理方式是每隔一分鍾醒來一次查看計划任務列表中是否有計划,有就執行,沒有就繼續休眠。
1.進程和程序的區別
程序是經驗概念,本身作為一種軟件資源長期保存,而進程是程序是執行過程,它是動態概念,有一定的生命周期,是動態產生和消亡的。
程序和進程無一一對應關系,一個程序可以由多個進程共有;另外,一個進程在活動中可以有序的執行若干個程序。
2.父進程和子進程的概念
1.子進程是一個由父進程所產生的進程,產生這個子進程的進程成為父進程。
2.在linux中,系統使用fork創建進程。fork復制的內容包括和堆棧段以及父進程的進程環境
3.父進程終止子進程自然終止。
如果父進程終止,死了子進程沒死,這種進程成為孤兒進程,子進程的父進程ID會自動指向init進程(PID為0)
如果子進程死亡,父進程存活,這種進程稱為僵屍進程。
3.前台進程和后台進程:
前台進程:在shell中輸入一條命令,創建一個子進程,運行命令,shell等待命令退出,然后返回給用戶提示。這條命令與shell異步運行,用戶 在完成之前不能執行另一條命令。例如如下命令,在沒有給出結果之前我們不能執行其他操作:
[root@VM_0_12_centos ~]# find / -name init
后台進程:在shell提示處打出命令,隨后給一個&,shell創建的子進程運行此命令,但不等待命令退出,而直接返回到對童虎提示,這條命令與shell命令同步運行,即在后台運行。后台進程是非交互式的。例如我們可以將上面查找命令后面加一個&標識符,並將結果重定向到一個文件中,這個進程就是后台進程:
[root@VM_0_12_centos ~]# find / -name init > ./test.find &
4.進程狀態:
4.進程狀態查看的命令: ps
ps命令用於報告當前系統的進程狀態。可以搭配kill指令隨時中斷、刪除不必要的程序。ps命令是最基本同時也是非常強大的進程查看命令,使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等,總之大部分信息都是可以通過執行該命令得到的。
ps(選項)
常用選項:
a:顯示所有用戶的進程
u:顯示用戶名和啟動時間
x:顯示沒有控制終端的進程
e:顯示所有進程,包括沒有控制終端的進程
l:采用詳細的格式來顯示程序狀況。
w:寬行顯示,可以使用多個w進程寬行顯示。
例如:
(1)查看屬於當前用戶自己的進程信息:
[root@VM_0_12_centos ~]# ps PID TTY TIME CMD 5819 pts/0 00:00:00 bash 6493 pts/0 00:00:00 ps
(2)查看屬於自己的進程詳細信息: ps -l或者ps -u(一般用 ps -le 顯示的信息更詳細)
[root@VM_0_12_centos ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 5819 5817 0 80 0 - 29042 wait pts/0 00:00:00 bash 0 R 0 6499 5819 0 80 0 - 34343 - pts/0 00:00:00 ps
[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 3485 0.0 0.1 115508 2120 pts/0 Ss 12:12 0:00 -bash root 3509 0.0 0.1 115508 2084 pts/1 Ss 12:13 0:00 -bash root 3529 0.0 0.1 187520 2336 pts/1 S 12:13 0:00 su qlq root 3627 0.0 0.0 151052 1836 pts/0 R+ 12:13 0:00 ps -u root 30845 0.0 0.1 115380 2112 tty1 Ss+ Mar30 0:00 -bash
PID:進程ID
PPID:父進程ID
TTY:登錄的終端(本地為tty,遠程為pts)
STATE:進程當前狀態
S:休眠,D:不可中斷的休眠狀態,R:運行狀態,Z:僵死狀態,T:停止狀態。
NI:進程優先級
TIME:進程自啟動以來占用cpu時間
CMD:進程的命令
USER:用戶名
%CPU:占用CPU時間和總時間的百分比
%MEM:占用內存和系統總內存的百分比
(3)查看所有用戶執行的進程的詳細信息:ps -le 顯示的是UID或者 ps -aux 會顯示進程的所屬用戶名字,最好加more分頁顯示:
[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ ps -aux | more USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 43252 3432 ? Ss Mar29 0:07 /usr/lib/syste d/systemd --switched-root --system --deserialize 21 root 2 0.0 0.0 0 0 ? S Mar29 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S Mar29 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< Mar29 0:00 [kworker/0:0H] root 7 0.0 0.0 0 0 ? S Mar29 0:00 [migration/0] root 8 0.0 0.0 0 0 ? S Mar29 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? R Mar29 0:08 [rcu_sched]
[root@VM_0_12_centos sshDemo]# ps -le | more F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 30759 ep_pol ? 00:00:42 systemd 1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd 1 S 0 3 2 0 80 0 - 0 smpboo ? 00:00:10 ksoftirqd/0
(4)一般使用是加管道過濾:(例如查看和apache的httpd相關進程)
[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ ps -aux | grep http root 977 0.0 0.2 226224 5184 ? Ss Mar29 0:03 /usr/sbin/httpd -DFOREGROUND qlq 4919 0.0 0.0 112644 968 pts/1 R+ 12:17 0:00 grep --color=au to http apache 14260 0.0 0.1 226360 3744 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND apache 14261 0.0 0.1 226360 3748 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND apache 14262 0.0 0.1 226360 3748 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND apache 14263 0.0 0.1 226360 3748 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND apache 14264 0.0 0.1 226360 3740 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND apache 31451 0.0 0.1 226360 3748 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND apache 31509 0.0 0.1 226360 3748 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND
(5)如果希望按某一順序排序:
[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ ps -le --sort pid | more #按pid排序 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 10813 ep_pol ? 00:00:07 systemd 1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd 1 S 0 3 2 0 80 0 - 0 smpboo ? 00:00:00 ksoftirqd/0 1 S 0 5 2 0 60 -20 - 0 worker ? 00:00:00 kworker/0:0H 1 S 0 7 2 0 -40 - - 0 smpboo ? 00:00:00 migration/0 1 S 0 8 2 0 80 0 - 0 rcu_gp ? 00:00:00 rcu_bh
(6)查看某一用戶的進程:
[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ ps -uU qlq #查看qlq用戶的進程信息 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND qlq 3530 0.0 0.1 115380 2108 pts/1 S 12:13 0:00 bash qlq 5806 0.0 0.0 151052 1832 pts/1 R+ 12:20 0:00 ps -uU qlq
(7)查看系統的進程樹信息: pstree
[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ pstree #查看進程樹 systemd─┬─AliYunDun───15*[{AliYunDun}] ├─AliYunDunUpdate───3*[{AliYunDunUpdate}] ├─aliyun-service ├─atd ├─auditd───{auditd} ├─crond ├─dbus-daemon ├─httpd───7*[httpd] ├─java───27*[{java}] ├─login───bash ├─miniserv.pl ├─mysqld_safe───mysqld───23*[{mysqld}] ├─ntpd───ntpd ├─polkitd───5*[{polkitd}] ├─rsyslogd───2*[{rsyslogd}] ├─sshd─┬─sshd───bash───su───bash───pstree │ └─sshd───bash ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tmpnam_epbkCH ├─tuned───4*[{tuned}] ├─wipefs───5*[{wipefs}] └─wrapper─┬─java───13*[{java}] └─{wrapper}
5.進程殺死命令 kill
1. 為什么要殺死進程?
該進程占用了過多的cpu時間
該進程鎖住了一個終端,其他嵌套進程無法運行。
運行時間過長但沒有效果
產生了過多到屏幕或者磁盤文件的輸出
無法正常退出程序。
2 kill用法:
kill pid 直接殺死進程
kill -9 pid 強制殺死進程
kill -1 pid 重啟進程
killall 進程名 可以關閉所有進程名相同的進程
例如:
(1)查看httpd相關進程
[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd 4 S 0 977 1 0 80 0 - 56556 poll_s ? 00:00:03 httpd 5 S 48 14260 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14261 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14262 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14263 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14264 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 31451 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 31509 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd
(2)殺死pid為31509的進程:
[root@iz2ze46xi6pjjj69ailg9lz ~]# kill 31509 #殺掉pid為31509的進程 [root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd 4 S 0 977 1 0 80 0 - 56556 poll_s ? 00:00:03 httpd 5 S 48 14260 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14261 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14262 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14263 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14264 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 31451 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd
(3)如果我們想殺死所有與httpd相關的進程,我們可以殺死其父進程,其父進程pid為977(父進程死亡,子進程也全部死亡)
[root@iz2ze46xi6pjjj69ailg9lz ~]# kill -9 977 #殺死PID為977的進程 [root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd 5 S 48 14260 1 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14261 1 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14262 1 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14263 1 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14264 1 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 31451 1 0 80 0 - 56590 inet_c ? 00:00:00 httpd
殺死其父進程我們發現其父進程ID自動轉為1,也就是變成孤兒進程。等過一會又會自動死亡。
(4)killall 殺死名稱相同的進程:
[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd 4 S 0 11155 1 0 80 0 - 56556 poll_s ? 00:00:00 httpd 5 S 48 11157 11155 0 80 0 - 56556 inet_c ? 00:00:00 httpd 5 S 48 11158 11155 0 80 0 - 56556 inet_c ? 00:00:00 httpd 5 S 48 11159 11155 0 80 0 - 56556 inet_c ? 00:00:00 httpd 5 S 48 11160 11155 0 80 0 - 56556 inet_c ? 00:00:00 httpd 5 S 48 11161 11155 0 80 0 - 56556 inet_c ? 00:00:00 httpd [root@iz2ze46xi6pjjj69ailg9lz ~]# killall httpd #殺死名為httpd的進程 [root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd
(5)/proc目錄簡介:
注意:
/proc存儲的數據在內存鏡像中,存的主要是進程的信息,每個數字對應的是PID的進程信息,也存放了系統的基本信息,數據是動態的:
[root@iz2ze46xi6pjjj69ailg9lz ~]# ls /proc/ 1 19 28 40 92 fb meminfo sysrq-trigger 10 2 2844 41 978 filesystems misc sysvipc 10277 212 2855 429 982 fs modules timer_list 10649 213 2865 452 997 interrupts mounts timer_stats 1085 232 2866 456 acpi iomem mtrr tty 11473 233 29 460 buddyinfo ioports net uptime 11912 234 3 5 bus irq pagetypeinfo version 12 235 30838 529 cgroups kallsyms partitions vmallocinfo 1213 2359 30845 532 cmdline kcore sched_debug vmstat 13 237 31993 60 consoles keys schedstat zoneinfo 1348 25 32063 7 cpuinfo key-users scsi 14 252 326 7366 crypto kmsg self 15 2533 344 8 devices kpagecount slabinfo 16 259 37 8072 diskstats kpageflags softirqs 1651 26 373 8075 dma loadavg stat 17 260 38 8838 driver locks swaps 18 27 39 9 execdomains mdstat sys
(6)查看服務進程號 pgrep 服務名稱
[root@iz2ze46xi6pjjj69ailg9lz ~]# pgrep httpd 12678 12680 12681 12682 12683 12684
因此重啟httpd服務變得很簡單:
[root@iz2ze46xi6pjjj69ailg9lz ~]# kill -1 `pgrep httpd`
(7)pkill 服務名稱 根據服務名稱殺死所有相關進程:
[root@iz2ze46xi6pjjj69ailg9lz ~]# pkill httpd
(8)nice和renice指定進程優先級
(9)nohup命令 用戶退出后仍繼續執行命令
使用戶退出登錄后仍繼續執行,nohup命令將執行后的數據和信息默認保存到文件nohup.out中
格式:
nohup program &
例如:我們想查詢所有以conf結尾的文件,然后寫到nohup.out文件中。(默認會寫,如果加上重定向不會寫。)
[root@VM_0_12_centos ~]# nohup find / -name *.conf &
6.進程的掛起和結束:
掛起:Ctrl+Z
終止: Ctrl +C
jobs 查看被掛起的進程
fg 恢復到前台繼續執行
bg 恢復到后台執行
例如:
[root@VM_0_12_centos ~]# top #執行top命令 top - 13:17:14 up 11 days, 3:59, 1 user, load average: 0.44, 0.14, 0.12 Tasks: 89 total, 1 running, 88 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 0.2 sy, 0.0 ni, 99.0 id, 0.5 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1883844 total, 157056 free, 115172 used, 1611616 buff/cache KiB Swap: 0 total, 0 free, 0 used. 1569072 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 41104 3372 2192 S 0.0 0.2 0:38.78 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:10.07 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/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:44.25 rcu_sched 10 root rt 0 0 0 0 S 0.0 0.0 0:03.31 watchdog/0 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs 13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns 14 root 20 0 0 0 0 S 0.0 0.0 0:00.14 khungtaskd 15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback 16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd 17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset 18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd 19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md 25 root 20 0 0 0 0 S 0.0 0.0 0:00.57 kswapd0 26 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd 27 root 39 19 0 0 0 S 0.0 0.0 0:02.23 khugepaged 28 root 20 0 0 0 0 S 0.0 0.0 0:00.04 fsnotify_m+ 29 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 crypto 37 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kthrotld 39 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kmpath_rda+ 40 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kpsmoused 41 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 ipv6_addrc+ 60 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 deferwq 102 root 20 0 0 0 0 S 0.0 0.0 0:06.57 kauditd 219 root 20 0 0 0 0 S 0.0 0.0 0:04.25 kworker/u2+ 220 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 ata_sff 222 root 20 0 0 0 0 S 0.0 0.0 0:00.00 scsi_eh_0 224 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 scsi_tmf_0 228 root 20 0 0 0 0 S 0.0 0.0 0:00.00 scsi_eh_1 230 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 scsi_tmf_1 241 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 ttm_swap [1]+ Stopped top #按下Ctrl+Z掛起命令 [root@VM_0_12_centos ~]# jobs #查看被掛起的命令 [1]+ Stopped top [root@VM_0_12_centos ~]#fg 1 #在前台啟動被掛起的top命令
7.top命令查看進程的信息: 進程狀態顯示和控制,每5s中自動刷新一次(動態顯示)
top - 13:20:21 up 11 days, 4:02, 2 users, load average: 0.06, 0.11, 0.12 Tasks: 93 total, 1 running, 92 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.3 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1883844 total, 151244 free, 120668 used, 1611932 buff/cache KiB Swap: 0 total, 0 free, 0 used. 1563372 avail Mem KiB Mem : 1883844 total, 152036 free, 119996 used, 1611812 buff/cache 1850 root 20 0 717064 8420 2624 S 0.3 0.4 8:49.45 YDService 1934 root 20 0 534612 10024 1824 S 0.3 0.5 25:58.77 barad_agent 1 root 20 0 41104 3372 2192 S 0.0 0.2 0:38.79 systemd .................
顯示系統的信息,開機天數,登錄了2個用戶,內存信息UI及負載信息等
常用選項:(下面選項都是在輸入top之后命令執行中按對應按鍵)
d: 指定刷新的時間間隔
c:指定顯示整個命令行而不是顯示命令
u:查看指定用戶的進程
k:殺死執行中的進程
h或者?:顯示幫助
r:重新設置優先級
s:改變刷新的時間間隔
W;將當前設置寫入~/.toprc文件中
Esc:退出編輯回到top主界面。