七、Linux脚本进阶和进程管理
一、進(jìn)程
進(jìn)程:init(1)-->系統(tǒng)的第一個(gè)進(jìn)程,通過(guò)fork調(diào)用其他進(jìn)程,自身由內(nèi)核發(fā)起。
通過(guò)pstree可以查看進(jìn)程之間的父子關(guān)系。
[root@localhost?~]#?pstreeinit─┬─NetworkManager─┬─dhclient│????????????????└─{NetworkManager}├─abrtd├─acpid├─atd├─auditd───{auditd}├─crond├─cupsd├─dbus-daemon───{dbus-daemon}├─hald─┬─hald-runner─┬─hald-addon-acpi│??????│?????????????└─hald-addon-inpu│??????└─{hald}├─master─┬─pickup│????????└─qmgr├─6*[mingetty]├─modem-manager├─rsyslogd───3*[{rsyslogd}]├─sshd───sshd───bash───pstree├─tpvmlp├─udevd───2*[udevd]├─vmtoolsd───{vmtoolsd}├─vmware-vmblock-───4*[{vmware-vmblock}]└─wpa_supplicant1、進(jìn)程的分類
內(nèi)存地址空間分配使用情況說(shuō)明
1
進(jìn)程間通訊:IPC inter process communication
不同程序調(diào)用相同的庫(kù)文件,就需要進(jìn)程間通訊。
進(jìn)程分為兩類:
CPU-bound:CPU密集型進(jìn)程
IO-bound:IO密集型進(jìn)程
進(jìn)程按處理時(shí)間分:
批處理進(jìn)程
實(shí)時(shí)進(jìn)程
交互式進(jìn)程
2、進(jìn)程間工作原理
進(jìn)程切換
為什么要有進(jìn)程切換
因?yàn)橐粋€(gè)系統(tǒng)要提供多個(gè)進(jìn)程同時(shí)工作,也就是多任務(wù)的概念,那么每個(gè)程序可能由多個(gè)進(jìn)程組成,每個(gè)進(jìn)程又分配了優(yōu)先級(jí)和時(shí)間片,如果一個(gè)進(jìn)程時(shí)間片用完,就要給另一個(gè)進(jìn)程使用了,另一種情況是,一個(gè)進(jìn)程的工作需要調(diào)用另一個(gè)進(jìn)程來(lái)協(xié)助完成,再有就是被搶占。這三種方式都需要進(jìn)程切換。
如何實(shí)現(xiàn)進(jìn)程切換
進(jìn)程進(jìn)行切換前需要有現(xiàn)場(chǎng)保護(hù)的一個(gè)工作,對(duì)方進(jìn)程完畢切換回來(lái)還需要一個(gè)現(xiàn)場(chǎng)恢復(fù)的過(guò)程。
進(jìn)程如果需要切換到其他進(jìn)程上需要由內(nèi)核來(lái)完成,自己不能直接處理,這個(gè)時(shí)候就有了系統(tǒng)調(diào)用的概念,就是內(nèi)核幫助進(jìn)程完成某些工作,cpu的工作模式分為內(nèi)核模式(ring0)和用戶模式(ring3),內(nèi)核會(huì)依據(jù)級(jí)別來(lái)確定是工作在內(nèi)核模式上還是用戶模式上,所以說(shuō)有系統(tǒng)調(diào)用就必然有模式切換。
什么是模式切換?
就是在進(jìn)行系統(tǒng)調(diào)用的時(shí)候產(chǎn)生的對(duì)cpu工作模式的切換,帶內(nèi)核工作完成后再將工作還給進(jìn)程。
模式切換不是上下文切換,什么是上下文切換呢?
上下文切換是指一個(gè)進(jìn)程結(jié)束,執(zhí)行另一個(gè)進(jìn)程或者被搶奪的情況,稱為上下文切換。
3、IO操作
什么是io(輸入輸出)
一個(gè)系統(tǒng)的運(yùn)行,是要為人服務(wù)的,就是說(shuō)人可以進(jìn)行輸入操作,并通過(guò)輸出獲得結(jié)果,這個(gè)就是io操作。
系統(tǒng)如何識(shí)別io的操作
io操作有很多,可以是鍵盤輸入,批處理命令,遠(yuǎn)程操作等等,內(nèi)核如何識(shí)別這些操作,并準(zhǔn)確處理呢,
首先如何獲取io操作,早期是通過(guò)忙等待的方式,就是保留一個(gè)資源給io接口,等待它的操作指令,第二種是輪詢,定期查看io接口是否有輸入操作。第三種是中斷,就是當(dāng)有io操作時(shí)發(fā)送一個(gè)中斷信號(hào)給內(nèi)核,要求內(nèi)核處理,這里就可以知道io操作的優(yōu)先級(jí)還是比較高的。
4、優(yōu)先級(jí)
如何設(shè)置進(jìn)程的運(yùn)行等級(jí)?調(diào)度器!
? ? ? ? ?進(jìn)程優(yōu)先級(jí):
? ? ? ? ? ? ? ?動(dòng)態(tài)優(yōu)先級(jí)
? ? ? ? ? ? ? ?靜態(tài)優(yōu)先級(jí):100-139 數(shù)值越小優(yōu)先級(jí)越高
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?可以通過(guò)nice值來(lái)手動(dòng)調(diào)整,-20,19。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?普通用戶只可以調(diào)大數(shù)字,降低優(yōu)先級(jí)。
? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? 用法:nice -n # command
? ? ? ? ? ? ? ?實(shí)時(shí)優(yōu)先級(jí):調(diào)度實(shí)時(shí)進(jìn)程,1-99 數(shù)值越大優(yōu)先級(jí)越高
5、進(jìn)程的狀態(tài)
ready、running、sleeping、stopped,zombie(僵死狀態(tài))
多cpu如何應(yīng)用?
一個(gè)程序要運(yùn)行,(只)開(kāi)啟一個(gè)進(jìn)程的,通常一個(gè)程序是只有一個(gè)數(shù)據(jù)流的(按照程序編寫的順序自上向下執(zhí)行),并只會(huì)占用一個(gè)cpu的內(nèi)核,當(dāng)有多個(gè)cpu同時(shí)工作的情況,如何利用cpu的優(yōu)勢(shì)呢,通常有兩種情況:1、將多個(gè)進(jìn)程分配到多個(gè)cpu內(nèi)核上,每個(gè)內(nèi)核就分配到了一定數(shù)量的進(jìn)程,達(dá)到了合理分配資源的目的。2、如果只有一個(gè)程序占用大量的資源,要給他分配多個(gè)cpu內(nèi)核如何操作呢,就是需要程序在編寫的時(shí)候,允許多個(gè)數(shù)據(jù)流同時(shí)進(jìn)行,這樣在程序創(chuàng)建進(jìn)程的時(shí)候,就可以在一個(gè)進(jìn)程中創(chuàng)建多個(gè)線程,每個(gè)線程就是一個(gè)數(shù)據(jù)流。linux對(duì)線程的支持并不是很好,表現(xiàn)的最終形式就是輕量級(jí)進(jìn)程,最終體現(xiàn)的還是“進(jìn)程”哦。
基于線程的訪問(wèn)優(yōu)勢(shì)就是它是進(jìn)程的子集,所有在訪問(wèn)重復(fù)資源的時(shí)候,不需要重復(fù)范圍,可以通過(guò)其他線程上訪問(wèn),更加快捷,非常適用于web服務(wù)。
二、進(jìn)程管理
進(jìn)程管理類的命令:
pstree、ps、top、vmstat、htop
1、pstree:查看進(jìn)程樹
[root@localhost ~]# pstree
init─┬─NetworkManager
?? ? ├─abrtd
?? ? ├─acpid
?? ? ├─atd
?? ? ├─auditd───{auditd}
?? ? ├─automount───4*[{automount}]
?? ? ├─bluetoothd
?? ? ├─certmonger
?? ? ├─console-kit-dae───63*[{console-kit-da}]
2、PS詳解
ps:顯示當(dāng)前進(jìn)程狀態(tài)的命令;靜態(tài)顯示。
[root@localhost ~]# ps -efH
UID ? ? ? ? PID ? PPID? C STIME TTY? ? ? ? ? TIME CMD
root? ? ? ? ? 1? ? ? 0? 0 May15 ?? ? ? ? 00:00:01 /sbin/init
root? ? ? ? 575? ? ? 1? 0 May15 ?? ? ? ? 00:00:00 ? /sbin/udevd -d
root ? ? ? 2121? ? 575? 0 May15 ?? ? ? ? 00:00:00 ? ? /sbin/udevd -d
root ? ? ? 2122? ? 575? 0 May15 ?? ? ? ? 00:00:00 ? ? /sbin/udevd -d
root ? ? ? 1535? ? ? 1? 0 May15 ?? ? ? ? 00:00:00 ? auditd
root ? ? ? 1569? ? ? 1? 0 May15 ?? ? ? ? 00:00:00 ? /sbin/rsyslogd -i /var/run/s
rpc? ? ? ? 1620? ? ? 1? 0 May15 ?? ? ? ? 00:00:00 ? rpcbind
常用參數(shù):
-a所有和終端相關(guān)的進(jìn)程 ? ?
-x所有和終端無(wú)關(guān)的進(jìn)程,用?來(lái)表示和終端無(wú)關(guān)
-u以用戶為中心顯示進(jìn)程
-e:顯示所有進(jìn)程
-f:完整格式列表
? ? ? ??? ? ppid:父進(jìn)程號(hào)
-F:顯示額外信息
? ? ? ? ? ? psr:表示運(yùn)行在那顆cpu上
-H:顯示進(jìn)程間的父子關(guān)系
-o:自定義顯示格式
進(jìn)程條目:
? ? ? ? stat:
? ? ? ? ? ? ? ? ? ?S:可中斷睡眠狀態(tài),
? ? ? ? ? ? ? ? ? ?D:不可中斷的睡眠。
? ? ? ? ? ? ? ? ? ?R:運(yùn)行或可運(yùn)行
? ? ? ? ? ? ? ? ? ?T:停止
? ? ? ? ? ? ? ? ? ?Z:僵死
? ? ? ? ? ? ? ? ? ?s:session leader 一個(gè)進(jìn)程的主要進(jìn)程
? ? ? ? ? ? ? ? ? ?l:多線程進(jìn)程
? ? ? ? ? ? ? ? ? ?+:前臺(tái)進(jìn)程
? ? ? ? ? ? ? ? ? ?N:低優(yōu)先級(jí)進(jìn)程
? ? ? ? ? ? ? ? ? ?<:高優(yōu)先級(jí)進(jìn)程
time:運(yùn)行時(shí)長(zhǎng)
command:進(jìn)程發(fā)起者,命令
vsz:線性地址空間大小,非實(shí)際占用大小
rss:實(shí)際占用空間大小
%cpu:進(jìn)程占用cpu時(shí)間比
paid:父進(jìn)程號(hào)碼
stime:第一次啟動(dòng)時(shí)間
time:運(yùn)行時(shí)長(zhǎng)
PSR:表示運(yùn)行在多cpu的那個(gè)cpu內(nèi)核上
u:以用戶為中心顯示進(jìn)程的相關(guān)信息
TTY:
??控制臺(tái):/dev/console
??虛擬終端:/dev/tty1-6,
??模擬終端:遠(yuǎn)程連接的終端 /dev/pts/0
??串行終端:/dev/ttys
ps命令詳解:http://www.cnblogs.com/wangkangluo1/archive/2011/09/23/2185938.html
3、pgrep詳解
?顯示指定的進(jìn)程信息。
? ?-U:username 顯示相關(guān)用戶的進(jìn)程
? ?-G:groupname 顯示組的進(jìn)程
? ?-l:查看指定程序或進(jìn)程的進(jìn)程號(hào)
[root@localhost ~]# pgrep -U root
1
2
3
4
5
4、pidof
顯示某進(jìn)程的進(jìn)程號(hào)
[root@localhost ~]# pidof sshd
5449 1878
5、top詳解
[root@localhost ~]# top
top - 01:18:07 up 19:56,? 2 users,? load average: 0.00, 0.00, 0.00
Tasks:? 99 total, ? 1 running,? 98 sleeping, ? 0 stopped, ? 0 zombie
Cpu(s):? 0.0%us,? 0.0%sy,? 0.0%ni,100.0%id,? 0.0%wa,? 0.0%hi,? 0.0%si,? 0.0%st
Mem: ? 1004768k total, ? 230948k used, ? 773820k free,? ? 33972k buffers
Swap:? 2031612k total,? ? ? ? 0k used,? 2031612k free,? ? 69424k cached
?? PID USER? ? ? PR? NI? VIRT? RES? SHR S %CPU %MEM? ? TIME+? COMMAND ? ? ? ? ?
?? ? 1 root? ? ? 20 ? 0 19364 1540 1228 S? 0.0? 0.2 ? 0:01.32 init ? ? ? ? ? ? ?
?? ? 2 root? ? ? 20 ? 0 ? ? 0? ? 0? ? 0 S? 0.0? 0.0 ? 0:00.00 kthreadd ? ? ? ? ?
?? ? 3 root? ? ? RT ? 0 ? ? 0? ? 0? ? 0 S? 0.0? 0.0 ? 0:00.00 migration/0? ? ?
條目詳解
load average:每隔5/10/15分鐘的隊(duì)列長(zhǎng)度。一般是一個(gè)小數(shù)
cpu:us:用戶空間程序占用%
? ? ? ? ? sy:內(nèi)核空間程序占用%,她與us的合理比例是7:3,就是us占70%,sy占30%
? ? ? ? ? ni:調(diào)整nice值
? ? ? ? ? id:cpu空閑%
? ? ? ? ? wa:(wait)等待磁盤io完成輸入輸出工作所占據(jù)的時(shí)間比例
? ? ? ? ? hi:硬件中斷占據(jù)的百分比
? ? ? ? ? si:軟中斷占據(jù)的百分比
? ? ? ? ? st:被偷走的時(shí)間,虛擬機(jī)占用運(yùn)行的時(shí)間
PR:優(yōu)先級(jí) priority
NI:nice值
virt:虛擬內(nèi)存級(jí)
res:實(shí)際內(nèi)存級(jí)
shar:共享內(nèi)存優(yōu)先級(jí)
s:狀態(tài)stats
%cpu:自從上次刷新到現(xiàn)在cpu被此進(jìn)程占用的百分比。
選項(xiàng)和參數(shù):
top是交互式命令,通過(guò)輸入不同的字母顯示不同的信息,實(shí)際上就是條目的第一個(gè)縮寫,比如
M:按內(nèi)存空間占用大小排序
P:按cpu時(shí)間占用大小排序
T:按累計(jì)時(shí)間排序
k:殺死一個(gè)進(jìn)程,輸入后需要制定kill 后面的選項(xiàng)1-15,常用是9 強(qiáng)制殺死。
m、p、l用于是否顯示抬頭的相關(guān)信息。
q:退出
-d #:刷新時(shí)間
-b:批次顯示
-n #:指定批次顯示的次數(shù)
6、vmstat
查看服務(wù)器cpu使用情況,內(nèi)存、虛擬內(nèi)存使用情況和磁盤讀寫情況。
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
?r? b ? swpd ? free ? buff? cache ? si ? so? ? bi? ? bo ? in ? cs us sy id wa st
?0? 0? ? ? 0 164752 1484028 449036? ? 0? ? 0 ? ? 0 ? 138 ? 10 ? 18? 0? 0 100? 0? 0
[root@localhost ~]# vmstat
procs:
r:運(yùn)行或等待cpu時(shí)間片的進(jìn)程的個(gè)數(shù)
b:被阻塞的進(jìn)程隊(duì)列的長(zhǎng)度
memory:
swpd?虛擬內(nèi)存(swap)已使用的大小,如果大于0,表示你的機(jī)器物理內(nèi)存不足了,如果不是程序內(nèi)存泄露的原因,那么你該升級(jí)內(nèi)存了或者把耗內(nèi)存的任務(wù)遷移到其他機(jī)器。
free?? 空閑的物理內(nèi)存的大小,我的機(jī)器內(nèi)存總共8G,剩余3415M。
buff?? Linux/Unix系統(tǒng)是用來(lái)存儲(chǔ),目錄里面有什么內(nèi)容,權(quán)限等的緩存,我本機(jī)大概占用300多m
cache?cache直接用來(lái)記憶我們打開(kāi)的文件,給文件做緩沖,我本機(jī)大概占用300多M(這里是Linux/Unix的聰明之處,把空閑的物理內(nèi)存的一部分拿來(lái)做文件和目錄的緩存,是為了提高 程序執(zhí)行的性能,當(dāng)程序使用內(nèi)存時(shí),buffer/cached會(huì)很快地被使用。)
si??每秒從磁盤讀入(放到swap中的數(shù)據(jù)量)虛擬內(nèi)存的大小,如果這個(gè)值大于0,表示物理內(nèi)存不夠用或者內(nèi)存泄露了,要查找耗內(nèi)存進(jìn)程解決掉。我的機(jī)器內(nèi)存充裕,一切正常。
so??每秒虛擬內(nèi)存寫入磁盤的大小(從swap中讀取的數(shù)據(jù)量),如果這個(gè)值大于0,同上。
bi??塊設(shè)備(磁盤)每秒接收的塊數(shù)量,這里的塊設(shè)備是指系統(tǒng)上所有的磁盤和其他塊設(shè)備,默認(rèn)塊大小是1024byte,我本機(jī)上沒(méi)什么IO操作,所以一直是0,但是我曾在處理拷貝大量數(shù)據(jù)(2-3T)的機(jī)器上看過(guò)可以達(dá)到140000/s,磁盤寫入速度差不多140M每秒
bo?塊設(shè)備每秒發(fā)送的塊數(shù)量,例如我們讀取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO過(guò)于頻繁,需要調(diào)整。
in?每秒CPU的中斷次數(shù),包括時(shí)間中斷
cs?每秒上下文切換次數(shù),例如我們調(diào)用系統(tǒng)函數(shù),就要進(jìn)行上下文切換,線程的切換,也要進(jìn)程上下文切換,這個(gè)值要越小越好,太大了,要考慮調(diào)低線程或者進(jìn)程的數(shù)目,例如在apache和nginx這種web服務(wù)器中,我們一般做性能測(cè)試時(shí)會(huì)進(jìn)行幾千并發(fā)甚至幾萬(wàn)并發(fā)的測(cè)試,選擇web服務(wù)器的進(jìn)程可以由進(jìn)程或者線程的峰值一直下調(diào),壓測(cè),直到cs到一個(gè)比較小的值,這個(gè)進(jìn)程和線程數(shù)就是比較合適的值了。系統(tǒng)調(diào)用也是,每次調(diào)用系統(tǒng)函數(shù),我們的代碼就會(huì)進(jìn)入內(nèi)核空間,導(dǎo)致上下文切換,這個(gè)是很耗資源,也要盡量避免頻繁調(diào)用系統(tǒng)函數(shù)。上下文切換次數(shù)過(guò)多表示你的CPU大部分浪費(fèi)在上下文切換,導(dǎo)致CPU干正經(jīng)事的時(shí)間少了,CPU沒(méi)有充分利用,是不可取的。
us?用戶進(jìn)程占用CPU時(shí)間的百分比,我曾經(jīng)在一個(gè)做加密解密很頻繁的服務(wù)器上,可以看到us接近100,r運(yùn)行隊(duì)列達(dá)到80(機(jī)器在做壓力測(cè)試,性能表現(xiàn)不佳)。
sy?系統(tǒng)進(jìn)程占用CPU時(shí)間的百分比,如果太高,表示系統(tǒng)調(diào)用時(shí)間長(zhǎng),例如是IO操作頻繁。
id??空閑 CPU時(shí)間,一般來(lái)說(shuō),id + us + sy = 100,一般我認(rèn)為id是空閑CPU使用率,us是用戶CPU使用率,sy是系統(tǒng)CPU使用率。
wt?cpu等待IO完成的時(shí)間。
st:被虛擬化偷走的時(shí)間
選項(xiàng):
vmstat delay count:設(shè)置vmstat顯示的刷新的時(shí)間間隔和顯示次數(shù) vmstat 2 2
[root@localhost ~]# vmstat 2 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
?r? b ? swpd ? free ? buff? cache ? si ? so? ? bi? ? bo ? in ? cs us sy id wa st
?0? 0? ? ? 0 164612 1484036 449036? ? 0? ? 0 ? ? 0 ? 138 ? 10 ? 18? 0? 0 100? 0? 0
?0? 0? ? ? 0 164612 1484036 449036? ? 0? ? 0 ? ? 0 ? ? 0 ? 71 ? 78? 0? 0 100? 0? 0
每個(gè)兩秒顯示一次,一共顯示兩次。
7、sar (system activity reporter)
用來(lái)收集、顯示保存系統(tǒng)活動(dòng)信息及報(bào)告。
-u:
-P:指定顯示cpu的信息
linux sar命令詳解
8、iostat:顯示系統(tǒng)性能相關(guān)信息,硬盤讀寫情況。
[root@localhost ~]# iostat
Linux 4.6.0 (localhost.localdomain)?2016年05月18日?_x86_64_(1 CPU)
avg-cpu:? %user ? %nice %system %iowait? %steal ? %idle
?? ? ? ? ? 0.03? ? 0.00? ? 0.14? ? 0.02? ? 0.00 ? 99.81
Device:? ? ? ? ? ? tps ? Blk_read/s ? Blk_wrtn/s ? Blk_read ? Blk_wrtn
sda ? ? ? ? ? ? ? 1.75? ? ? ? 25.03 ? ? ? ? 2.41 ? ? 592778? ? ? 57170
dm-0? ? ? ? ? ? ? 1.82? ? ? ? 24.63 ? ? ? ? 2.41 ? ? 583402? ? ? 57152
dm-1? ? ? ? ? ? ? 0.01 ? ? ? ? 0.11 ? ? ? ? 0.00 ? ? ? 2600? ? ? ? ? 0
9、dstat -c 顯示cpu詳細(xì) 實(shí)時(shí)顯示
[root@localhost ~]# dstat
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usrsysidlwaihiqsiq|?read??writ|?recv??send|? in???out?|?int???csw?
? 0 ? 0?100?? 0 ? 0 ? 0|? 15k?1602B|?? 0 ? ? 0?|?? 0 ? ? 0?|?103???127?
? 0 ? 0?100?? 0 ? 0 ? 0|?? 0??? 28k|2067B?1234B|?? 0 ? ? 0?|?101??? 97?
? 0 ? 0?100?? 0 ? 0 ? 0|?? 0 ? ? 0?|1612B??452B|?? 0 ? ? 0?|? 80??? 79?
三、信號(hào)
引用信號(hào)的方法:通過(guò)數(shù)字、信號(hào)名、簡(jiǎn)寫。
顯示信號(hào):kill -l
常用信號(hào):
1:sighup:進(jìn)程不用終止,而可以重讀配置文件。對(duì)于在線服務(wù)可以使用。
2:sigint:中斷正在運(yùn)行的進(jìn)程,相當(dāng)于ctrl+c
9:sigkill:殺死一個(gè)進(jìn)程
15:sigterm:終止進(jìn)程,容許進(jìn)程可以完成當(dāng)前工作。
19:sigstop:停止
18:sig
命令:
1、kill -信號(hào) pid
[root@localhost ~]# kill -9 9761
[root@localhost ~]# kill -sigkill 2119
2、killall -信號(hào) 進(jìn)程名
kill是按照pid進(jìn)行查找并按照信號(hào)要求做相應(yīng)的處理,而killall是按照進(jìn)程名進(jìn)行查找并處理相關(guān)進(jìn)程。
3、killall5 -信號(hào)?
對(duì)所有相關(guān)進(jìn)程有效
4、調(diào)整進(jìn)程nice值
nice -n # command ?默認(rèn)優(yōu)先級(jí)是120
renice # pid 對(duì)正在運(yùn)行的進(jìn)程調(diào)整其nice數(shù)值
5、作業(yè)控制
前臺(tái)送往后臺(tái)可以使用ctrl+z,但屬于停止?fàn)顟B(tài),后臺(tái)調(diào)到前臺(tái)使用fg %作業(yè)號(hào)碼
+:下一次后臺(tái)要運(yùn)行的作業(yè)
-:是在+作業(yè)運(yùn)行完再運(yùn)行的作業(yè)。
bg %作業(yè)號(hào)碼 :讓其在后臺(tái)運(yùn)行。
啟動(dòng)時(shí),讓作業(yè)直接在后臺(tái)運(yùn)行:command &
用戶退出后繼續(xù)運(yùn)行作業(yè):nohup command &
終止作業(yè):
kill %作業(yè)號(hào)碼
如果一個(gè)程序會(huì)產(chǎn)生多個(gè)進(jìn)程,那么快速殺死多個(gè)進(jìn)程的方法:
? ? 1、killall,必須給出完整的進(jìn)程名。
[root@node3.dtedu.com ~]# killall ha_logd
? ? 2、pkill,簡(jiǎn)單給出進(jìn)程名就可以,名稱可以不完整。
[root@node3.dtedu.com ~]# pkill -9 heartbeat
[root@node3.dtedu.com ~]# /sbin/service: line 66:? 2291 Killed? ? ? ? ? ? ? ? ? env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
[1]+? Exit 137? ? ? ? ? ? ? ? service heartbeat stop
? ? 3、正則表達(dá)式殺死多進(jìn)程。
[root@node3.dtedu.com ~]# kill -9 `pgrep crond`
5.1screen
當(dāng)我們?cè)谶\(yùn)行一個(gè)程序需要很長(zhǎng)時(shí)間的時(shí)候,可以使用screen,它的特點(diǎn)是用戶退出后程序繼續(xù)運(yùn)行,并且可以切換到原來(lái)窗口中再次查看運(yùn)行情況。
這里說(shuō)一下detach(分離、斷開(kāi)),表示用戶離開(kāi)當(dāng)前shell窗口,并將其放到后臺(tái)繼續(xù)執(zhí)行。并通過(guò)screen -r重新登錄(attach,附件、連接物)繼續(xù)后面的操作。
下面實(shí)例終端中的
創(chuàng)建一個(gè)新的shell窗口,建議取一個(gè)名字,8506是進(jìn)程號(hào),可以通過(guò)kill殺死它。也可以使用簡(jiǎn)便方法直接在screen后面跟shell命令,比如:screen -r test vi ./gongbing.txt
[root@localhost ~]# screen -ls
There are screens on:
8334.pts-0.localhost(Detached)
8506.gong(Detached)#從shell窗口分離出來(lái)了,可以重新登錄。
8580.cpfrom56(Attached)#表示此shell窗口并沒(méi)有被分離出來(lái),使用 screen -d 8506解決。
3 Sockets in /var/run/screen/S-root.
[root@localhost ~]# screen -S cpfrom56創(chuàng)建一個(gè)新的shell窗口
[root@localhost ~]# ps -axu |grep 8506
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root ? ? ? 8506? 0.0? 0.1 118776? 1556 ?? ? ? ? Ss ? 16:38 ? 0:00 SCREEN -S gong
查看運(yùn)行中的screen程序screen-ls
BingGongtekiMacBook-Pro:~ binggong$ screen -ls
There is a screen on:
1396.ttys000.BingGongtekiMacBook-Pro(Detached)
1 Socket in /var/folders/dw/wp5cbg3j121_1lvp89533qlr0000gn/T/.screen.
進(jìn)入某一個(gè)screen程序screen-rid
BingGongtekiMacBook-Pro:~ binggong$ screen -r 1396
[screen is terminating]
一個(gè)shell窗口中創(chuàng)建多個(gè)窗口可以使用ctrl+a+n的方法,切換窗口使用ctrl+a+p,從當(dāng)前子shell中分離出來(lái)ctrl+a+d。
任務(wù)完成,退出操作,exit。
shell窗口屏幕共享給其他用戶,其他用戶遠(yuǎn)程登錄服務(wù)器后通過(guò)screen -ls查看想要共享的shell窗口,通過(guò)screen -x pid來(lái)實(shí)現(xiàn)共享同一個(gè)shell窗口,方便做演示使用。
screen命令詳解:http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html
轉(zhuǎn)載于:https://blog.51cto.com/137783/1916974
總結(jié)
以上是生活随笔為你收集整理的七、Linux脚本进阶和进程管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为部署ASP.NET Core准备:使用
- 下一篇: 最快捷地开始git