Linux進(jìn)程調(diào)度
為米東等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及米東網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、米東網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
1.調(diào)度方式
Linux系統(tǒng)的調(diào)度方式基本上采用“ 搶占式優(yōu)先級(jí) ”方式,當(dāng)進(jìn)程在用戶模式下運(yùn)行時(shí),不管它是否自愿,核心在一定條件下(如該進(jìn)程的時(shí)間片用完或等待I/O)可以暫時(shí)中止其運(yùn)行,而調(diào)度其他進(jìn)程運(yùn)行。一旦進(jìn)程切換到內(nèi)核模式下運(yùn)行時(shí),就不受以上限制,而一直運(yùn)行下去,僅在重新回到用戶模式之前才會(huì)發(fā)生進(jìn)程調(diào)度。
Linux系統(tǒng)中的調(diào)度基本上繼承了UNIX系統(tǒng)的 以優(yōu)先級(jí)為基礎(chǔ) 的調(diào)度。也就是說(shuō),核心為系統(tǒng)中每個(gè)進(jìn)程計(jì)算出一個(gè)優(yōu)先級(jí),該優(yōu)先級(jí)反映了一個(gè)進(jìn)程獲得CPU使用權(quán)的資格,即高優(yōu)先級(jí)的進(jìn)程優(yōu)先得到運(yùn)行。核心從進(jìn)程就緒隊(duì)列中挑選一個(gè)優(yōu)先級(jí)最高的進(jìn)程,為其分配一個(gè)CPU時(shí)間片,令其投入運(yùn)行。在運(yùn)行過(guò)程中,當(dāng)前進(jìn)程的優(yōu)先級(jí)隨時(shí)間遞減,這樣就實(shí)現(xiàn)了“負(fù)反饋”作用,即經(jīng)過(guò)一段時(shí)間之后,原來(lái)級(jí)別較低的進(jìn)程就相對(duì)“提升”了級(jí)別,從而有機(jī)會(huì)得到運(yùn)行。當(dāng)所有進(jìn)程的優(yōu)先級(jí)都變?yōu)?(最低)時(shí),就重新計(jì)算一次所有進(jìn)程的優(yōu)先級(jí)。
2.調(diào)度策略
Linux系統(tǒng)針對(duì)不同類別的進(jìn)程提供了3種不同的調(diào)度策略,即SCHED_FIFO、SCHED_RR及SCHED_OTHER。其中,SCHED_FIFO適合于 短實(shí)時(shí)進(jìn)程 ,它們對(duì)時(shí)間性要求比較強(qiáng),而每次運(yùn)行所需的時(shí)間比較短。一旦這種進(jìn)程被調(diào)度且開(kāi)始運(yùn)行,就一直運(yùn)行到自愿讓出CPU或被優(yōu)先級(jí)更高的進(jìn)程搶占其執(zhí)行權(quán)為止。
SCHED_RR對(duì)應(yīng)“時(shí)間片輪轉(zhuǎn)法”,適合于每次運(yùn)行需要 較長(zhǎng)時(shí)間的實(shí)時(shí)進(jìn)程 。一個(gè)運(yùn)行進(jìn)程分配一個(gè)時(shí)間片(200 ms),當(dāng)時(shí)間片用完后,CPU被另外進(jìn)程搶占,而該進(jìn)程被送回相同優(yōu)先級(jí)隊(duì)列的末尾,核心動(dòng)態(tài)調(diào)整用戶態(tài)進(jìn)程的優(yōu)先級(jí)。這樣,一個(gè)進(jìn)程從創(chuàng)建到完成任務(wù)后終止,需要經(jīng)歷多次反饋循環(huán)。當(dāng)進(jìn)程再次被調(diào)度運(yùn)行時(shí),它就從上次斷點(diǎn)處開(kāi)始繼續(xù)執(zhí)行。
SCHED_OTHER是傳統(tǒng)的UNIX調(diào)度策略,適合于交互式的 分時(shí)進(jìn)程 。這類進(jìn)程的優(yōu)先級(jí)取決于兩個(gè)因素:一個(gè)是進(jìn)程剩余時(shí)間配額,如果進(jìn)程用完了配給的時(shí)間,則相應(yīng)優(yōu)先級(jí)降到0;另一個(gè)是進(jìn)程的優(yōu)先數(shù)nice,這是從UNIX系統(tǒng)沿襲下來(lái)的方法,優(yōu)先數(shù)越小,其優(yōu)先級(jí)越高。nice的取值范圍是-20 19。用戶可以利用nice命令設(shè)定進(jìn)程的nice值。但一般用戶只能設(shè)定正值,從而主動(dòng)降低其優(yōu)先級(jí);只有特權(quán)用戶才能把nice的值設(shè)置為負(fù)數(shù)。進(jìn)程的優(yōu)先級(jí)就是以上二者之和。
后臺(tái)命令對(duì)應(yīng)后臺(tái)進(jìn)程(又稱后臺(tái)作業(yè))。后臺(tái)進(jìn)程的優(yōu)先級(jí)低于任何交互(前臺(tái))進(jìn)程的優(yōu)先級(jí)。所以,只有當(dāng)系統(tǒng)中當(dāng)前不存在可運(yùn)行的交互進(jìn)程時(shí),才調(diào)度后臺(tái)進(jìn)程運(yùn)行。后臺(tái)進(jìn)程往往按批處理方式調(diào)度運(yùn)行。
3.調(diào)度時(shí)機(jī)
核心進(jìn)行進(jìn)程調(diào)度的時(shí)機(jī)有以下5種情況:
(1)當(dāng)前進(jìn)程調(diào)用系統(tǒng)調(diào)用nanosleep( )或者pause( ),使自己進(jìn)入睡眠狀態(tài),主動(dòng)讓出一段時(shí)間的CPU的使用權(quán)。
(2)進(jìn)程終止,永久地放棄對(duì)CPU的使用。
(3)在時(shí)鐘中斷處理程序執(zhí)行過(guò)程中,發(fā)現(xiàn)當(dāng)前進(jìn)程連續(xù)運(yùn)行的時(shí)間過(guò)長(zhǎng)。
(4)當(dāng)喚醒一個(gè)睡眠進(jìn)程時(shí),發(fā)現(xiàn)被喚醒的進(jìn)程比當(dāng)前進(jìn)程更有資格運(yùn)行。
(5)一個(gè)進(jìn)程通過(guò)執(zhí)行系統(tǒng)調(diào)用來(lái)改變調(diào)度策略或者降低自身的優(yōu)先級(jí)(如nice命令),從而引起立即調(diào)度。
4.調(diào)度算法
進(jìn)程調(diào)度的算法應(yīng)該比較簡(jiǎn)單,以便減少頻繁調(diào)度時(shí)的系統(tǒng)開(kāi)銷。Linux執(zhí)行進(jìn)程調(diào)度時(shí),首先查找所有在就緒隊(duì)列中的進(jìn)程,從中選出優(yōu)先級(jí)最高且在內(nèi)存的一個(gè)進(jìn)程。如果隊(duì)列中有實(shí)時(shí)進(jìn)程,那么實(shí)時(shí)進(jìn)程將優(yōu)先運(yùn)行。如果最需要運(yùn)行的進(jìn)程不是當(dāng)前進(jìn)程,那么當(dāng)前進(jìn)程就被掛起,并且保存它的現(xiàn)場(chǎng)—— 所涉及的一切機(jī)器狀態(tài),包括程序計(jì)數(shù)器和CPU寄存器等,然后為選中的進(jìn)程恢復(fù)運(yùn)行現(xiàn)場(chǎng)。
(二)Linux常用調(diào)度命令
· nohup命令
nohup命令的功能是以忽略掛起和退出的方式執(zhí)行指定的命令。其命令格式是:
nohup command [arguments]
其中,command是所要執(zhí)行的命令,arguments是指定命令的參數(shù)。
nohup命令告訴系統(tǒng),command所代表的命令在執(zhí)行過(guò)程中不受任何結(jié)束運(yùn)行的信號(hào)(hangup和quit)的影響。例如,
$ nohup find / -name exam.txt -printf1
find命令在后臺(tái)運(yùn)行。在用戶注銷后,它會(huì)繼續(xù)運(yùn)行:從根目錄開(kāi)始,查找名字是exam.txt的文件,結(jié)果被定向到文件f1中。
如果用戶沒(méi)有對(duì)輸出進(jìn)行重定向,則輸出被附加到當(dāng)前目錄的nohup.out文件中。如果用戶在當(dāng)前目錄中不具備寫權(quán)限,則輸出被定向到$HOME/nohup.out 中。
· at命令
at命令允許指定命令執(zhí)行的時(shí)間。at命令的常用形式是:
at time command
其中,time是指定命令command在將來(lái)執(zhí)行時(shí)的時(shí)間和日期。時(shí)間的指定方法有多種,用戶可以使用絕對(duì)時(shí)間,也可以用相對(duì)時(shí)間。該指定命令將以作業(yè)形式在后臺(tái)運(yùn)行。例如:
$ at 15:00 Oct 20
回車后進(jìn)入接收方式,接著鍵入以下命令:
mail -s "Happy Birthday!" liuzheny
按下D鍵,屏幕顯示:
job 862960800.a at Wed Oct 20 15:00:00 CST 1999
$
表明建立了一個(gè)作業(yè),其作業(yè)ID號(hào)是862960800.a,運(yùn)行作業(yè)的時(shí)間是1999年10月20日下午3:00,給liuzheny發(fā)一條標(biāo)題為“Happy Birthday!”(生日快樂(lè))的空白郵件。
利用 at -l 可以列出當(dāng)前at隊(duì)列中所有的作業(yè)。
利用 at -r 可以刪除指定的作業(yè)。這些作業(yè)以前由at或batch命令調(diào)度。例如,
at -r 862960797.a
將刪除作業(yè)ID號(hào)是862960797.a的作業(yè)。其一般使用形式是:
at -r job_id
注意,結(jié)尾是.a的作業(yè)ID號(hào),表示這個(gè)作業(yè)是由at命令提交的;結(jié)尾是.b的作業(yè)ID號(hào),表示這個(gè)作業(yè)是由batch命令提交的。
· batch命令
batch命令不帶任何參數(shù),它提交的作業(yè)的優(yōu)先級(jí)比at命令提交的作業(yè)的優(yōu)先級(jí)低。batch無(wú)法指定作業(yè)運(yùn)行的時(shí)間。實(shí)際運(yùn)行時(shí)間要看系統(tǒng)中已經(jīng)提交的作業(yè)數(shù)量。如果系統(tǒng)中優(yōu)先級(jí)較高的作業(yè)比較多,那么,batch提交的作業(yè)則需要等待;如果系統(tǒng)空閑,則運(yùn)行batch提交的作業(yè)。例如,
$ batch
回車后進(jìn)入接收方式,接著鍵入命令:
find / -name exam.txt -print
按下D。退出接收方式,屏幕顯示:
job 862961540.b at Thu Nov 18 14:30:00 CST 1999
表示find命令被batch作為一個(gè)作業(yè)提交給系統(tǒng),作業(yè)ID號(hào)是862961540.b。如果系統(tǒng)當(dāng)前空閑,這個(gè)作業(yè)被立即執(zhí)行,其結(jié)果同樣作為郵件發(fā)送給用戶。
· jobs命令
jobs命令用來(lái)顯示當(dāng)前shell下正在運(yùn)行哪些作業(yè)(即后臺(tái)作業(yè))。例如:
$ jobs
[2] + Running tar tv3 *
[1] - Running find / -name README -print logfile
$
其中,第一列方括號(hào)中的數(shù)字表示作業(yè)序號(hào),它是由當(dāng)前運(yùn)行的shell分配的,而不是由操作系統(tǒng)統(tǒng)一分配的。在當(dāng)前shell環(huán)境下,第一個(gè)后臺(tái)作業(yè)的作業(yè)號(hào)為1,第二個(gè)作業(yè)的作業(yè)號(hào)為2,等等。
第二列中的“ ”號(hào)表示相應(yīng)作業(yè)的優(yōu)先級(jí)比“-”號(hào)對(duì)應(yīng)作業(yè)的優(yōu)先級(jí)高。
第三列表明作業(yè)狀態(tài),是否為運(yùn)行、中斷、等待輸入或停止等。
最后列出的是創(chuàng)建當(dāng)前這個(gè)作業(yè)所對(duì)應(yīng)的命令行。
利用 jobs -l 形式,可以在作業(yè)號(hào)后顯示出相應(yīng)進(jìn)程的PID。如果想只顯示相應(yīng)進(jìn)程的PID,不顯示其它信息,則使用 jobs -p 形式。
· fg命令
fg命令把指定的后臺(tái)作業(yè)移到前臺(tái)。其使用格式是:
fg [job…]
其中,參數(shù)job是一個(gè)或多個(gè)進(jìn)程的PID,或者是命令名稱或者作業(yè)號(hào)(前面要帶有一個(gè)“%”號(hào))。例如:
$ jobs
[2] + Running tar tv3 *
[1] - Running find / -name README -print logfile
$ fg %find
find / -name README -print logfile
注意,顯示的命令行末尾沒(méi)有“”符號(hào)。下面命令能產(chǎn)生同樣的效果:
$ fg %1
這樣,find命令對(duì)應(yīng)的進(jìn)程就在前臺(tái)執(zhí)行。當(dāng)后臺(tái)只有一個(gè)作業(yè)時(shí),鍵入不帶參數(shù)的fg命令,就能使相應(yīng)進(jìn)程移到前臺(tái)。當(dāng)有兩個(gè)或更多的后臺(tái)作業(yè)時(shí),鍵入不帶參數(shù)的fg,就把最后進(jìn)入后臺(tái)的進(jìn)程首先移到前臺(tái)。
· bg命令
bg命令可以把前臺(tái)進(jìn)程換到后臺(tái)執(zhí)行。其使用格式是:
bg [job…]
其中,job是一個(gè)或多個(gè)進(jìn)程的PID、命令名稱或者作業(yè)號(hào),在參數(shù)前要帶“%”號(hào)。例如,在cc(C編譯命令)命令執(zhí)行過(guò)程中,按下Z鍵,使這個(gè)作業(yè)掛起。然后鍵入以下命令:
$ bg %cc
該掛起的作業(yè)在后臺(tái)重新開(kāi)始執(zhí)行。
Linux技術(shù)的發(fā)展引起了很多企業(yè)和個(gè)人的關(guān)注。市場(chǎng)對(duì)Linux運(yùn)維的需求逐漸增加,學(xué)習(xí)Linux技術(shù)的人越來(lái)越多。在Linux運(yùn)維中,進(jìn)程是必須學(xué)習(xí)掌握的技能。那么Linux中如何啟動(dòng)進(jìn)程?常用的進(jìn)程調(diào)度命令有哪些?
執(zhí)行中的程序稱作進(jìn)程。當(dāng)程序的可執(zhí)行文件存儲(chǔ)在存儲(chǔ)器中并運(yùn)行時(shí),每個(gè)進(jìn)程將被動(dòng)態(tài)分配系統(tǒng)資源、內(nèi)存、安全屬性和相關(guān)狀態(tài)。多個(gè)進(jìn)程可以與同一個(gè)程序相關(guān)聯(lián),并在同一時(shí)間執(zhí)行,而不會(huì)相互干擾。操作系統(tǒng)將有效地管理和跟蹤所有正在運(yùn)行的進(jìn)程。
Linux中如何啟動(dòng)進(jìn)程?啟動(dòng)進(jìn)程的方法是什么?
手工啟動(dòng)。用戶在輸入端發(fā)出命令,直接啟動(dòng)進(jìn)程。分為前臺(tái)啟動(dòng)和后臺(tái)啟動(dòng)。前臺(tái)啟動(dòng):直接在SHELL中輸入命令進(jìn)行啟動(dòng)。后臺(tái)啟動(dòng):?jiǎn)?dòng)一個(gè)目前并不緊急的進(jìn)程。
調(diào)度啟動(dòng)。系統(tǒng)管理員根據(jù)系統(tǒng)資源和進(jìn)程占用資源的情況,事先進(jìn)行調(diào)度安排,指定任務(wù)運(yùn)行的時(shí)間和場(chǎng)合,到時(shí)候系統(tǒng)會(huì)自動(dòng)完成該任務(wù)。
常用的進(jìn)程調(diào)度命令有哪些?
常用的進(jìn)程調(diào)度命令有:at、batch、crontab。
以上便是關(guān)于“如何啟動(dòng)或終止進(jìn)程?常用的進(jìn)程調(diào)度命令有哪些?”的相關(guān)介紹。想要成為一名優(yōu)秀的Linux運(yùn)維工程師,需要掌握更多的Linux知識(shí)。
crond是Linux下用來(lái)周期性的執(zhí)行某種任務(wù)或等待處理某些事件的一個(gè)守護(hù)進(jìn)程,與windows下的計(jì)劃任務(wù)類似,在CentOS Linux release 7.2.1511中默認(rèn)是開(kāi)機(jī)啟動(dòng)的,大家可以使用命令:systemctl status crond進(jìn)行查看。 crond進(jìn)程定期(每分鐘)檢查是否有要執(zhí)行的任務(wù),如果有要執(zhí)行的任務(wù),則自動(dòng)執(zhí)行該任務(wù)。用戶在cron表
(也被稱為crontab文件)指定了定時(shí)任務(wù),crontab也就是我們常見(jiàn)的定時(shí)任務(wù)設(shè)置命令。Linux下的任務(wù)調(diào)度分為兩類,系統(tǒng)任務(wù)調(diào)度和用戶任務(wù)調(diào)度。
系統(tǒng)任務(wù)調(diào)度 :系統(tǒng)周期性所要執(zhí)行的工作,比如寫緩存數(shù)據(jù)到硬盤、日志清理等。/etc/crontab文件就是系統(tǒng)任務(wù)調(diào)度的配置文件。
用戶任務(wù)調(diào)度 :用戶定期要執(zhí)行的工作,比如用戶數(shù)據(jù)備份、定時(shí)郵件提醒等。用戶可以使用 crontab 工具來(lái)定制自己的計(jì)劃任務(wù)。所有用戶定義的crontab文件都被保存在/var/spool/cron目錄中。其文件名與用戶名一致,使用者權(quán)限文件如下:
通過(guò)以上幫助信息,我們可以知道crond是執(zhí)行任務(wù)計(jì)劃的一個(gè)守護(hù)進(jìn)程。在使用crontab之前我們可以根據(jù)幫助信息來(lái)設(shè)置相關(guān)選項(xiàng),一般情況下我們都使用默認(rèn)值。
1.建立演示賬號(hào)crontab。
2.星號(hào)(*)使用舉例。
以上例子中完整演示了crontab從建立到執(zhí)行的過(guò)程?!? 0 * * * echo "GeekDevOps"”表示在每天00:05執(zhí)行命令:echo "GeekDevOps"。后面的星號(hào)表示只要前面條件滿足都執(zhí)行。例子中的-u選項(xiàng)指定了用戶:crontab,-l選項(xiàng)列舉了相關(guān)用戶的用戶任務(wù)調(diào)度,不指定用戶則默認(rèn)為root。執(zhí)行結(jié)果默認(rèn)寫入到用戶mail目錄下的相關(guān)文件中。
3.逗號(hào)(,)的使用舉例。
現(xiàn)在我們已經(jīng)把用戶切換到crontab下,因此無(wú)需額外指定-u選項(xiàng)相關(guān)內(nèi)容?!? 2,6,8 * * *”表示每天的02:03:00、06:03:00、08:03:00分別執(zhí)行一次命令:ls /usr/local。
4.減號(hào)(-)的使用舉例。
例子中的“0 2-6 * * 6 df -h /”表示用戶crontab在每周六的02:00、03:00、04:00、05:00、06:00執(zhí)行命令:df -h / 。
5.斜杠(/)的使用舉例。
例子中表示每隔2分鐘執(zhí)行一次命令:echo "GeekDevOps"/root/GeekDevOps.txt。
6.crontab的使用非常簡(jiǎn)單,很容易理解,只要在取值范圍內(nèi)設(shè)置執(zhí)行的值基本是沒(méi)有問(wèn)題的?,F(xiàn)在我們要?jiǎng)h除已經(jīng)設(shè)置的這些定時(shí)任務(wù)。
例子中,選項(xiàng)-r表示刪除所有定時(shí)任務(wù)。選項(xiàng)-i表示在刪除前進(jìn)行再次確定,輸入y或者Y才能真正刪除。
7.備份我們?cè)O(shè)置的用戶任務(wù)調(diào)度配置文件。
8.系統(tǒng)任務(wù)調(diào)度的使用舉例。
系統(tǒng)任務(wù)調(diào)度與用戶任務(wù)調(diào)度不一樣,需要直接在/etc/crontab里面配置,如果需要指定用戶,還需要在執(zhí)行命令前指定用戶名。通過(guò)crontab -l 命令是查看不到系統(tǒng)任務(wù)調(diào)度任務(wù)的。
與crond不同的是,at任務(wù)調(diào)度是一次性的,而crond是重復(fù)性的
1.1 at命令是一次性定時(shí)計(jì)劃任務(wù),at的守護(hù)進(jìn)程atd會(huì)以后臺(tái)模式運(yùn)行,檢查作業(yè)隊(duì)列來(lái)運(yùn)行
1.2 默認(rèn)情況下,atd守護(hù)進(jìn)程每60s檢查作業(yè)隊(duì)列,有作業(yè)時(shí),會(huì)檢查作業(yè)運(yùn)行時(shí)間,如果時(shí)間與當(dāng)前時(shí)間匹配,則運(yùn)行此作業(yè)
1.3 at命令是一次性定時(shí)計(jì)劃任務(wù),執(zhí)行完一個(gè)任務(wù)后就不再執(zhí)行這個(gè)任務(wù)了
1.4 在使用at命令的時(shí)候,一定要保證atd進(jìn)程的啟動(dòng),可以使用相關(guān)指令查看
ps -ef | grep atd 可以檢查atd是否在運(yùn)行
at [選項(xiàng)] [時(shí)間]
按兩次 ctrl+d 結(jié)束at命令的輸入
4.1 當(dāng)天的hh:mm(小時(shí):分鐘),假如這個(gè)時(shí)間已經(jīng)過(guò)去,那么就第二天的這個(gè)時(shí)間執(zhí)行。例如04:00
4.2 模糊的詞語(yǔ),例如midnight、noon、teatime(下午茶時(shí)間,16:00左右)
4.3 采用12小時(shí)計(jì)時(shí)制,例如8am
4.4 指定執(zhí)行命令的具體日期,格式為month dat(月 日)或者mm/dd/yy或者dd.mm.yy,指定的日期必須跟著寫在在指定時(shí)間的后面,例如:04:00 2021-3-1就是2021年3月1日凌晨4點(diǎn)整執(zhí)行
4.5 相對(duì)計(jì)時(shí)法,指定格式為now + count time-units,now就是當(dāng)前時(shí)間,time-units是時(shí)間單位,可以是minutes、hours、days、weeks。count是時(shí)間的數(shù)量,例如:now + 5 minutes
4.6 直接用today、tomorrow來(lái)指定完成命令的時(shí)間
5.1 2天后的下午5點(diǎn),執(zhí)行/bin/ls /home指令
at 5pm + 2 days 按回車鍵
然后寫下那個(gè)時(shí)刻要執(zhí)行命令 /bin/ls /home
最后按兩次ctrl+d退出at指令
5.2 atq指令可以直接執(zhí)行,查看系統(tǒng)中待執(zhí)行的工作任務(wù)
5.3 明天17:00輸出時(shí)間到指定文件內(nèi) /root/date100.log
at 17:00 tomorrow 按回車鍵
date /root/date100.log
按兩次ctrl+d退出at指令的輸入
5.4 2分鐘后
at now + 2 minutes
5.5 刪除已經(jīng)設(shè)置的任務(wù),atrm 編號(hào)
可以用atq列出待執(zhí)行的任務(wù),列出后第一列就是job編號(hào)