1. 程式人生 > >2018-6-10Linux進程作業控制與bash循環

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

Linux 系統管理

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

1.1 Linux系統作業控制

我們繼續接著上一次的話題,繼續講解作業控制,所謂的作業控制就是job,由多個功能來完成才能一個作業,所以可以理解為組合的小程序完成復雜任務的概念,對於所有的Linux操作系統來講,作業分為兩類,一種是前臺作業,一種為後臺作業,一個作業可能包含多個進程,也有可能只包含一個。

job:
    前臺作業(foregroud):通過終端啟動,且啟動後會一直占據終端;例如:復制;
    後臺作業(backgroud):(也)可以通過終端啟動,但啟動後會轉入到後臺運行(釋放終端);


需要註意的是,大多數的情況下,我們在前臺啟動的作業,如果該命令不支持運行在後臺時,它將運行在前臺,而服務類的進程可以運行於後臺,因為它本身支持運行於後臺的服務模式,即使有些服務類進程不是默認運行於後臺,我們也可以手動配置使其運行於後臺。

那麽如何讓該作業運行於後臺,共有兩種方式,第一種方式,如果該作業在前臺正在運行,我們可以使用Ctrl+z使其送往後臺,不過該作業就會轉為停止態,而第二種方式就是如果該作業未被運行,我們使用輸入該命令後添加&使其命令啟動時就立即送往後臺,但是需要註意的是,即使送往後臺,也是與進程相關。

如何讓作業運行於後臺:
    (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-139

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

那麽如果不想讓它在啟動時為0,獲取其更多的資源,我們可以使用以下命令來進行調整。

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:以指定的速率傳輸文件;

二、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


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