腳本運行控制

Linux經過信號在運行在系統的進程之間通訊,用信號來中止啓動及無條件終止進程。一樣也能夠用信號來控制shell腳本的運行。linux

1.Linux系統信號

Linux系統和應用程序能夠生成30多個信號,最多見的有:shell

信號 描述
1 SIHUP 掛起進程
2 SIGINT 終止進程
3 SIGQUIT 中止進程
9 SIGKILL 無條件終止進程
15 SIGTERM 可能的話終止進程
17 SIGSTOP 無條件中止,但不是終止進程
18 SIGTSTP 中止或暫停,但不終止
19 SIGCONT 繼續運行中止的進程

bash shell 會忽略信號3和15,會處理1和2.c#

1.1產生信號

bash shell 容許鍵盤上的組合生成兩種基本linux信號:bash

Ctrl+C會生成SIGINT信號——終止進程網絡

Ctrl+Z會生成SIGTSTP信號——暫停進程app

注:shell中每一個運行的進程稱爲做業,每一個做業有惟一的做業號,shell會給第一個做業分配做業號1,第二個2,以此類推。ide

1.2捕捉信號trap

trap能夠捕獲Linux的信號,並從shell中攔截。oop

trap命令格式:trap command signals  其中command是捕獲信號後想要執行的命令,singals是一組用空格分開的信號,能夠用數值或信號名來指定。url

eg:trap 「echo 'Sorry! I have trapped Ctrl+C'" SIGINT SIGTERM       注:雙引號必須有,不然沒法執行命令。spa

也能夠捕獲腳本的退出:trap 」echo finish「 EXIT   當退出腳本時就會輸出finish。

移除捕獲:trap -EXIT  ,一但信號捕獲被移除,腳本會忽略該信號。

2.後臺運行腳本——./shell.sh &

2.1簡單後臺模式,腳本輸出在顯示器,後臺進程都綁定到了終端會話上

在後臺模式中,進程運行時不會和終端會話上的STDIN  STDOUT  STDERR關聯。

要在後臺運行腳本,只需在命令後加個&.

$./shell_filename & 
[1]  1968
.....
腳本的輸出
.....

[1]+ done ./shell_filename

顯示的第一行是 [1] 1968  方括號中是進程的做業號,以後是進程ID (PID)。

當後臺程序運行結束時,會再終端顯示一條命令  [1]+ done ./shell_filename

注:當後臺進程仍在運行時,它仍會使用終端顯示器來顯示STDOUT和STDERR。當退出終端時,後臺進程也結束運行。

2.2非控制檯下運行腳本

nohup命令   實現進程一直後臺運行,知道進程結束,即便關閉終端,進程也不會中止。

$ nohup ./shell_filename &
[1] 19832
$ nohup: ignoring input and appending output to 'nohup.out'

nohup將進程輸出的消息重定向到 nohup.out文件中。若再用nohup命令運行另外一個進程,則輸出會追加到統一nohup.out文件中。

3.做業控制

3.1查看做業——jobs命令

jobs命令容許查看shell當前正在處理的做業,jobs 命令參數:

參數 描述
-l 列出進程的PID及做業號
-n 只列出上次shell發出的通知後改變了狀態的做業(new做業)
-p 只列出做業的PID
-r 只列出運行中的做業
-s 只列出已中止的做業
caishu@lab403-1F:~/scripts$ cat sh1.sh
#!/bin/bash
#testing job control
echo "This is a test program $$"       #使用 $$ 顯示 PID
count=1
while [ $count -le 10 ]
do 
  echo "Loop #$count"
  sleep 5
  count=$[ $count + 1 ]
done
echo "This is the end of the test program"

caishu@lab403-1F:~/scripts$ ./sh1.sh
This is a test program 12292
Loop #1
Loop #2
^Z
[1]+  已中止               ./sh1.sh
caishu@lab403-1F:~/scripts$ ./sh1.sh
This is a test program 13629
Loop #1
^Z
[2]+  已中止               ./sh1.sh
caishu@lab403-1F:~/scripts$ ./sh1.sh >sh1.out
^Z
[3]+  已中止               ./sh1.sh > sh1.out
caishu@lab403-1F:~/scripts$ jobs -l         #jobs命令使用顯示正在運行或中止的進程
[1]  12292 中止                  ./sh1.sh
[2]- 13629 中止                  ./sh1.sh
[3]+ 17736 中止                  ./sh1.sh > sh1.out
caishu@lab403-1F:~/scripts$ kill -9 17736
caishu@lab403-1F:~/scripts$ jobs -l
[1]- 12292 中止                  ./sh1.sh
[2]+ 13629 中止                  ./sh1.sh

注意:jobs命令輸出中的做業帶有+和 -   ;帶+號的是默認做業(是最後啓動的那個進程),帶 - 的做業是下一個默認做業,當帶+的做業完成後,帶-的做業會變成+;任什麼時候候都只有一個帶+的做業,和一個帶- 的做業。

3.2重啓中止的做業 bg  fg

bg 數字 ——之後臺模式重啓一個做業,如bg 2,重啓第二個做業

 fg 數字 ——之前臺模式重啓一個做業,如fg 2,重啓第二個做業

3.3 程序的謙讓度(優先級)

默認狀況下,從shell啓動的全部進程在linux系統上都有一樣的調度優先級0。調度優先級是個整數,從-20(高)到+20(低)  

nice -n 數字 進程     ——能夠改變優先級       普通用戶只讓進程優先級能變的更低,不能變高

renice  數字  -p  PID   ——改變已運行命令的優先級

限制:只能對本身的進程執行renice;只能經過renice下降優先級;root用戶可調整任何進程的任何優先級。

4.定時運行腳本

4.1用at命令來計劃執行做業

at命令容許指定Linux系統什麼時候運行腳本。at命令會將做業提交到隊列中,at的守護進程atd會之後臺模式運行,並檢查做業隊列來運行做業。 atd守護進程每隔60s會檢查/var/spool/at目錄,獲取at提交的做業,若是做業設置的是時間跟當前時間匹配,則運行此做業。

at命令格式:

at [ -f filename ] time

time設置:1)標準的小時和分鐘格式,10:15  ;  2)~AM/~PM指示符, 10:15~PM   ;     3)特定可命名的時間,now 、noon、midnight、teatime  ; 4)標準日期格式 ,MMDDYY、MM/DD/YY、DD.MM.YY  ; 5)文本日期,Jul 4或 May 5   6)時間增量,當前時間+25min、明天10:15~PM、10:15+7天

at命令會針對不一樣的優先級將命令存於a~z26中不一樣的做業隊列中。能夠用-q參數指定隊列

4.2 做業的輸出

  Linux系統會將提交改做業的用戶的E-mail地址做爲STDOUT和STDERR ,輸出經過郵件系統發送給用戶,用戶能夠用mail命令查看。

atq 命令能夠列出等待的做業

caishu@lab403-1F:~/scripts$  atq
61   Mon Oct 18 15:29:00  2015  a  user
做業號    時間                   隊列  用戶

atrm   做業號   ——命令刪除做業   如:atrm 61  刪除61號做業

4.3計劃按期執行腳本cron 

Linux程序使用cron程序來計劃要按期執行的做業,cron程序在後臺運行並檢查cron table,來得到計劃執行的做業。

1)cron時間表

時間表格式:min hour dayofmonth  month  dayofweek  command

例如: 15:10 * * * /home/caishu/scripts/sh1.sh >sh1.out    天天10:15執行sh1.sh

dayofmonth每個月幾號執行;特殊的每個月最後一天能夠用if then和date判斷

00 12 * * * if [ `date +%d -d tomorrow` = 01 ] ; then; command

dayofweek每週幾,能夠是(mon、tue、wed、thu、fri、sat、sun)也能夠(一、二、三、四、五、六、0)

2)構建cron時間表——crontab 命令

每一個系統用戶均可以用本身的cron時間表來運行計劃好的任務。

crontab -l  列出已有的cron時間表,默認狀況下不存在。能夠用crontab -e命令建立本身的時間表。

3)cron目錄  /etc/cron.*ly

當建立的腳本不要求有精確的執行時間時,用系統預配置的cron腳本目錄更方便。只要把腳本放到相應的目錄內,cron就會按時執行它

/etc/cron.daily    /etc/cron.hourly    /etc/cron.monthly    /etc/cron.weekly

4)anacron程序    (不會處理運行時間少於一天的腳本)

若是cron時間表中的做業在計劃時間未獲得運行(由於系統關機等緣由),當系統開機時cron不會去運行此做業,anacron程序會盡快運行錯過的做業。(用於日誌維護的腳本)

anacron只會處理位於cron目錄的程序,好比/etc/cron.daily   。它用時間戳來決定做業是否在適當的計劃間隔內運行了。每一個cron目錄都有個時間戳文件,位於/var/spool/anacron目錄。anacron程序有本身用來檢查做業目錄的表,位於/etc/anacrontab

root@lab403-1F:/etc# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

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

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root

# These replace cron's entries
1	5	cron.daily	run-parts --report /etc/cron.daily
7	10	cron.weekly	run-parts --report /etc/cron.weekly
@monthly	15	cron.monthly	run-parts --report /etc/cron.monthly
root@lab403-1F:/etc#

anacron時間表的基本格式爲:period  delay  identifier  command                                     period定義了做業多久運行一次,單位是天;delay指定系統啓動多少分鐘後anacron程序開始運行錯過的腳本。command包含了一個run_parts程序和一個cron腳本目錄名。run_parts程序負責運行目錄中傳給它的任何腳本。identifier 是一種特別的非空白字符串,如cron-weekly,用於惟一識別日誌消息和錯誤E-mail中的做業。

5.系統啓動時運行腳本

5.1 Linux開機過程

開始Linux系統時,Linux內核會加載到內存中並運行。首先是開始UNIX System V init過程或Upstart init 過程(取決於linux版本),而後這個過程將負責啓動Linux系統上的全部其餘進程。

1)System V init過程

System V init過程會讀取/etc/inittab文件。inittab文件會列出系統的運行級,不一樣的運行級啓動不一樣的腳本。

Linux運行及——red hat 發行版

運行級 描述
               0               關機
1 單用戶模式
2 多用戶模式,一般不支持網絡
3 全功能的多用戶模式,支持網絡
4 可定義用戶
5 多用戶模式,支持網絡和圖形話X Window會話
6 重啓

但一些基於debian的發行版,好比Ubuntu,不區分2~5級。2~5級都是 多用戶模式,支持網絡和圖形話X Window會話。

每一個運行級將會定義System V init過程啓動或中止哪些腳本。這些開機腳本都是shell腳本,經過必要的環境變量來啓動應用程序。

不一樣的Linux發行版存放開機腳本的位置略有不一樣,主要存放於/etc/rc#.d目錄,#表明運行級;/etc/init.d目錄;/etc.init.d/rc.d目錄等。

2)Upstart init 過程

Upstart init 過程是管理進程服務的一個新標準。不關注運行級,只關注事件。如開機事件

Upstart 使用位於/etc/event.d或/etc/init目錄下的文件來啓動程序。

5.2定義本身的開機腳本

本身的開機腳本最好不要和已有的腳本文件混合,大多數Linux提供了一個本地開機文件專門讓系統管理員來添加開機時運行的腳本。

Linux本地開機文件位置

發行版 文件位置
debian /etc/init.d/rc.local
Fedora     /etc/rc.d/rc.local
Mandriva /etc/rc.local
openSuse /etc/init.d/boot.local
Ubuntu /etc/rc.local

5.3在新shell中啓動

每一個用戶主目錄下有兩個文件:.bash_profile  和 .bashrc  。bash shell會用它們來自動啓動腳本並設置環境變量。

當新shell是新的登錄生成的話,bash shell會運行.bash_profile  ,能夠把任何登錄時要運行的腳本放到該文件中。

shell啓動時,bash shell會運行.bashrc。能夠在.bashrc文件中添加,想要顯示在shell中的語句

若要爲全部用戶設置,能夠更改/etc/bashrc文件。

相關文章
相關標籤/搜索