2018-6-10Linux進程做業控制與bash循環

1、Linux進程管理及網絡工具的使用

1.1 Linux系統做業控制

  咱們繼續接着上一次的話題,繼續講解做業控制,所謂的做業控制就是job,由多個功能來完成才能一個做業,因此能夠理解爲組合的小程序完成複雜任務的概念,對於全部的Linux操做系統來說,做業分爲兩類,一種是前臺做業,一種爲後臺做業,一個做業可能包含多個進程,也有可能只包含一個。ios

job:
    前臺做業(foregroud):經過終端啓動,且啓動後會一直佔據終端;例如:複製;
    後臺做業(backgroud):(也)能夠經過終端啓動,但啓動後會轉入到後臺運行(釋放終端);


  須要注意的是,大多數的狀況下,咱們在前臺啓動的做業,若是該命令不支持運行在後臺時,它將運行在前臺,而服務類的進程能夠運行於後臺,由於它自己支持運行於後臺的服務模式,即便有些服務類進程不是默認運行於後臺,咱們也能夠手動配置使其運行於後臺。小程序

  那麼如何讓該做業運行於後臺,共有兩種方式,第一種方式,若是該做業在前臺正在運行,咱們可使用Ctrl+z使其送日後臺,不過該做業就會轉爲中止態,而第二種方式就是若是該做業未被運行,咱們使用輸入該命令後添加&使其命令啓動時就當即送日後臺,可是須要注意的是,即便送日後臺,也是與進程相關。bash

如何讓做業運行於後臺:
    (1) 運行中的做業:
        Ctrl + z
        注意:送日後臺後,做業會轉爲中止態;
        
    (2) 還沒有啓動的做業:
        # COMMAND &
        
        注意:此類做業雖然被送日後臺,但其依然運行與終端有關的進程;此時若是仲算進程終止,與終端相關的進程都會終止;若是但願把送日後臺的做業剝離與終端的關係,則使用如下命令:
            # nohup COMMAND &

  若是你想查看全部被用戶送日後臺的程序,可以使用jobs命令。服務器

查看全部的做業:
    # jobs

  被用戶送日後臺的進程,咱們能夠手動去進行調度,咱們可實現調度做業時有三個命令。而在查看全部做業中咱們發現了+-號,若是沒有輸入做業號時,那麼+就是下一次被默認調換的,而-就是+以後就會輪到該進程。對於kill命令而言,%不能省,由於若是省略,就會殺死的是的進程的PID,而不是做業的ID。
網絡

可實現做業控制的經常使用命令:
    # fg [[%]JOB_NUM]:以指定的做業調回前臺;
    # bg [[%]JOB_NUM]:讓送日後臺的做業在後臺繼續運行;
    # kill %JOB_NUM:終止指定的做業;

1.2 調整進行優先級

  其實做爲用戶來說,進程的優先級是沒有辦法調整的,由於優先級的調整共有兩類,一種爲靜態,另外一種爲動態,靜態由用戶調整,動態由內核自動調整,咱們操做的時是調整其nice值,用戶所管理的優先級範圍是非實時的,100-139tcp

調整進程優先級:
    
    可經過nice值調整的優先級範圍:100-139
        分別對應於:-20, 19
        
    進程啓動時,其nice值默認爲0,其優先級爲120;

  那麼若是不想讓它在啓動時爲0,獲取其更多的資源,咱們可使用如下命令來進行調整。ide

nice命令:
    以指定的nice值啓動並運行命令;
        # nice [OPTIO] [COMMAND[ARG]...]

  該命令的選項爲:工具

    選項:
        -n NICE
        
    注意:僅管理員可調低nice值;

  還有一種命令叫renice命令,該命令是對已經啓動的進程且運行中的進行調整nice值。性能

renice命令:
    # renice [-n] NICE PID...

  若是想查看Nice值和優先級的話,可經過如下方式進行查看。測試

查看Nice值和優先級:
    ps axo pid, ni, priority, comm

  咱們還有未涉及到的命令,先來總結一下:

未涉及到的命令:sar, tsar, iostat, iftop, nethog, ...

1.3 網絡客戶端工具

  在這裏咱們所涉及到的網絡命令有:

ping/lftp/ftp/lftpget/wget等;

  咱們先說第一個命令爲ping命令,它的主要做用爲可以實現網絡上的主機來發送ICMP迴應請求及響應請求的相關報文,有一個協議爲ICMP協議,稱之爲互聯網消息控制協議,它可以實如今網絡上發送控制命令,對於咱們來說主要用來探測互聯網中的某個主機或網絡是否在線或可達。好比像echo request用8來表示,而echo reply用0來進行表示,而ping命令就是向對方發起request報文,正常的話對方就會響應reply報文,不過,因爲誰應答就響應的模式,會容易遭受×××,若是想要隱藏的話,則能夠關閉該響應reply報文。

ping命令:
    send ICMP ECHO_REQUEST to network hosts
	ICMP: Internet Control Message Protocol
		
    ping [OPTION] destination
        -c #:發送的ping包個數;
        -w #:ping命令超時時長;
        -W #:一次ping操做中,等待對方響應的超時時長;
        -s #:指明ping包報文大小;

  還有一個命令爲hping命令,能直接發送tcp/ip報文到網絡主機的命令,包名爲hping3 。

hping命令:(package hping3)
    ping3 - send (almost) arbitrary TCP/IP packets to network hosts
    
    --fast:
    --faster
    --flood
    -i uX

  接下來講的是traceroute命令,它是實現路由跟蹤的一個命令,它是源主機到目標主機之間到底通過了哪些路由器。

traceroute命令:
    
    跟蹤從源主機到目標主機之間的網關;

  下一個介紹的就是ftp命令,該命令是一個客戶端工具,遵循文件傳輸協議,該工具是基於ftp協議,訪問ftp服務器的一個客戶端工具。

ftp命令:
	ftp: file Transfer Protocol
	
		ftp服務命令行客戶端工具;

  還有一種命令爲lftp命令,用來取代傳統的ftp客戶端工具,還支持顏色區分以及命令補全及路徑補全。

lftp命令:
    ftp [-d] [-e cmd] [-p port] [-u user[,pass]] [site]
    
    get, mget
    put, mput
    rm, mrm

  lftpget命令是一個下載工具,經過URL來下載資源,還能支持斷點續傳。

lftpget命令:
    lftpget [-c] [-d] [-v] URL [URL...]
        -c:斷點續傳;

  wget命令是一個下載工具,它是非交互式的網絡下載器,其命令用法爲:

wget命令:
    Wget - The non-interactive network downloader.
    
    wget [option]... [URL]...
        -b:在後臺執行下載操做;
        -q:靜默模式,不顯示下載進度;
        -O file:下載文件保存的位置;
        -c:續傳;
        --limit-rate=amount:以指定的速率傳輸文件;

2、bash循環

  咱們以前就講到過,程序的執行順序共有三種。

順序執行
選擇執行:if, case
循環執行:for, while, until

  那麼對於for循環來講,咱們以前也簡單的介紹過該循環的格式爲:

for循環格式:
    for VARIABLE in LIST; do
        循環體
    done

  除了for循環以外,還有while循環以及until循環,在這裏咱們先說一下whil循環,在循環體中,有一個循環控制變量的表達試,所謂循環控制變量表達式就是必須使得讓while循環的條件不在知足,因此也能夠稱之爲循環控制變量的修正表達式,那麼while循環的使用格式爲:

while循環:
    while CONDITION; do
        循環體
        循環控制變量修正表達式
    done

  示例:求100之內正整數之和;

#!/bin/bash
# 
declare -i sum=0

for i in {1..100}; do
    let sum+=$i
done

echo $sum

###while###

declare -i sumary=0
declare -i i=1

while [ $i -le 100 ];do
   let sumary+=$i
   let i++
done

echo $sumary

  雖然看起來沒有for循環那麼好用,可是比for循環有更好的用途,對於列表生成來說,列表的量過大時,for循環其實性能很低,而while使用的是變量,因此只佔據很小的內存空間而已,這是它們的區別及使用結構。

  那麼在任何的狀況下,都由進入條件和退出條件。

進入條件:CONDITION測試爲"真";
退出條件:CONDITION測試爲"假";

  接下來介紹的是until循環,使用格式與while循環沒有什麼區別,那麼until循環格式爲:

until CONDITION; do
    循環體
    循環控制修正表達式
done

  但不一樣點在於until與while循環的條件控制是相反的。

進入條件:CONDITION測試爲"假";
退出條件:CONDITION測試爲"真";

  示例:

### until ###

until [ $i -gt 100 ]; do
    let sum+=$i
    let i++
done

  示例:建立10個用戶,user101-user110;密碼同用戶名;

#!/bin/bash
#

for i in `seq 101 110`; do
    if  ! id user$i &> /dev/null; then
	    useradd user$i &> /dev/null
	    echo user$i | passwd --stdin user$i &> /dev/null
    else
	    echo "user exists"
	    exit 2
    fi
done
相關文章
相關標籤/搜索