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