Jim

Talk is cheap. Show me the code.


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

  • 搜索

查看Linux发行版名称及版本号

发表于 2018-01-01 | 分类于 Linux

对于linx发行版及版本号的查看有如下几种方法,当一种方法失效的时候可以试试其他几种:

  • cat /etc/os-release

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [vagrant@k8s-master ~]$ cat /etc/os-release
    NAME="CentOS Linux" # 不带版本号且适合人类阅读的操作系统名称
    VERSION="7 (Core)" # 操作系统的版本号。禁止包含操作系统名称,但是可以包含适合人类阅读的发行代号。
    ID="centos" # 小写字母表示的操作系统名称,禁止包含任何版本信息。
    ID_LIKE="rhel fedora" # 一系列空格分隔的字符串,此字段用于表明当前的操作系统 是从哪些"父发行版"派生而来。
    VERSION_ID="7" # 小写字母表示的操作系统版本号,禁止包含操作系统名称与发行代号。
    PRETTY_NAME="CentOS Linux 7 (Core)" # 适合人类阅读的比较恰当的发行版名称, 可选的包含发行代号与系统版本之类的信息,内容比较随意。
    ANSI_COLOR="0;31" # 在控制台上显示操作系统名称的文字颜色。
    CPE_NAME="cpe:/o:centos:centos:7"
    HOME_URL="https://www.centos.org/" # 操作系统的主页地址, 或者特定于此版本操作系统的页面地址。
    BUG_REPORT_URL="https://bugs.centos.org/"

    CENTOS_MANTISBT_PROJECT="CentOS-7"
    CENTOS_MANTISBT_PROJECT_VERSION="7"
    REDHAT_SUPPORT_PRODUCT="centos"
    REDHAT_SUPPORT_PRODUCT_VERSION="7"
  • cat /etc/issue

    1
    2
    3
    [root@vps ~]# cat /etc/issue
    \S
    Kernel \r on an \m
  • lsb_release -a

    1
    2
    3
    4
    5
    6
    [root@vps ~]# lsb_release -a
    LSB Version: :core-4.1-amd64:core-4.1-noarch
    Distributor ID: CentOS
    Description: CentOS Linux release 7.3.1611 (Core)
    Release: 7.3.1611
    Codename: Core
  • cat /etc/redhat-release(针对redhat,Fedora)

    1
    2
    [root@vps ~]# cat /etc/redhat-release
    CentOS Linux release 7.3.1611 (Core)
  • cat /proc/version

    1
    2
    [root@vps ~]# cat /proc/version 
    Linux version 3.10.0-514.26.2.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Tue Jul 4 15:04:05 UTC 2017

参考文章:
http://www.jinbuguo.com/systemd/os-release.html#
http://www.cnblogs.com/parrynee/archive/2010/05/16/1736652.html

编程常用单词缩写

发表于 2017-12-29 | 分类于 软件开发基础知识

以下表格记录了编程常用单词缩写,可以随时查看
如果需要查看更加完整的整理,请参见这篇博客
如果需要在线查看单词缩写,可以访问这个网站:ABBREVIATIONS

摘自:
http://blog.csdn.net/sinat_34707539/article/details/52172997

Linux进程管理

发表于 2017-12-23 | 分类于 Linux

进程的查看

ps: 将某个时间点的进程运行情况打印出来

  • ps aux 查看系统所有的进程(BSD语法)
  • ps -lA(e) 较详细地查看系统所有进程(标准语法)
  • ps axjf 打印出系统所有进程,以进程树的方式打印出来

参数说明:

  • -A 所有进程都显示出来,与-e(every)具有同样的作用;
  • -a 不与terminal有关的所有进程;
  • -u 有效用户相关的进程;
  • -x 通常与-a这个参数一起用,可列出较完整的信息;
  • -p 通过指定的pid查看某个进程的信息;

输出格式控制:

  • -l(long format) 通常与-y选项一起使用;
  • -j(job format) 工作格式;
  • -f(full format) 做一个更为完整的输出,当和-L参数一起使用时,NLWP(number of threads)和LWP(thread ID)列会被添加;

仅查看当前登录bash相关的进程: ps -l

我们知道,当我们登录进行linux系统后,后续所有命令行的执行(即启动新的进程)都是当前bash进程的子进程,要想查看当前bash相关的进程可以用ps -l命令。

1
2
3
4
[root@vps ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 18313 18311 0 80 0 - 28878 wait pts/2 00:00:00 bash
0 R 0 18331 18313 0 80 0 - 37233 - pts/2 00:00:00 ps

输出结果说明:

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
进程标志,说明进程的权限,如果为4,表示此进程的权限为root 进程运行状态 进程的UID 进程ID 父进程ID CPU使用率,单位为百分比 进程被CPU执行的优先级,数值越小越快被CPU执行 进程Nice值 进程在内存中的地址,如果是running,会显示’-‘ 进程使用的内存大小 进程是否在运行,若为’-‘则表示正在运行中 登录者的终端机位置,若为远程登录则使用动态终端接口(pts/n) 使用掉的CPU时间 启动该进程的命令行

查看系统所有进程: ps aux

默认情况下,ps aux显示的进程是以PID号由小到大排序列出来。

1
2
3
4
5
6
7
8
9
10
11
[root@vps ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 125188 3368 ? Ss Oct15 1:08 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S Oct15 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Oct15 1:05 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Oct15 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S Oct15 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S Oct15 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R Oct15 4:25 [rcu_sched]
root 10 0.0 0.0 0 0 ? S Oct15 0:27 [watchdog/0]
root 12 0.0 0.0 0 0 ? S Oct15 0:00 [kdevtmpfs]

USER:该进程属于哪个账号的
PID:进程ID号
%CPU:进程使用CPU资源百分比
%MEM:进程占用物理内存百分比
VSZ:进程占用虚拟内存量(KB)
RSS:进程占用物理内存量(KB)
TTY:进程所在的终端接口,若与终端机无关,则显示?,另外tty1~tty6表示本机登陆接口,若为pts/n,则表示远程连接产生的进程
STAT:进程目前的状态
START:进程启动时间
TIME:进程实际使用CPU运行的时间
COMMAND:触发进程的命令行

找出系统中所有的僵尸进程: ps aux | grep ‘defunct’

一个进程fork创建子进程,如果子进程退出,而父进程没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这中进程称之为僵尸进程。僵尸进程在ps aux命令显示中状态是Z,而且在CMD后面会有

aux|grep 'defunct'```来查看系统中所有的僵尸进程:
1
2
3
4
5
6
7
8
9
10
11
```bash
[root@vps ~]$ ps aux | grep defunct
root 3419 0.0 0.0 0 0 ? Zs Oct24 0:00 [sh] <defunct>
root 5468 0.0 0.0 0 0 ? Z Apr11 0:00 [sh] <defunct>
root 7655 0.0 0.0 0 0 ? Z Apr07 0:00 [sh] <defunct>
root 8542 0.0 0.0 0 0 ? Zs Oct23 0:00 [sh] <defunct>
root 9188 0.0 0.0 0 0 ? Z Apr07 0:00 [sh] <defunct>
root 14906 0.0 0.0 0 0 ? Zs Dec15 0:00 [sh] <defunct>
root 21702 0.0 0.0 0 0 ? Z Apr18 0:00 [sh] <defunct>
root 22620 0.0 0.0 0 0 ? Z May18 0:00 [sh] <defunct>
root 23905 0.0 0.0 112652 972 pts/0 R+ 08:49 0:00 grep --color=auto defunct

有关僵尸进程及孤儿进程的更多深入的理解,请参考这篇文章

显示所需要的列: ps [OPTIONS] -o parm1,parm2,parm3 …

一般用ps -ef或者ps aux显示出来的信息比较全,大多信息没什么用处,可以使用-o选项来控制想要输出的列。在ps的man page的STANDARD FORMAT SPECIFIERS章节可以查看其他支持的信息。

-o参数以逗号(,)作为定界符号。逗号与它分隔的参数直接是没有空格的。在大多数情况下,选项-o都是和-e选项结合使用的(-eo),因为需要它列出运行在系统中的每一个进程。但是如果-o需要使用某些过滤器,例如列出特定用户拥有的进程,那么就不在使用-e。-e和过滤器结果使用没有任何实际效果,依旧会显示所有进程。

-o参数支持的参数非常多,可以通过man ps查看STANDARD FORMAT SPECIFIERS章节完整的参数及说明,以下列出常用参数:

  • pcpu:CPU占用率,直接写成%cpu也可以;
  • pmem:物理内存占用率,直接写成%mem也可以;
  • pid:进程ID;
  • ppid:父进程ID;
  • comm:可执行文件名;
  • user:启动进程的用户;
  • nice优先级;
  • time:累计的CPU时间,格式为[DD-]HH:MM:SS,也是ps -ef默认的输出列;
  • etime(elapsed time):进程自启动开始到现在的时间花费,格式为[[DD-]hh:]mm:ss;
  • etimes(elapsed times):进程自启动开始到现在的时间花费,时间单位为秒;
  • tty:所关联的TTY设备;
  • euid:有效用户ID;
  • stat:进程状态;
  • rss:进程使用物理内存大小,与rsz等同,单位为KB;
  • vsz:进程使用虚拟内存大小,单位为KB;
  • start:进程启动的时间,如果进程启动时间小于24小时,那么输出格式为”HH:MM:SS”,否则格式为”Mmm dd”,Mmm代表月份三个字符的缩写,也是ps -ef及ps aux的默认输出列;
  • lstart:进程启动的准确时间点,这个参数比较有用,因为start参数并不能够查看进程准确的启动时间;

示例:

  1. 打印出前10个进程的pid,ppid,cpu使用率,内存使用率,物理内存占用大小,虚拟内存占用大小,进程自启动开始到现在的时间花费,进程启动的准确时间:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@vps ~]# ps -eo pid,ppid,pcpu,pmem,rss,vsz,etime,lstart | head
    PID PPID %CPU %MEM RSS VSZ ELAPSED STARTED
    1 0 0.0 0.3 3368 125188 76-22:32:34 Sun Oct 15 15:21:14 2017
    2 0 0.0 0.0 0 0 76-22:32:34 Sun Oct 15 15:21:14 2017
    3 2 0.0 0.0 0 0 76-22:32:34 Sun Oct 15 15:21:14 2017
    5 2 0.0 0.0 0 0 76-22:32:34 Sun Oct 15 15:21:14 2017
    7 2 0.0 0.0 0 0 76-22:32:34 Sun Oct 15 15:21:14 2017
    8 2 0.0 0.0 0 0 76-22:32:34 Sun Oct 15 15:21:14 2017
    9 2 0.0 0.0 0 0 76-22:32:34 Sun Oct 15 15:21:14 2017
    10 2 0.0 0.0 0 0 76-22:32:34 Sun Oct 15 15:21:14 2017
    12 2 0.0 0.0 0 0 76-22:32:34 Sun Oct 15 15:21:14 2017
  2. 查看ID号为1的进程的pid,准确启动时间,命令行:

    1
    2
    3
    [root@vps ~]# ps -p 1 -o pid,lstart,comm
    PID STARTED COMMAND
    1 Sun Oct 15 15:21:14 2017 systemd

根据参数对ps输出进行排序: ps [OPTIONS] –sort -parm1,+parm2 ..

可以用–sort将ps命令的输出根据特定的列进行排序。在参数前加上+(升序)或-(降序)来指定排序方式。
示例:

  1. 列出占用物理内存最多的4个进程(降序排列)

    1
    2
    3
    4
    5
    6
    [root@vps ~]# ps aux --sort -rss | head -n 5
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 328 0.0 11.5 197000 117788 ? Ss Oct15 1:12 /usr/lib/systemd/systemd-journald
    root 805 0.0 6.2 479552 63624 ? Ssl Oct15 0:23 /usr/sbin/rsyslogd -n
    root 19365 0.0 3.5 622728 36580 ? Ssl Dec16 16:47 /usr/bin/dockerd
    root 15785 0.1 1.3 128404 13724 ? Ssl Dec29 5:21 /usr/local/aegis/aegis_client/aegis_10_39/AliYunDun
  2. 列出占用CPU最多的4个进程(降序排列)

    1
    2
    3
    4
    5
    6
    [root@vps ~]# ps aux --sort -pcpu | head -n 5
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 15785 0.1 1.3 128404 13724 ? Ssl Dec29 5:22 /usr/local/aegis/aegis_client/aegis_10_39/AliYunDun
    root 1 0.0 0.3 125188 3368 ? Ss Oct15 1:09 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
    root 2 0.0 0.0 0 0 ? S Oct15 0:00 [kthreadd]
    root 3 0.0 0.0 0 0 ? S Oct15 1:05 [ksoftirqd/0]

根据进程名获取进程的ID列表:pgrep COMMAND

一般我们可以使用ps aux | grep COMMAND来获取名字为COMMAND的进程ID,但是还有一个更加简单的pgrep来获取指定名字的进程ID,pgrep后面跟的进程名可以是完整名称的一部分,与grep匹配功能一样。
示例:

  1. 找出所有和php有关的进程ID:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [root@vps ~]# pgrep "php"
    19908
    19909
    19910
    19911
    19912
    19913
    19914
    19915
    20056
    20057
    20060
    20061
    20062
    20063
    20064
    20065
  2. 指定PID输出的分隔符,默认为换行:

    1
    2
    [root@vps ~]# pgrep "php" -d ':'
    19908:19909:19910:19911:19912:19913:19914:19915:20056:20057:20060:20061:20062:20063:20064:20065
  3. 返回匹配进程的数量:

    1
    2
    [root@vps ~]# pgrep -c "php"
    16
  4. 指定进程的用户列表:

    1
    2
    [root@vps ~]# pgrep -u root "rsyslogd"
    805

使用ps过滤输出信息:ps -u/-U

  • -u euser1,euser2… 指定有效用户列表;
  • -U ruser1,ruser2… 指定真是用户列表;
    1
    2
    [root@vps ~]# ps -u root -U root -o user,pmem,pcpu | wc -l
    76

查询线程相关信息

通常线程相关的信息在ps输出中是看不到的。我们可以用选项-L在ps输出中显示线程相关的信息。这会多显示两列:LWP(lightweight process)和NLWP。LWP列是线程ID,NLWP是进程的线程数量。
示例:

  1. 查看线程数量最多的进程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@vps ~]# ps -efL --sort -nlwp | head
    UID PID PPID LWP C NLWP STIME TTY TIME CMD
    root 19365 1 19365 0 15 Dec16 ? 00:02:24 /usr/bin/dockerd
    root 19365 1 19367 0 15 Dec16 ? 00:01:27 /usr/bin/dockerd
    root 19365 1 19368 0 15 Dec16 ? 00:00:00 /usr/bin/dockerd
    root 19365 1 19369 0 15 Dec16 ? 00:00:00 /usr/bin/dockerd
    root 19365 1 19373 0 15 Dec16 ? 00:01:14 /usr/bin/dockerd
    root 19365 1 19375 0 15 Dec16 ? 00:00:00 /usr/bin/dockerd
    root 19365 1 19378 0 15 Dec16 ? 00:01:14 /usr/bin/dockerd
    root 19365 1 19379 0 15 Dec16 ? 00:02:40 /usr/bin/dockerd
    root 19365 1 19382 0 15 Dec16 ? 00:00:00 /usr/bin/dockerd
  2. 查看指定进程ID的所有线程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [root@vps ~]# ps -p 19365 -fL
    UID PID PPID LWP C NLWP STIME TTY TIME CMD
    root 19365 1 19365 0 15 Dec16 ? 00:02:24 /usr/bin/dockerd
    root 19365 1 19367 0 15 Dec16 ? 00:01:27 /usr/bin/dockerd
    root 19365 1 19368 0 15 Dec16 ? 00:00:00 /usr/bin/dockerd
    root 19365 1 19369 0 15 Dec16 ? 00:00:00 /usr/bin/dockerd
    root 19365 1 19373 0 15 Dec16 ? 00:01:14 /usr/bin/dockerd
    root 19365 1 19375 0 15 Dec16 ? 00:00:00 /usr/bin/dockerd
    root 19365 1 19378 0 15 Dec16 ? 00:01:14 /usr/bin/dockerd
    root 19365 1 19379 0 15 Dec16 ? 00:02:40 /usr/bin/dockerd
    root 19365 1 19382 0 15 Dec16 ? 00:00:00 /usr/bin/dockerd
    root 19365 1 19383 0 15 Dec16 ? 00:04:27 /usr/bin/dockerd
    root 19365 1 19384 0 15 Dec16 ? 00:00:00 /usr/bin/dockerd
    root 19365 1 19831 0 15 Dec16 ? 00:00:00 /usr/bin/dockerd
    root 19365 1 19833 0 15 Dec16 ? 00:00:00 /usr/bin/dockerd
    root 19365 1 19976 0 15 Dec16 ? 00:00:00 /usr/bin/dockerd
    root 19365 1 19978 0 15 Dec16 ? 00:03:21 /usr/bin/dockerd

查看进程的环境变量

使用ps的e参数(注意前面没有’-‘符号)可以在输出中查看该进程的环境变量,如果进程有依赖的环境变量,那么会在command列后面把该进程的环境变量也列出来。
示例:

  1. 列出进程的同时列出进程依赖的环境变量:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 由于进程比较多,这里只展示一部分
    [root@vps ~]# ps -e e
    PID TTY STAT TIME COMMAND
    19840 ? S 0:08 nginx: worker process
    19854 ? Ss 0:56 lighttpd -D -f /etc/lighttpd/lighttpd.conf PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=fe07006691c1 HOME=/var/www/localhost/htdocs
    19908 ? Ss 0:00 /usr/bin/php-cgi PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=fe07006691c1 HOME=/var/www/localhost/htdocs PHP_FCGI_CHILDREN=1
    19909 ? Ss 0:00 /usr/bin/php-cgi PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=fe07006691c1 HOME=/var/www/localhost/htdocs PHP_FCGI_CHILDREN=1
    19910 ? S 0:00 /usr/bin/php-cgi PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=fe07006691c1 HOME=/var/www/localhost/htdocs PHP_FCGI_CHILDREN=1
    19911 ? S 0:00 /usr/bin/php-cgi PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=fe07006691c1 HOME=/var/www/localhost/htdocs PHP_FCGI_CHILDREN=1
  2. 查看指定进程ID的环境变量:

    1
    2
    3
    [root@vps ~]# ps -p 19908 -f e
    UID PID PPID C STIME TTY STAT TIME CMD
    100 19908 19854 0 Dec16 ? Ss 0:00 /usr/bin/php-cgi PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=fe07006691c1 HOME=/var/www/localhost/htdocs PHP_FCGI_CHILDREN=1

动态查看进程的变化:top

top [-d 数字] | top [-bnp]

参数:

  • -d:top界面刷新时间间隔,单位为秒,默认是3s;
  • -b:已批量模式启动top,一般和-n参数一起使用,将输出结果发送到其他程序或者重定向到文件;
  • -n:与-b搭配,指定top刷新次数;
  • -p:查看指定进程资源的使用;

在top执行过程中可以使用的按键命令:

  • ?:显示在top当中可以输入的按键命令;
  • P:以CPU的使用资源排序(从大到小)显示;
  • M:以内存的使用资源(物理内存)排序(从大到小)显示;
  • N:以PID来排序(从大到小);
  • T:以进程累计使用CPU时间来排序(从大到小);
  • k:给予某个PID一个信号;
  • r(renice):给某个PID重新指定一个nice值;
  • q:退出top;

1.每秒更新一次top:

1
2
3
4
5
6
7
8
[root@vps ~]# top -d 1
top - 12:39:45 up 77 days, 21:18, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 96 total, 1 running, 95 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.5 us, 0.2 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1016396 total, 75168 free, 155720 used, 785508 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 676128 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 125188 3368 2036 S 0.0 0.3 1:09.72 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.91 kthreadd

输出结果说明:

  • 第一行:
    • 当前时间为12:39:45;
    • 服务器自开机到当前所经过的时间为77天21个小时18分;
    • 目前登陆系统的用户人数为1;
    • 系统在过去1,5,15分钟的平均负载;
  • 第二行:
    目前系统总共有96个进程,一个处于running状态,95个处于sleeping状态,0个sotped,0个僵尸进程;
  • 第三行:
    当前系统CPU的整体使用情况:
    • 0.5 us(user):运行用户进程(未调整优先级的)所占用的CPU百分比;
    • 0.2 sy(system):运行系统内核进程所占用的CPU百分比;
    • 0.0 ni(nice):运行用户进程(已经调整优先级的)所占用的CPU百分比;
    • 99.3 id(idle):目前空闲CPU百分比;
    • 0.0 wa(wait):用于等待IO完成所占的CPU百分比;
    • 0.0 hi(hard interrupt):处理硬件中断所占CPU百分比;
    • 0.0 si(soft interrupt):处理软件中断所占CPU百分比;
    • 0.0 st(steal):虚拟机被hypervisor偷去的CPU百分比;
  • 第四行和第五行:
    物理内存及虚拟内存的使用情况;
  • 第六行:
    在top中输入按键命令时的状态显示栏;
  • PID:进程ID;
  • USER:进程的拥有者;
  • PR:Priority的缩写,进程优先执行顺序,数值越小越优先;
  • NI:Nice的缩写,与Priority有关,也是数值越小越优先;
  • VIRT:进程使用虚拟内存大小;
  • RES:进程使用物理内存大小;
  • SHR:进程使用共享内存大小;
  • S:进程状态
    • D - 不可中断的睡眠态;
    • R - 运行态;
    • S - 睡眠态;
    • T - 可被跟踪或已停止;
    • Z - 僵尸态;
  • %CPU:CPU使用率;
  • %MEM:内存使用率;
  • TIME+:任务启动后到现在所使用的CPU累计时间,精确到百分之一秒;
  • COMMAND:运行进程的命令;

2.将top的结果输出到文件:

1
[root@vps ~]# top -b -n 1 > tmp.txt

3.查看指定进程ID的资源使用情况:

1
2
3
4
5
6
7
8
[root@vps ~]# top -p 328
top - 13:49:12 up 77 days, 22:27, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 0.3 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1016396 total, 70508 free, 160188 used, 785700 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 671588 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 328 root 20 0 205192 119256 118896 S 0.0 11.7 1:13.09 systemd-journal

查看进程树:pstree

如果需要查看进程之间的关系,可以使用pstree命令查看进程树,进程树以树状的形式显示进程之间的关系,每个节点的子节点为子进程。

pstree [-A|U] [-up]
参数:

  • -A:各进程树之间的连接以ASCII字符连接;
  • -U:各进程树之间的连接以utf9字符来连接;
  • -p:同时列出进程的PID;
  • -u:同时列出进程的用户名称;
  1. 列出当前系统所有的进程树:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    从输出中可以看出,相同名称的进程并没有展开,而是用数字表示个数
    [root@vps ~]# pstree
    systemd─┬─AliYunDun───14*[{AliYunDun}]
    ├─AliYunDunUpdate───3*[{AliYunDunUpdate}]
    ├─agetty
    ├─aliyun-service
    ├─atd
    ├─auditd───{auditd}
    ├─crond
    ├─dbus-daemon
    ├─dhclient
    ├─dockerd─┬─docker-containe─┬─docker-containe─┬─nginx───nginx
    │ │ │ └─8*[{docker-containe}]
    │ │ ├─2*[docker-containe─┬─lighttpd───4*[php-cgi───php-cgi]]
    │ │ │ └─8*[{docker-containe}]]
    │ │ ├─docker-containe─┬─entrypoint.sh───ss-server
    │ │ │ └─8*[{docker-containe}]
    │ │ └─12*[{docker-containe}]
    │ ├─4*[docker-proxy───3*[{docker-proxy}]]
    │ ├─docker-proxy───4*[{docker-proxy}]
    │ └─14*[{dockerd}]
    ├─lvmetad
    ├─ntpd
    ├─polkitd───5*[{polkitd}]
    ├─rsyslogd───2*[{rsyslogd}]
    ├─sshd─┬─sshd───bash
    │ └─sshd───bash───pstree
    ├─systemd-journal
    ├─systemd-logind
    ├─systemd-udevd
    └─tuned───4*[{tuned}]
  2. 列出进程树的同时列出PID及所属用户名:

    1
    2
    3
    4
    5
    6
    7
    此时相同进程名的进程会展开,并显示对应的PID,结果内容比较多,只列出一小部分。
    [root@vps ~]# pstree -up
    ...
    └─tuned(803)─┬─{tuned}(1056)
    ├─{tuned}(1057)
    ├─{tuned}(1059)
    └─{tuned}(1064)
  3. 列出指定进程的进程树:
    要查看指定进程的进程树直接在pstree命令后面跟PID即可:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@vps ~]# pstree 19365
    dockerd─┬─docker-containe─┬─docker-containe─┬─nginx───nginx
    │ │ └─8*[{docker-containe}]
    │ ├─2*[docker-containe─┬─lighttpd───4*[php-cgi───php-cgi]]
    │ │ └─8*[{docker-containe}]]
    │ ├─docker-containe─┬─entrypoint.sh───ss-server
    │ │ └─8*[{docker-containe}]
    │ └─12*[{docker-containe}]
    ├─4*[docker-proxy───3*[{docker-proxy}]]
    ├─docker-proxy───4*[{docker-proxy}]
    └─14*[{dockerd}]

进程的管理

在linux中,进程主要通过kill或者killall命令来管理,通过给某个进程发送信号来实现。目标进程根据接收到的信号类型,做出相应的动作。

使用kill命令来管理进程

命令格式:kill -signal [PID|%jobnumber]

signal:信号的名称或者名称对应的数字
kill命令后面可以跟PID或者%jobnumber,如果跟的是PID则表示给某个进程发送信号,
如果跟的是%jobnumber,则表示给某个job id发送信号,两者是不一样的。

1.查看当前系统所支持的所有信号的名称及对应的信号ID:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@vps ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

2.正常结束ID号为5781的进程:

1
2
3
4
#通过指定信号ID方式发送信号
[root@vps ~]# kill -15 5781
#通过信号民初方式发送信号
[root@vps ~]# kill -SIGTERM 5781

使用killall命令来管理进程

命令格式:killall -signal [comm]
killall后面跟的为启动进程的命令名称,不需要指定PID,如果知道进程的名字,有时候这种方式比较方便。

参数:

  • -i(interactive) 交互式的,若需要删除时,会出现提示符给用户;
  • -e(exect) 表示后面接的comm要一致,但整个完整的命令不能超过15个字符;
  • -I 命令名称忽略大小写

强制终止所有以httpd启动的进程:

1
killall -9 httpd

Vim使用技巧

发表于 2017-12-17 | 分类于 Linux

基本技巧

  1. 各种插入模式

    • a 在光标后插入
    • o 在当前行后插入新行
    • O 在当前行前插入新行
    • cw 删除当前光标到单词的结尾
  2. 简单移动光标

    • 0 移动光标到行头
    • ^ 到本行第一个不是blank字符的位置
    • $ 到行末
    • g_ 到本行第一个不是blank字符的位置
    • /pattern 搜索pattern的字符串
  3. 拷贝/粘贴

    • p 粘贴
    • yy 拷贝当前行
  4. Undo/Redo

    • u undo
    • ctrl+r redo
  5. 打开/保存/退出/改变文件

    • :e <path/to/file> 打开一个文件
    • :w 存盘
    • :saveas <path/to/file> 另存为<path/to/file> ,这个功能很实用,在不需要cp的情况下可以直接打开文件另存为则可以得到新的文件
    • :x,ZZ或:wq 保存并退出(:x 表示仅在需要时保存,ZZ不需要输入冒号并回车即可保存并退出)
    • :q! 退出不保存
    • :qa! 强行退出所有的正在编辑的文件
    • :bn和:bp 可以同时打开很多个文件,使用这两个命令来切换下一个或上一个文件

进阶技巧

  1. 命令的重复执行

    • .(小数点) 重复上一次的命令
    • N<command> 重复某个命令N次
    • 2dd 删除2两行
  2. 高效地移动光标

    • NG 光标到第N行,或者也可以:N
    • gg 到第一行
    • G 到最后一行
    • w 到下一个单词的开头
    • e 到下一个单词的结尾
      如果你认为单词是由默认方式,那么就用小写的e和w。默认上来说,一个单词由字母,数字和下划线组成
      如果你认为单词是由blank字符分隔符,那么你需要使用大写的E和W
    • % 匹配括号移动,包括(,{,[ 如果直接在行上按%会自动找到括号
    • * 匹配光标当前所在的单词,移动光标到下一个匹配的单词
    • # 匹配光标当前所在的单词,移动光标到上一个匹配的单词
  3. 大小写转换

    • gU 变大写
    • gu 变小写
    • shift+v gU 将当前行变为大写
    • shift+v gu 将当前行变为小写
  4. 将文本内容全部删除

    • gg–>d–>G
      解释一下:gg先跳到文本第一行,d表示删除,G表示跳到文本最后一行,组合起来表示删除文本的第一行到最后一行,即文本内容全部删除。
  5. 在当前行上移动光标

    • fa 到下一个为a的字符处,你也可以fs到下一个为s的字符
    • t, 到逗号前的第一个字符。逗号可以变成其它字符
    • 3fa 在当前行查找第三个出现的a
    • F和T 和f和t一样,只不过是相反方向
    • dt” 删除所有内容,直到遇到引号
  6. 块操作:ctrl+v

    块操作可以说是最实用的技巧了,典型的操作:ctrl+v–>ctrl+d–>I–>[ESC]

    • 0 到行头
    • ctrl+v 开始块操作
    • ctrl+d 向下移动(你也可以使用hjkl来移动光标,或是使用%,或是别的)
    • I-- [ESC] I是插入,插入“–”,按ESC键来为每一行生效

    1.给选中的行前面添加#字符

    • 按下ctrl+v
    • 按光标移动键选中行
    • 输入大写的I
    • 输入字符#
    • 按[ESC]使得每一行生效

    2.给选中的行后面面添加#字符

    • 按下ctrl+v
    • 按光标移动键选中行(可以配合$符号操作)
    • 输入大写的A
    • 输入字符#
    • 按[ESC]使得每一行生效
  7. 自动提示

    在Insert模式下,可以输入一个词的开头,然后按ctrl+p或者ctrl+n
    自动补全功能就出现了

  8. 可视化选择

    使用ctrl+v或者shift+v选中后,可以进行如下操作:

    • J 把选中的行连接起来(变成一行)
    • <或> 左右缩进
    • =自动缩进

Linux Job Control机制

发表于 2017-12-17 | 分类于 Linux

基本概念

在单一终端机下同时进行多个工作的行为管理称为Job Control。其实说的简单点就是在一个登录窗口下可以同时进行多个工作任务,比如我们在登录bash后,想要一边复制文件一边进行数据查找,一边进行编译,还可以一边进行vi程序编写。其实这些工作可以同时在一个shell中进行,这时就需要了解下linux的job control的使用。

如何进行job control管理

那么如何进程linux job control管理,要进行job control管理,需要通过job控制命令来进行,下面一一介绍job control相关的命令:

  1. 直接将命令丢到后台中执行的&:
    命令后面跟&符号可以将命令的执行丢到后台去执行,不需要等待当前命令结束后才可以继续执行其他命令,这样就可以实现在同一bash下进行多个任务了,注意这里所说的是丢到后台执行,不是在后台挂起。举例如下,将5个sleep程序丢到后台执行:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200 &
    [1] 22362
    [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200 &
    [2] 22363
    [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200 &
    [3] 22364
    [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200 &
    [4] 22365
    [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200 &
    [5] 22366
    [root@iZj6c43t8c5urd16vueux0Z ~]#
    [1] Done sleep 200
    [2] Done sleep 200
    [3] Done sleep 200
    [4]- Done sleep 200
    [5]+ Done sleep 200

    可以看出每将一个任务丢到后台执行后,都会输出用中括号扩起来的job id以及该命令的PID,格式为:[job number] PID,在任务完成后会输出提示信息,表示该任务的完成状态,格式为:[job number] 任务完成状态 任务命令行,在上面输出中,后面两个任务的job id后面分别有个-和+这两个符号,+代表这个任务是最新添加的,-代表最近最后第二个被放置到后台的任务,如果超过最后第三个以后的任务,就不会有+/-符号的存在了,Done表示任务完成,sleep 200表示这个任务的命令行。

  2. 将目前的工作丢到后台中暂停:[ctrl]-z:
    有时候我们可能需要将当前的工作暂时挂起(暂停执行),需要在同一shell下临时处理其他工作。比如我正用vim编辑一个文件,突然想起要看下系统当前时间是几点了,这时就可以先将vim挂起到后台,然后执行date命令查看时间,完了后再将挂起的工作唤醒,继续工作。举例如下:

    1
    2
    3
    4
    5
    6
    [root@iZj6c43t8c5urd16vueux0Z ~]# vim hello.sh  # 打开文件编辑,按ctrl+z将vim暂时挂起,执行其他命令

    [1]+ Stopped vim hello.sh # 表示已将vim挂到后台,处于暂停状态
    [root@iZj6c43t8c5urd16vueux0Z ~]# date # 此时可以执行其他任何命令
    Sun Dec 17 13:02:15 CST 2017
    [root@iZj6c43t8c5urd16vueux0Z ~]# fg # 执行fg将最近添加到后台的任务唤到前台来执行,在此执行fg继续vim编辑,关于这个命令的使用后面会介绍
  3. 查看目前的后台工作状态:jobs:
    如果想要知道目前有多少个工作在后台当中,就可以用jobs命令来查看。

    jobs:

    • -l 除了列出job number与命令串之外,同时列出PID的号码;
    • -r 仅列出正在后台run的工作;
    • -s 仅列出正在后台暂停(stop)的工作
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200 &
      [1] 22610
      [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200 &
      [2] 22611
      [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200
      ^Z
      [3]+ Stopped sleep 200
      [root@iZj6c43t8c5urd16vueux0Z ~]# jobs
      [1] Running sleep 200 &
      [2]- Running sleep 200 &
      [3]+ Stopped sleep 200
      [root@iZj6c43t8c5urd16vueux0Z ~]# jobs -l
      [1] 22610 Running sleep 200 &
      [2]- 22611 Running sleep 200 &
      [3]+ 22612 Stopped sleep 200
      [root@iZj6c43t8c5urd16vueux0Z ~]# jobs -r
      [1] Running sleep 200 &
      [2]- Running sleep 200 &
      [root@iZj6c43t8c5urd16vueux0Z ~]# jobs -s
      [3]+ Stopped sleep 200
  4. 将后台工作拿到前台来处理:fg:
    在前面的命令当中都是将job放到后台中处理,如果需要将后台中的job放到前台中执行,可以用fg命令。命令格式为:fg %jobnumber,注意:那个%是可选的。如果直接执行fg,后面不加jobnumber,则默认将最后放到后台的job调到前台,如果要指定要将需要的job调到前台,则可以先用jobs获取到jobnumber,然后fg指定需要的jobnumber即可将对应的job调到前台。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200 &
    [4] 22640
    [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200 &
    [5] 22641
    [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200
    ^Z
    [6]+ Stopped sleep 200
    [root@iZj6c43t8c5urd16vueux0Z ~]# jobs
    [3]- Stopped sleep 200
    [4] Running sleep 200 &
    [5] Running sleep 200 &
    [6]+ Stopped sleep 200
    [root@iZj6c43t8c5urd16vueux0Z ~]# fg 5 # 将5号job调到前台来执行
    sleep 200
  5. 让工作在后台下的状态变成运行中(Running):bg:
    通过前面的介绍我们知道ctrl+z可以将一个job在后台暂停,状态为Stopped,那么如何将这个暂停的后台job变成Running状态呢,同时该job还在后台。我们可以用bg命令实现,命令格式为:bg %jobnumber,注意:那个%是可选的。和fg类似,直接执行bg,后面不加jobnumber,则默认将最后放到后台的job的状态变为Running。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 20
    ^Z # 按下ctrl+z将该命令挂起到后台
    [1]+ Stopped sleep 20
    [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 20
    ^Z # 按下ctrl+z将该命令挂起到后台
    [2]+ Stopped sleep 20
    [root@iZj6c43t8c5urd16vueux0Z ~]# jobs # 查看当前后台job的状态
    [1]- Stopped sleep 20
    [2]+ Stopped sleep 20
    [root@iZj6c43t8c5urd16vueux0Z ~]# bg # 将最近的添加到后台的job变为Running
    [2]+ sleep 20 &
    [root@iZj6c43t8c5urd16vueux0Z ~]# jobs
    [1]+ Stopped sleep 20
    [2]- Running sleep 20 & #可以看出job号为2的job状态已经变为Running
  6. 管理后台的job:kill:
    如果想要删除某个job或者将该job重新启动,可以用kill命令来实现,用kill来给job一个信号(signal)。命令格式为:kill -signal %jobnumber,注意这里是jobnumber,不是PID,当然用PID也可以删除job。

    kill:

    • -l 列出目前kill能够使用的信号有哪些
    • -1 重新读取一次参数的配置文件(类似reload)
    • -2 代表由键盘输入ctrl+c同样的操作
    • -9 立刻强制删除一个job,一般用来终止一个异常程序
    • -15 以正常的程序方式终止一个job。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200 &
      [1] 22701 #后台Running
      [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200 &
      [2] 22702 # 后台Running
      [root@iZj6c43t8c5urd16vueux0Z ~]# sleep 200
      ^Z # ctrl+z 后台暂停
      [3]+ Stopped sleep 200
      [root@iZj6c43t8c5urd16vueux0Z ~]# jobs
      [1] Running sleep 200 &
      [2]- Running sleep 200 &
      [3]+ Stopped sleep 200
      [root@iZj6c43t8c5urd16vueux0Z ~]# kill -15 %3 # 注意,这里必须得加%,表示job号码,为了区分jobnumber和PID

      [3]+ Stopped sleep 200
      [root@iZj6c43t8c5urd16vueux0Z ~]# jobs
      [1] Running sleep 200 &
      [2]- Running sleep 200 &
      [3]+ Terminated sleep 200 # 3号job已删除
      [root@iZj6c43t8c5urd16vueux0Z ~]# jobs
      [1]- Running sleep 200 &
      [2]+ Running sleep 200 &
  7. 脱机管理问题:
    需要注意的是上面所说的将job放到后台并不是放到系统的后台去,只是放到当前shell环境的后台,在这种情况下,如果你以远程的连接方式连接到你的Linux主机,并且将job以&的方式放到后台去,当exit退出终端后,后台执行的job将会被中断。可以自己做个实验验证,在此不试验了。那么如何实现将job正真放到系统后台呢,即使exit退出终端job还可以继续工作。其实很简单,用nohup命令配合&即可,示例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [root@iZj6c43t8c5urd16vueux0Z ~]# nohup sleep 200 &
    [1] 22721
    [root@iZj6c43t8c5urd16vueux0Z ~]# nohup: ignoring input and appending output to ‘nohup.out’

    [root@iZj6c43t8c5urd16vueux0Z ~]# ps aux | grep sleep | grep -v grep
    root 22721 0.0 0.0 107892 604 pts/1 S 15:21 0:00 sleep 200
    [root@iZj6c43t8c5urd16vueux0Z ~]# exit # 退出终端
    logout
    Connection to 47.91.229.209 closed.
    # haohao @ MacBook-Pro-8 in ~ [15:23:15]
    $ sh hk.sh # 重新登录, 查看进程是否还在
    [root@iZj6c43t8c5urd16vueux0Z ~]# ps aux | grep sleep | grep -v grep
    root 22721 0.0 0.0 107892 604 ? S 15:21 0:00 sleep 200
    # 可以看出进程依然存在,并没有终止

总结

有了job control机制,我们可以灵活地同时在一个终端窗口执行多个任务,不需要打开多个终端来实现多任务,提高了工作的效率。另外还可以随时查看和管理后台job的状态,不过job control只适用于当前工作的shell环境,如果退出shell环境,那么所有的job都将退出,所以如果需要某个job永久在后台执行,不依赖于当前shell环境的存活,可以使用nohup来将任务放到系统后台来执行。

手动进行主机DNS配置

发表于 2017-12-09 | 分类于 DNS

本文介绍了如何手动进行主机DNS配置,有时候机器服务提供商不提供DHCP服务,或者由于错误的DNS配置导致服务器无法解析域名,此时就需要检查下服务器的DNS配置并配置正确的nameserver,首先介绍几个和DNS有关的配置文件:

  • /etc/hosts:本地域名到IP的映射文件,一般默认Linux域名与IP的对应解析以此文件优先;
  • /etc/resolv.conf:ISP的DNS服务器IP地址,本文件定义了本机进行域名解析请求的地址;
  • /etc/nsswitch.conf:这个文件则是来决定先要使用/etc/hosts还是/etc/resolv.con的配置。文件中hosts字段定义了优先使用哪个文件来进行DNS解析,其中”files”就是使用/etc/hosts,而后面的”dns”则是使用/etc/resolv.conf的DNS服务器来进行解析:
    1
    2
    #hosts:     db files nisplus nis dns
    hosts: files dns myhostname

一般情况下是不需要自己手动修改主机DNS的配置的,除非机器提供商不提供DHCP服务,或者本机DNS配置有问题,导致无法进行域名解析才需要手动配置,以下是配置方法:

修改/etc/resolv.conf,添加能访问通的DNS服务器地址,以下示例修改成Google的DNS服务器地址:

1
2
nameserver 8.8.8.8 #主DNS地址
nameserver 8.8.4.4 #备用DNS地址,在主的失效时启用备的,当然还可以添加更多的地址

⚠️注意:尽量不要设置超过3台以上的DNS IP在/etc/resolv.conf中,如果是你的局域网出问题,会导致无法连接到DNS服务器,那么你的主机还是会向每台DNS服务器发出连接请求,每次连接都有timeout时间的等待,会导致浪费非常多的时间。

Python从单元素字典中获取key和value

发表于 2017-12-03 | 分类于 Python

之前写代码很多时候会遇到这么一种情况:在python的字典中只有一个key/value键值对,想要获取其中的这一个元素还要写个for循环获取。网上搜了一下,发现还有很多简单的方法:

  • 方法一

    1
    2
    d = {'name':'haohao'}
    (key, value), = d.items()
  • 方法二

    1
    2
    3
    d = {'name':'haohao'}
    key = list(d)[0]
    value = list(d.values())[0]
  • 方法三

    1
    2
    3
    d = {'name':'haohao'}
    key, = d
    value, = d.values()

参考自stackoverflow讨论:
https://stackoverflow.com/questions/15366482/how-to-fetch-the-key-value-pair-of-a-dictionary-only-containing-one-item

shell多进程并发编程

发表于 2017-12-03 | 分类于 Shell脚本

在shell中使用多进程并发处理是非常方便的,如果有一个定时任务是同时ping主机ip列表,检测目标机器是否down掉,就可以用shell的多进程来实现,同时ping多个主机,不影响定时任务的执行。shell的实现方式是通过 & 符号来使要执行的进程后台执行,然后主调shell通过wait来等待所有后台执行完毕,然后退出主调shell。以下是一个心跳检测脚本,通过ping来批量检测机器是否可达,如果不可达则启用备用机器的服务,并发送微信报警。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

cd ~/scripts
# $1:host $2:server_type $3:port $4=start_server
# 将要执行的过程封装成函数
function heartbeat_detection() {
ping_loss=`ping -c 6 $1 | grep "100% packet loss"`
Date=`date +"%Y-%m-%d %H:%M:%S"`
if [ -z "$ping_loss" ]; then
echo -e "Date: $Date|Host: $1|Monitor: Ping is ok." >> monitor_result.log
else
echo -e "Date: $Date|Host: $1|Problem: Unreachable for 2 minutes..." >> monitor_result.log
python wechat_alert/wechat_alert.py "@all" "`Date: date +%F %H:%M:%S` Host:$1 Server_type:$2 Status:Down..."
service_port=`netstat -lnp | grep $3 | awk '{print $NF}' | awk -F '/' '{print $1}'`
if [ -z $service_port ]; then
sh $4
fi
fi
}

for item in $(cat srv_list)
do
host=`echo $item | awk -F '|' '{print $1}'`
server_type=`echo $item | awk -F '|' '{print $2}'`
port=`echo $item | awk -F '|' '{print $3}'`
start_server=`echo $item | awk -F '|' '{print $4}'`
# 后台执行任务(非阻塞)
heartbeat_detection $host $server_type $port $start_server &
done
# 等待所有后台任务完成(阻塞)
wait
Date=`date +"%Y-%m-%d %H:%M:%S"`
echo -e "Date: $Date|Heartbeta detection finished..."

常用软件包安装

发表于 2017-12-03 | 分类于 Linux

常用软件包安装:

  • dig命令安装

    1
    sudo yum install bind-utils
  • pip一键安装

    1
    wget https://bootstrap.pypa.io/get-pip.py &&  sudo python get-pip.py && rm -f get-pip.py
  • pstree命令安装

    1
    sudo yum install psmisc
  • python socks包安装

    1
    sudo pip install PySocks

公网IP查询

发表于 2017-12-03 | 分类于 Linux

通过命令行查看机器公网IP:

1
2
3
4
curl ip.cn
curl icanhazip.com
curl ipinfo.io/ip
curl ipecho.net/plain

1…121314

haohao

Talk is cheap. Show me the code.

134 日志
35 分类
43 标签
GitHub CSDN 开源中国 E-Mail
© 2017 — 2021 haohao
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.3
访问人数 总访问量 次