linux 进程及作业管理

linux进程有作业管理

linux内核的功能: 进程管理硬件驱动文件系统网络管理安全管理内存管理。 把一切硬件抽象为系统调用。

  • 进程 (process) : 运行中的程序的一个副本。 进程存在生命周期。
  • 程序 (program) : 一个静态的文件。

linux内核存储进程信息的固定格式: task struct
多个任务的 task struct 组成的链表称为: task list

进程创建

  • init : 初始化进程。它由kernel 创建。 除 init 进程之外,于下的进程都是由 init进程创建而来的。 kernel 创建 inint 进程之后,说明内核空间已有了,用户空间也已经创建。后续的用户空间所有管理工作由init 管理。
  • 进程与进程之间存在在父子关系:进程都由其父进程创建。
  • 父进程创建子进程,由fork()而来,向内核发送调用。fork()是创建子进程的一个接口,内核开设的调用clone().

进程的优先级

  • 进程的优先级: 0-1390 一般不用。
    1-99 : 实时优先级。实时优先级,数字越大,优先越高。
    100-139: 静态优先级 ;数字越小,优先级越高。
  • nice 值: -20 <--> 19 之间, 对应于进程优先级的 100<-->139
    BIg O : 0(1) , 0( logn ) , 0(n), 0(n^2), 0(2^n) 。

进程内存

  • page Frame : 页框,用于存储页面数据, 存储 Page。
  • 线性地址:
  • 物理地址:
  • MMU : Memory Manage Unit : 内存管理单元。
  • IPC : inter Process Communication 机制: 用于进程之间的通信。
    -同一主机上:
    • signal :
      • shm : shared memory
      • semerphor
  • 不同主机上:
    • rpc : remote procecure call
    • socket

linux内核:进程实行抢占式多任务

进程的类型

  • 守护进程: daemon: 在系统引导过程中启动的进程,与终端无关的进程。
  • 用户进程: 用户通过终端打开的进程,前台进程,跟终端相关。

进程状态

  • 进程状态分类:
    • 运行态: running
    • 就绪态: ready
    • 睡眠态:
      • 可中断: interruptable
      • 不可中断: uninterruptable
    • 停止态:暂停于内存中,但不会被调用,除非手动启动之;stopped.
    • 僵尸态: zombie
    • 孤儿进程

进程的分类

  • 非交互式: cpu--->Bound
  • 交互式:io ------>Bound
  • read() , open() , write()

linux系统上常用进程查看及管理工具

pstree , ps , pidof , pgrep , top, htop, glances, pmap, vmstat, dstat, kill, pkill, job,bg, fg, nohup, nice , renice , killall ,...

进程显示格式:

  • centos 5 : 串行 , sysV init
  • centos 6 : 并行 , upstart
  • centos 7 : systemctl /sbin/init
[root@caibird ~]# pstree
init─┬─NetworkManager─┬─dhclient
     │                └─{NetworkManager}
     ├─abrtd
     ├─acpid
     ├─atd
     ├─auditd───{auditd}
     ├─automount───4*[{automount}]
     ├─bonobo-activati───{bonobo-activat}
     ├─certmonger
     ├─console-kit-dae───63*[{console-kit-da}]
     ├─crond
     ├─cupsd
     ├─2*[dbus-daemon───{dbus-daemon}]
     ├─dbus-launch
     ├─devkit-power-da
     ├─gconfd-2
....

pstree 命令

  • pstree - display a tree of processes
  • 命令格式: pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-Z] [-A|-G|-U]
    [pid|user]
    pstree -V
  • 作用: 以树形显示当前正在运行的进程。

 ps 命令

ps - report a snapshot of the current processes.

  • 命令格式: ps [options]

    • 内核中的状态信息位于: /proc/ 目录下。
      -内核参数值:
      • 可设置其值从而调整内核运行特性的参数。 /proc/sys/ 目录下。
      • 状态变量: 其用于输出内核中统计信息或状态信息,仅用于查看。
    • 参数 : 模拟成文件系统类型

    • 进程: /proc/# : # : 表示 PID 进程号。 进程号命名的目录 。 在/proc/ 下都会有一个以进程号为目录。

    • ps [OPTION] 选项有三种风格, 如下:

       1   UNIX options, which may be grouped and must be preceded by a
           dash.
       2   BSD options, which may be grouped and must not be used with a
           dash.
       3   GNU long options, which are preceded by two dashes.

启动进程的方式

1, 系统启动过程中自动启动,与终端无关的进程。
2, 用户通过终端启动: 与终端相关的进程。

  • 选项:
    • a: 所有与终端相关的进程;
    • x: 所有与终端无关的进程。
    • u: 以用户为中心组织进程姿态信息显示。
常用组合之一: aux

例如:

[root@caibird ~]# ps -aux                                 #centos 7           
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.6 128164  6860 ?        Ss   623   0:15 /usr/lib/systemd/s
root         2  0.0  0.0      0     0 ?        S    623   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    623   0:01 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   623   0:00 [kworker/0:0H]
root         7  0.0  0.0      0     0 ?        S    623   0:00 [migration/0]
root         8  0.0  0.0      0     0 ?        S    623   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        R    623   0:06 [rcu_sched]
root        10  0.0  0.0      0     0 ?        S    623   0:07 [watchdog/0]
root        12  0.0  0.0      0     0 ?        S    623   0:00 [kdevtmpfs]
root        13  0.0  0.0      0     0 ?        S<   623   0:00 [netns]
root        14  0.0  0.0      0     0 ?        S    623   0:00 [khungtaskd]

******************************************************************************************

[root@caibird ~]# ps aux                 #centos 6
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  19348  1552 ?        Ss   Jun15   0:03 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Jun15   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Jun15   0:00 [migration/0]
root         4  0.0  0.0      0     0 ?        S    Jun15   0:01 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    Jun15   0:00 [stopper/0]
root         6  0.0  0.0      0     0 ?        S    Jun15   0:06 [watchdog/0]
root         7  0.0  0.0      0     0 ?        R    Jun15   3:49 [events/0]
root         8  0.0  0.0      0     0 ?        S    Jun15   0:00 [events/0]
  • 详细说明名状态信息
    • VSZ: 虚拟内存集, 占领虚拟内存的大小,—>线性地址空间。
    • RSS : Resident SRE , 常驻内存集, 不能放在交换上的数据。
    • TIME : 累积占用CPU的时间。
    • [kthreadd] : 带杰棕括号表示是 内核线程
    • STAT : 进程状态。
    • R :running 运行态。
    • S : interruptable sleeping ; 可中断睡眠。
    • D :uninterruptable sleping ; 不可中断睡眠。
    • T : stopped ;停止态。
    • Z : zombie : 僵尸态
    • + : 前台进程。
    • N : 低优先级进程。
    • l : 多线程进程。
    • < : 高优先级进程。
    • s : session leader : 会话领导者。
常用组合之二 -ef
  • -e : 显示所有进程。
  • -f : 显示完整格式的进程信息。

    • 命令: ps -ef
      例如:
[root@caibird ~]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Jun15 ?        00:00:03 /sbin/init
root         2     0  0 Jun15 ?        00:00:00 [kthreadd]
root         3     2  0 Jun15 ?        00:00:00 [migration/0]
root         4     2  0 Jun15 ?        00:00:01 [ksoftirqd/0]
root         5     2  0 Jun15 ?        00:00:00 [stopper/0]
root         6     2  0 Jun15 ?        00:00:06 [watchdog/0]
root         7     2  0 Jun15 ?        00:03:51 [events/0]
root         8     2  0 Jun15 ?        00:00:00 [events/0]
root         9     2  0 Jun15 ?        00:00:00 [events_long/0]
root        10     2  0 Jun15 ?        00:00:00 [events_power_ef]
root        11     2  0 Jun15 ?        00:00:00 [cgroup]
root        12     2  0 Jun15 ?        00:00:00 [khelper]

....

说明:
- PID : 进程号。
- PPID : 父进程号: /sbin/init的父进程为0 , 0 号进程是一个过渡,系统引导时会出现 。
- C : 表示 CPU 占用百分比。 ; cpu utiliztion
- STIME : 表示启动的时间。
- TTY: 与其相关的终端。
- PSR :表示运行在哪颗CPU上面。

##### 常用组合之三: -eFH

  • -F : 显示完整格式的进程信息。
  • -H : 以层次结构显示进程的相关信息。
[root@caibird ~]# ps -eFH
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root         2     0  0     0     0   0 Jun15 ?        00:00:00 [kthreadd]
root         3     2  0     0     0   0 Jun15 ?        00:00:00   [migration/0]
root         4     2  0     0     0   0 Jun15 ?        00:00:01   [ksoftirqd/0]
root         5     2  0     0     0   0 Jun15 ?        00:00:00   [stopper/0]
root         6     2  0     0     0   0 Jun15 ?        00:00:06   [watchdog/0]
root         7     2  0     0     0   0 Jun15 ?        00:03:52   [events/0]
root         8     2  0     0     0   0 Jun15 ?        00:00:00   [events/0]
root         9     2  0     0     0   0 Jun15 ?        00:00:00   [events_long/0]
root        10     2  0     0     0   0 Jun15 ?        00:00:00   [events_power_ef]
root        11     2  0     0     0   0 Jun15 ?        00:00:00   [cgroup]
root        12     2  0     0     0   0 Jun15 ?        00:00:00   [khelper]
...
root      2011     1  0 45726  2376   0 Jun15 ?        00:00:00   /usr/sbin/abrtd
root      2038     1  0 29222  1400   0 Jun15 ?        00:00:06   crond
root      2053     1  0  5278   500   0 Jun15 ?        00:00:00   /usr/sbin/atd
root      2070     1  0 16106  1428   0 Jun15 ?        00:00:00   /usr/sbin/certmong
root      2109     1  0 33531  2208   0 Jun15 ?        00:00:00   /usr/sbin/gdm-bina
root      2142  2109  0 41206  3160   0 Jun15 ?        00:00:00     /usr/libexec/gdm
root      2145  2142  0 43128 27984   0 Jun15 tty1     00:00:16       /usr/bin/Xorg
gdm       2232  2142  0 68568  8340   0 Jun15 ?        00:00:01       /usr/bin/gnome
gdm       2258  2232  0 30189  4452   0 Jun15 ?        00:00:03         /usr/libexec
gdm       2269  2232  0 71725 10392   0 Jun15 ?        00:00:03         metacity
gdm       2270  2232  0 101687 18960  0 Jun15 ?        00:00:22         /usr/libexec
gdm       2271  2232  0 62205  7776   0 Jun15 ?        00:00:00         /usr/libexec
gdm       2274  2232  0 68568  9056   0 Jun15 ?        00:00:12         gnome-power-
root      2292  2142  0 35480  2140   0 Jun15 ?        00:00:00       pam: gdm-passw
root      2115     1  0  1017   532   0 Jun15 tty2     00:00:00   /sbin/mingetty /de
root      2117     1  0  1017   532   0 Jun15 tty3     00:00:00   /sbin/mingetty /de
常用组合之四 : -e0 :0 要写在 e的后面,后面带参数。
  • 0 : 表示自定义要显示的字段列表,各选项之间用逗号隔开。 0 可表示:field1 , field2, ...
    • 常用的 field : pld , ni , pri , psr , pcup , stat, comm , tty , ppid,
    • ni : nice 值 -20~19 。 pri : priorty : 优先级
    • rtprio : real time priorty : 实时优先级。

pgrep, pkill 命令

  • pgrep, pkill 命令:

  • 功能: look up or signal processes based on name and other attributes 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。在服务器的配置和管理中,这个工具常被应用。

  • 格式:

    • pgrep [options] pattern
    • pkill [options] pattern
  • 选项:

    • -u uid :effective user
    • -U uid : read user
    • -t TERMINAL : 与指定的终端相关的进程。
    • -l: 显示进程名。
    • -a: 显示完整格式的进程名。
    • D pid : 显示此进程的子进程。
    • -o 进程起始的ID;
    • -n 进程终止的ID;
[root@caibird ~]# pgrep bash
1452
13524
14616
[root@caibird ~]# pgrep -lo bash
1452 bash
[root@caibird ~]# pgrep -ln bash
14616 bash
[root@caibird ~]# 

pidof 命令

作用: pidof用于找出正在运行的程序的进程PID(find the process ID of a running program.),程序可以是一个二进制执行程序,也可以是一个shell脚本。

  • 常用命令
    • 格式 : pidof program
      • 作用 : 找出program程序的进程PID,如果有多个就会全部列出,program不能是shell脚本名称。
    • 格式:pidof -s program
      • 作用 : 找出program程序的进程PID,只列出一个。(Single shot - this instructs the program to only return one pid.)
    • 格式:pidof -x script
      • 作用: 找出shell脚本script的进程PID。

linux 进程及作业管理

htop命令

  • 命令 : htop
  • 选项:
    --d #:指定延迟时间间隔。

    • -u UserName :仅显示指定用户的进程。
      --s COLUME: 以指定字段进行排序。

      • 子命令:
        -l : 显示选定的进程打开的文件列表。
      • s : 跟踪选定的进程的系统调用。
      • t : 以层次关系显示各进程状态。
      • a: 将选定的进程绑定至某指定的cpu核心。

vmstat 命令

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。

命令格式:
vmstat [options] [delay [count]]

  • 选项:
    --a, --active : active/inactive memory

    • -f, --forks : number of forks since boot
      --m, --slabs : slabinfo
      --n, --one-header : do not redisplay header
    • -s, --stats : event counter statistics
    • -d, --disk : disk statistics
    • -D, --disk-sum : summarize disk statistics
    • -p, --partition : partition specific statistics
    • -S, --unit : define display unit
    • -w, --wide : wide output
    • -t, --timestamp : show timestamp
  • procs

    • r :等待运行的进程个数;cpu上等待运行的任务的队列长度。
    • b :处于不可中断睡眠态的进程个数。被阻塞的任务队列的长度。
  • memory
    • swap:交换内存使用率。
      -free:空闲的物理内存总量。
    • buffer :用于buffer的内存总量。
    • cache :用于cache的内存总量。
  • swap
    • si:数据进入swap中的数据速率(kb/s)
    • so :数据离开swap的速率(kb/s)
  • io(input / output)
    -bi :从块设备读入数据到系统的速度(kb/s)
    • bo:保存数据至块设备的速率(kb/s)
  • system
    • in:interrupts, 中断速率;
    • cs:context switch , 上下文切换的速率。
  • cpu
    • us :user space ; 用户空间。
    • sy:system ; 系统空间。
    • id : idle
    • wa:wait
    • st : stolen

pmap 命令

  • -report memory map of a process
  • 命令格式:
    - pmap [ -x | -d ] [ -q ] pids...
    - pmap -V
  • 选项:
    • -x : 显示详细格式的信息。
    • 另一种查看方式 : cat /proc/PID/maps

glances 命令

  • A cross-platform curses-based monitoring tool
  • 内建命令
  • 常用选项:
    • -b : 以Byte为单位显示网上数据速率。
    • -d : 关闭磁盘I/O模块。
    • -m : 关闭mount模块。
    • -n : 关闭network模块。
    • -t # : 刷新时间间隔。
    • -1 :每个cpu的相关数据单独显示。 阿拉拍数字1。
    • -o (HTML | CSV):输出格式;
    • -f /PATH/TO/SOMEDIR : 设定输出文件的位置。

linux系统作业控制

  • job : 作业
    • foreground(前台作业) :通过终端启动,且启动后会一直占用终端(命令提示符)。
    • background(后台作业):可以通过终端启动,但启动后即转入后台运行(释放终端)。

如何让作业于后台运行:

  • a. 运行中的作业:
    • 执行命令 : ctrl + z ; 注意: 送往后台的作业会转为停止状态(stop)。
  • b . 尚未启动的作业: COMMAND & ;在启动的作业后面 + &
    • 注意: 以此类作业虽然被送往后台,但其依然与终端相关;此时,如果终端进程终止,则与终端相关的进程也会终止,哪怕你于后台的进程,也会终止 。
    • 如果希望把送往后台的作业剥离与终端的关系,可使用命令: nohop COMMAND & , 则立即转入与终端无关的模式。

如何查看当前系统的所有作业

  • jobs 命令
    • 格式 : jobs
    • 功能 : 查看当前系统的作业。

可实现作业控制的常用命令

作业控制常用带作业号来实现 。 JOB_NUM

  • # fg [[%] JOB_NUM] :把作业从后门周往前台来。
  • # bg [[%] JOB_NUM] : 后台停止的作业继续运行。
  • # kill %JOB_NUM :终止作业进程。百分号%在这里不能省略,如果省略就变成进程号了。

说明 :作业中 “+” ,“- ” : “ + ” : 表示下次执行作业没有加作业号默认管理的作业。
“- ” 减号 : 表示 “+” 作业之后的作业管理。

进程的优先级调整

  • 可通过 nice值调整的优先级范围 100-139 , 分别对应于: -20,19
  • 进程启动时,其 nice 值默认为0,其优先级是120

nice命令

  • 功能 : 以指定的 nice 值启动并运行命令。
  • 格式 : nice [OPTION] [COMMAND[ARG] ... ]
  • 选项:
    • -n NICE : 指定 nice 值。
    • 注意: :仅管理员可调低 nice 值。

renice 命令

  • 对运行中的进程调整 nice 值。
  • 格式: renice [-n] NICE PID ...

例如:

renice -n -3 52073
  • 查看 nice 值和优先级 : # ps axo pid,ni,priority, command

ping 命令

  • send ICMP ECHO_REQUEST to network hosts : 发送网络控制信息协议回显请求到网络主机。
    • 格式: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS] [-r count] [-s count] [[-j host-list] | [-k host-list]][-w timeout] [-R] [-S srcaddr] [-4] [-6] target_name
    • echo request : 8
    • echo reply : 0
  • 命令格式 : ping [OPTION] destination
    • 选项:
      • -c COUNT: 指定发送 ping 包的个数。
      • -w # : 指定 ping 命令超时时长。
      • -W # : 一次 ping 操作中,等待对方响应的超时时长 。
        --s # : 指明 ping 包报文大小,默认为32byte字节。

hping 命令 (package : hping3)

Hping是一个命令行下使用的TCP/IP数据包组装/分析工具,其命令模式很像Unix下的ping命令,但是它不是只能发送ICMP回应请求,它还可以支持TCP、UDP、ICMP和RAW-IP协议,它有一个路由跟踪模式,能够在两个相互包含的通道之间传送文件。

  • send (almost) arbitrary TCP/IP packets to network hosts
    -格式 :hping host [options]
  • 选项:
    • –fast :
    • – faster :
    • –flood :
    • – i ux :

traceroute 命令

通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的.

  • 格式:traceroute[参数][主机]

  • print the route packets trace to network hosts

  • 功能:跟踪从源主机到目标主机之间经过的网关。

  • 选项:
    --d : 使用Socket层级的排错功能。
    • -f : 设置第一个检测数据包的存活数值TTL的大小。
  • -F : 设置勿离断位。
  • -g : 设置来源路由网关,最多可设置8个。
  • -i : 使用指定的网络界面送出数据包。
  • -I : 使用ICMP回应取代UDP资料信息。
  • -m: 设置检测数据包的最大存活数值TTL的大小。
  • -n : 直接使用IP地址而非主机名称。
  • -p :设置UDP传输协议的通信端口。
  • -r :忽略普通的Routing Table,直接将数据包送到远端主机上。
  • -s :设置本地主机送出数据包的IP地址。
  • -t : 设置检测数据包的TOS数值。
  • -v : 详细显示指令的执行过程。
  • -w :设置等待远端主机回报的时间。
  • -x :开启或关闭数据包的正确性检验。

ftp 命令

  • ftp : file transfer protocol
  • ftp 服务是命令行客户端工具: 用户名可以 是 ftp或者 anonymous

    • ftp常用命令
      • get 命令 : get命令从文件服务器下载文件,一次只能下载一个。
      • mget命令: 从文件服务器下载文件,一次可以下载多次。
      • put 命令: 一次上传单个文件到文件服务器,用户得有上传文件权限。
      • mput 命令: 一次上传多个文件到文件服务器,用户得有上传文件权限。
      • bey or quit : 退出文件服务。

lftp 命令

  • lftp: sophisticated file transfer program

-lftp [-p port] [-u user [, pass]] [site]
- 常用命令:
- get : 一次下载一个文件。
- mget : 一次下载多个文件。
- put : 一次上传一个文件。
- mput : 一次上传多个文件。
- rm : 一次删除一个文件。
- mrm : 一次删除多个文件。
….

lftget 命令

  • 格式: lftget [-c][-d][-v] URL[URL...]
  • common option:
    • -c:继续此前的下载。

wget

  • the non-interactive network downloader.
  • 功能: 非交互式的网络下载工具。
    注意: wget命令只能下载文件,而不能下载目录 。如果想下载目录, 可以把该目录打包成文件(tar)。
  • 命令格式: wget [option]... [URL]...
  • option:
    • -b: 在后台执行下载操作。
    • -q : 静默模式, 不显示下载进度。
    • -O file:下载的文件的保存位置。
    • -c: 续传。
    • --limit-rate=amount : 以指定的速率传输文件。

bash脚本编程

  • 执行方式

    • 顺序执行
    • 条件执行
    • 循环执行
  • 循环执行

1.for循环:

for VARAIBLE in LiST ; do

    循环体
done

2. while 循环:

while CONDITION ; do               #while循环:进入条件:CONDITION测试为“真”
     循环体                         #while循环:退出条件:CONDITION测试为“假”
     循环控制变量修正表达式
done

3. until 循环:

until CONDITION ;  do 
    循环体                          #until循环:进入条件:CONDTITON测试为“假”
    循环控制变量修正表达式            #until循环:退出条件:CONDITION测试为“真” 
done 

示例 打印9X9乘法表:

[root@caibird scripts]# vim show.sh
  1 #!/bin/bash
  2 # description: 打印九九乘法表
  3 # author: caibirdnumberone
  4 # author: caibirdnumberone
  5 # date : 20180628
  6 echo "for 循环"
  7 declare  j j=0
  8 
  9 for j in {1..9} ; do
 10       for i in $(seq 1 $j); do
 11          echo -n -e   "${i}x${j}"="$[${i}*${j}]\t"
 12       done
 13    echo
 14 done
 15 
 16 sleep 1
 17 
 18 echo "while 循环 "
 19 
 20 declare  -i   j=1 i=1
 21 
 22 while [ $j -le 9 ]; do
 23     while [ $i -le $j ]; do
 24          echo -n -e  "${i}x${j}=$[${i}*${j}]\t"
 25          i+=1
 26      done
 27    i=1
 28   echo
 29   j+=1
 30 done
 31 
 32 
 33 sleep 1
 34 
 35 
 36 echo "until 循环"
 37 
 38 declare  -i j=1 i=1
 39 
 40 until [ $i -gt 9 ]; do
 41     until [ $j -gt $i  ]; do
 42       echo -n -e "${j}x${i}=$[${j}*${i}]\t"
 43       j+=1
 44     done
 45       j=1
 46      echo 
 47      i+=1
 48 done
 49 
~                                                                                                                                
~                                                                                                                                
"show.sh" 49L, 626C 已写入                                                                                     
[root@caibird scripts]# bash show.sh 
for 循环
1x1=1   
1x2=2   2x2=4   
1x3=3   2x3=6   3x3=9   
1x4=4   2x4=8   3x4=12  4x4=16  
1x5=5   2x5=10  3x5=15  4x5=20  5x5=25  
1x6=6   2x6=12  3x6=18  4x6=24  5x6=30  6x6=36  
1x7=7   2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49  
1x8=8   2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64  
1x9=9   2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81  
while 循环 
1x1=1   
1x2=2   2x2=4   
1x3=3   2x3=6   3x3=9   
1x4=4   2x4=8   3x4=12  4x4=16  
1x5=5   2x5=10  3x5=15  4x5=20  5x5=25  
1x6=6   2x6=12  3x6=18  4x6=24  5x6=30  6x6=36  
1x7=7   2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49  
1x8=8   2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64  
1x9=9   2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81  
until 循环
1x1=1   
1x2=2   2x2=4   
1x3=3   2x3=6   3x3=9   
1x4=4   2x4=8   3x4=12  4x4=16  
1x5=5   2x5=10  3x5=15  4x5=20  5x5=25  
1x6=6   2x6=12  3x6=18  4x6=24  5x6=30  6x6=36  
1x7=7   2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49  
1x8=8   2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64  
1x9=9   2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81  
[root@caibird scripts]# 
[root@caibird scripts]# cat test.sh 
#!/bin/bash
# description: 测试192.168.0.0/24网段是否能ping通
# author: caibird_numberone
# version: 1.0
# date: 20180702

echo "下面用until实现"
declare -i i=1
until [ $i -gt 254 ]; do
       ip="192.168.0.$i"
        ping -c 3 -w 3 -W 3 $ip &> /dev/null
    if [ $? -eq 0 ]; then
        echo "ping $ip successful"
    else
        echo "ping $ip fail"
    fi
    i+=1
done


echo

echo  "下面用for 循环实现 "

declare -i  j=1 

for j in {1..254} ; do 
        ip="192.168.0.$j"
        ping -c 3 -w 2 $ip &> /dev/null
   if [ $? -eq 0 ] ;  then 
        echo " ping 192.168.0.$j successful"
   else
        echo " ping 192.168.0.$j fail"
   fi
  let j++
done


echo

echo "下面用while循环实现"

declare -i x=1
while [ $x -le 254  ]; do 
     ip="192.168.0.$x"
     ping -c 2 -w 2 $ip &> /dev/null
   if [ $? -eq 0 ]; then  
      echo "ping 192.168.0.$x is successful"
   else 
      echo "ping 192.168.0.$X is fail "
   fi
  x+=1
done


[root@caibird scripts]# 

你可能感兴趣的:(base_zero)