数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

「深度学习福利」大神带你进阶工程师,立即查看>>>
sysctl.sh
#!/bin/bash
sysctl -w net.unix.max_dgram_qlen=100
sysctl -w net.ipv4.conf.default.rp_filter=1
sysctl -w net.ipv4.conf.default.accept_source_route=0
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_tw_buckets=360000
sysctl -w net.ipv4.tcp_sack=1
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w 'net.ipv4.tcp_rmem=4096 87380 4194304'
sysctl -w 'net.ipv4.tcp_wmem=4096 16384 4194304'
sysctl -w net.core.wmem_default=8388608
sysctl -w net.core.rmem_default=8388608
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.core.netdev_max_backlog=262144
sysctl -w net.core.somaxconn=262144
sysctl -w net.ipv4.tcp_max_orphans=3276800
sysctl -w net.ipv4.tcp_max_syn_backlog=262144
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_synack_retries=1
sysctl -w net.ipv4.tcp_syn_retries=1
sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_keepalive_probes=3
sysctl -w net.ipv4.tcp_keepalive_intvl=15
sysctl -w net.ipv4.tcp_retries2=5
sysctl -w 'net.ipv4.tcp_mem=94500000 915000000 927000000'
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_keepalive_time=300
sysctl -w vm.swappiness=10
sysctl -w net.netfilter.nf_conntrack_max=1048576
sysctl -w net.netfilter.ip_conntrack_tcp_timeout_established=3600
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_close_wait=60
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_fin_wait=120
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=120
sysctl -w sunrpc.tcp_slot_table_entries=128
系统运维
2019-11-25 15:24:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的 脚本 语言。

Python3 可应用于多平台包括 Windows、 Linux 和 Mac OS X。
Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)
Win 9x/NT/2000
Macintosh (Intel, PPC, 68K)
OS/2
DOS (多个DOS版本)
PalmOS
Nokia 移动手机
Windows CE
Acorn/RISC OS
BeOS
Amiga
VMS/OpenVMS
QNX
VxWorks
Psion
Python 同样可以移植到 Java 和 .NET 虚拟机上。
Python3 下载
Python3 最新源码,二进制文档,新闻资讯等可以在 Python 的官网查看到:
Python 官网:https://www.python.org/
你可以在以下链接中下载 Python 的文档,你可以下载 HTML、PDF 和 PostScript 等格式的文档。
Python文档下载地址:https://www.python.org/doc/
Python 安装
Python 已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。
您需要下载适用于您使用平台的二进制代码,然后安装 Python。
如果您平台的二进制代码是不可用的,你需要使用C编译器手动编译源代码。
编译的源代码,功能上有更多的选择性, 为 Python 安装提供了更多的灵活性。
以下是各个平台安装包的下载地址:
Source Code 可用于 Linux 上的安装。
以下为Unix & Linux平台上安装 Python3 的方法。
Unix & Linux 平台安装 Python3:
以下为在 Unix & Linux 平台上安装 Python 的简单步骤:
打开WEB浏览器访问 https://www.python.org/downloads/source/
选择适用于 Unix/Linux 的源码压缩包。
下载及解压压缩包 Python-3.x.x.tgz,3.x.x 为你下载的对应版本号。
如果你需要自定义一些选项修改 Modules/Setup
以 Python3.6.1 版本为例: # tar -zxvf Python-3.6.1.tgz # cd Python-3.6.1 # ./configure # make && make install
检查 Python3 是否正常可用: # python3 -V Python 3.6.1
本文原创地址: https://www.linuxprobe.com/python3-environment-setup.html
系统运维
2019-11-25 13:55:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
设置工程编码为UTF-8,其他都不需要设置 chcp 936 java -jar xxx.jar
系统运维
2019-11-23 11:42:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
shell脚本编程进阶
循环
编程中的逻辑处理:
顺序执行
选择执行
循环执行
循环执行
将某代码段重复运行多次
重复运行多少次
循环次数事先已知
循环次数事先未知
有进入条件和退出条件
for, while, until
for, while, until 这些都是关键字
for 循环
help for 查看帮助信息 for: for NAME [in WORDS ... ] ; do COMMANDS; done
for 变量名 in 列表;do
循环体
done
执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直
到列表中的元素耗尽,循环结束
列表生成方式:
(1) 直接给出列表
(2) 整数列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob,如:*.sh
(5) 变量引用
$@, $*
举例: //打印 [root@CentOS7 scripts]# for i in 1 a Z;do echo abc;done [root@CentOS7 scripts]# for i in 1 2 333;do echo $i;done [root@CentOS7 scripts]# for i in {1..10};do echo $i;done [root@CentOS7 scripts]# for i in {10..5};do echo $i;done [root@CentOS7 scripts]# for i in {10..5..2};do echo $i;done [root@CentOS7 scripts]# for i in `seq 10 -3 1`;do echo $i;done // "*.txt" 与 *.txt [root@CentOS7 data]# for file in "*.txt";do echo filename is $file;done filename is f10.txt f1.txt f2.txt f3.txt f4.txt f5.txt f6.txt f7.txt f8.txt f9.txt [root@CentOS7 data]# for file in *.txt;do echo filename is $file;done filename is f10.txt filename is f1.txt filename is f2.txt filename is f3.txt filename is f4.txt filename is f5.txt filename is f6.txt filename is f7.txt filename is f8.txt filename is f9.txt // "$*" 与 "$@" [root@CentOS7 scripts43]# cat for_test.sh #!/bin/bash # for i in "$*";do echo arg is $i done [root@CentOS7 scripts43]# sh for_test.sh a b c arg is a b c [root@CentOS7 scripts43]# cat for_test1.sh #!/bin/bash # for i in "$@";do echo arg is $i done [root@CentOS7 scripts43]# sh for_test1.sh a b c arg is a arg is b arg is c //从1加到100的和 [root@CentOS7 scripts43]# cat 1-100.sh #!/bin/bash # sum=0 for i in {1..100};do let sum+=$i done ADD=`echo -n {1..100}|tr -s ' ' '+'` echo "$ADD=$sum" //100以内奇数的和 [root@CentOS7 scripts43]# cat even1.sh #!/bin/bash # declare -i sum=0 for i in {1..100};do if [ $[i%2] -eq 1 ];then let sum+=i fi done echo sum=$sum //创建用户user1-user10,密码随机,第一次用户登陆时必须改密码 [root@CentOS7 scripts43]# cat adduser1-10.sh #!/bin/bash # for i in {1..10};do // `cat userlist`,一个变量(一行一个用户) user=`echo user$i` password=`tr -dc '[:alnum:]' < /dev/urandom|head -c12` useradd $user echo $user:$password |tee -a user.list|chpasswd passwd -e $user echo "User:$user is create" done //删除新建的用户 for user in `sed -nr '/^alice/,$s/^([^:]+).*/\1/p' /etc/passwd`;do userdel -r $user;done //将文件名后缀改为 hml [root@CentOS7 test]# ls 1.txt 2.log 3.html [root@CentOS7 test]# for i in `ls -1`;do mv $i `echo $i|sed -r 's@\..*$@@'`.hml;done //查看在线主机 [root@CentOS7 scripts]# cat ping.sh #!/bin/bash # NETID=192.168.1 for HOSTID in {1..254};do { if ping -c1 -W1 $NETID.$HOSTID >/dev/null;then echo "$NETID.$HOSTID is up"|tee -a iplist.txt fi } & done wait //打印闪烁的**矩形(每个*的颜色随机) [root@CentOS7 scrips43]# [root@CentOS7 scrips43]# cat for_test.sh #!/bin/bash # read -p "please input row: " ROW read -p "please input column: " COLUMN COLOR="\033[" for i in `seq $ROW`;do for j in `seq $COLUMN`;do echo -e "${COLOR}$[$RANDOM%7+31];1;5m*\033[0m\c" done echo done // 九九乘法表(第一个数为列的编号,第二个数为行的编号,行号与列的最大值相等) [root@CentOS7 scrips43]# cat for_9x9.sh #!/bin/bash # for i in {1..9};do for j in `seq $i`;do echo -e "$j*$i=$[j*i]\t\c" done echo done // tac 九九乘法表 [root@CentOS7 scrips43]# cat for_tac_9x9.sh #!/bin/bash # for i in {9..1};do for j in `seq $i`;do echo -e "$j*$i=$[j*i]\t\c" done echo done
c风格的 for 循环
//c风格for循环,打印1到100的和 [root@CentOS7 scrips43]# cat c_for_1-100.sh #!/bin/bash # declare -i sum=0 for((i=1;i<=100;i++));do // 100 可以用变量来代替 let sum+=i done echo sum=$sum [root@CentOS7 scrips43]# cat c_for_1-100.sh #!/bin/bash # for((sum=0,i=1;i<=100;i++));do let sum+=i done echo sum=$sum //c风格for循环,九九乘法表 [root@CentOS7 scrips43]# cat c_9x9.sh #!/bin/bash # for((i=1;i<=9;i++));do for((j=1;j<=i;j++));do echo -e "$j*$i=$[j*i]\t\c" done echo done
打印一个等腰三角形

[root@CentOS7 scrips43]# cat triangle.sh #!/bin/bash # read -p "please input row: " ROW for((i=1;i<=ROW;i++));do for((j=1;j<=ROW-i;j++));do echo -e " \c" done for((x=1;x<=i*2-1;x++));do echo -e "*\c" done echo done

while 循环
while CONDITION; do 循环体;done
CONDITION: 循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为 true,则执行一次循环;直到条件测试状态为 false 终止循环。
因此:CONDITION 一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
进入条件:CONDITION为 true
退出条件:CONDITION 为 false //随机生成10个数字,打印最大值和最小值 [root@CentOS7 scrips43]# cat while_max_min.sh #!/bin/bash # MAX=$RANDOM MIN=$MAX i=1 while [ $i -lt 10 ];do N=$RANDOM echo $N if [ $N -gt $MAX ];then MAX=$N elif [ $N -lt $MIN ];then MIN=$N fi let i++ done echo max=$MAX,min=$MIN
能够判断某个服务是正常工作的,如果这个服务出现异常,我们希望把对应的服务启动起来 yum install php-fpm -y service php-fpm start vim /data/scripts/monitor_php-fpm.sh killall php-fpm bash while_monitor_php-fpm.sh 应该放在一个 screen中在后台运行 这个脚本 查看日志
until 循环
until CONDITION;do (与条件相反时才执行)
循环体
done
continue ; break ; exit ; continue 2 ;break 2; continue,break 都可用在循环中 continue表示结束此次循环,继续下一次循环 break表示结束一轮循环,退出当前循环 exit表示退出程序 continue 2 表示结束当前循环的外层循环 break 2 表示退出当前循环的外层循环
循环控制 shift 命令 shift [n] 用于将参量列表左移指定次数,缺省为左移一次 参量列表一旦被移动,最左端的那个参数就从列表中删除。while循环遍历位置参量列表时,常用到 shift
创建无限循环 while:;do 循环体;done until false;do 循环体;done
信号捕捉 trap trap 'cmd' signal_spec ... // 进程收到系统发出的指定信号后,将执行自定义指令,而不会执行原操作 trap '' signal_spec ... // 忽略信号的操作 trap '-' signal_spec ... // 恢复信号的操作 trap -p // 列出自定义信号操作 trap finish exit // 当脚本退出(异常或正常)时,执行 finish函数
函数,信号命令写在操作之前

数组
索引数组: declare -a array 数组的声明 array[0]=value1 array[1]=value2 ... 数组的赋值 array=( value1 value2 value3 ... ) array=([0]=value1 [3]=value2 ...) read -a array 交互式方式 echo ${array[0]} 数组的第一个元素的值 echo ${array[*]} 数组的所有元素的值 echo ${array[@]} echo ${#array[@]} 数组元素的个数 array=({a..z}) 调用命令给数组赋值 unset array 删除数组 unset array[index] 删除数组的某个元素 declare -a 查看数组 echo ${!array[@]} 查看数组的所有下标 array[${#array[@]}]=value 向稠密数组中添加元素 数组的遍历
关联数组: declare -A ARRAY ARRAY=([index1]=value1 [index2]=value2 [index3]=value3 ...) 数组的遍历同关联数组一样
数组切片: ${array[@]:offset:number} offset 要跳过的元素个数 number 要取出的元素个数 ${array[@]:offset} 取偏移量之后的所有元素
脚本练习 # 磁盘使用率达到 20% 时报警 #!/bin/bash # declare -A DISK WARNING=20 df |sed -rn '/^\/dev\/sd/s@^([^[:space:]]+).* ([0-9]+)%.*@\1 \2@p' > diskspace.txt while read line;do index=`echo $line|cut -d' ' -f1` DISK[$index]=`echo $line|cut -d' ' -f2` if [ ${DISK[$index]} -gt $WARNING ];then echo -e "\033[1;31mdisk $index will be full,$index use ${DISK[$index]}%\033[0m" fi done < diskspace.txt //随机生成10个数字,找出最大值和最小值 #!/bin/bash # declare -a RAND for((i=0;i<10;i++));do RAND[$i]=$RANDOM if [ $i -eq 0 ];then MAX=${RAND[$i]} MIN=$MAX else [ ${RAND[$i]} -gt $MAX ] && { MAX=${RAND[$i]} && continue; } [ ${RAND[$i]} -lt $MIN ] && MIN=${RAND[$i]} fi done for index in `echo ${!RAND[@]}`;do echo "$index ${RAND[$index]}" done echo MAX=$MAX MIN=$MIN
# 编写脚本,定义一个数组,数组中的元素对应的值是/var/log目录下所有以.log结尾 # 的文件;统计出其下标为偶数的文件中的行数之和 #!/bin/bash # declare -a files files=(/var/log/*.log) declare -i lines for index in `seq 0 $[${#files[@]}-1]`;do if [ $[$index%2] -eq 0 ];then let lines+=$(wc -l ${files[$index]}|cut -d ' ' -f1) fi done echo "Lines: $lines"
# 输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序 #!/bin/bash declare -a bubble num=10 for i in `eval echo {1..$num}`;do bubble[$i]=$RANDOM done echo ${bubble[@]} for((i=1;i
每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户zhangsan登录,
则将登录时间和主机记录于日志/var/log/login.log中,并退出脚本 #!/bin/bash # while :;do if who|grep ^zhangsan &>/dev/null;then MESSAGES=`who|grep ^zhangsan` TIME=$(echo $MESSAGES|awk '{print $3,$4}') HOST=$(echo $MESSAGES|awk '{print $NF}'|tr -d '()') echo "$HOST $TIME" >> /var/log/login.log break fi sleep 3 who done

随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出 #!/bin/bash # RAND=$[$RANDOM%10+1] while :;do read -p "Please input a number[1-10]: " number if [ -z "$number" ];then echo "input null" continue fi if [[ ! $number =~ ^[0-9]+$ ]];then continue fi if [ $number -gt $RAND ];then echo "large digit" elif [ $number -lt $RAND ];then echo "small digit" else echo "ok" break fi done
用文件名做为参数,统计所有参数文件的总行数 #!/bin/bash # files=$@ if [ -z "$1" ];then echo "Usage:`basename $0` filename ..." exit fi for file in $files;do if [ -f $file ];then let rows+=`wc -l $file|cut -d' ' -f1` else echo "$file is not file" fi done echo $rows
判断某个网段的主机是否在线,统计在线主机的个数,不在线主机的个数 #!/bin/bash # declare -i uphosts=0 declare -i downhosts=0 declare -i i=1 hostping(){ if ping -W 1 -c 1 $1 &>/dev/null;then echo "$1 is up" return 0 else echo "$1 is down" return 1 fi } while [ $i -lt 50 ];do hostping 192.168.209.$i [ $? -eq 0 ] && let uphosts++ || let downhosts++ let i++ done echo "uphosts : $uphosts" echo "downhosts : $downhosts"
高级变量用法-有类型变量 shell变量一般是无类型的,但是bash shell 提供了declare和typese两个命令用于指定变量的类型,两个命令是等价的 declare [选项] 变量名 -r 声明或显示只读变量 -i 将变量定义为整数型 -a 将变量定义为数组 -A 将变量定义为关联数组 -f 显示已定义的所有函数名及其内容 -F 仅显示已定义的所有函数名 -x 声明或显示环境变量和函数 -l 声明变量为小写字母 declare -l var=UPPER -u 声明变量为大写字母 declare -u var=lower
eval 命令 eval 命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描
间接变量引用 如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就称为间接变量引用 var1的值是var2,而var2又是变量名,var2的值为value,间接变量引用是指通过var1获得变量值value的行为
创建临时文件 mktemp 创建并显示临时文件,可避名冲突 mktemp [option] ... [templace] template:filenameXXXX (X至少要出现三个) option: -d 创建临时目录 -p dir 或 --tmpdir=dir 指明临时文件所存放目录位置
安装复制文件 install 命令 install [option]... [-T] source dest 单文件 install [option] ... source ... directory install [option] ... -t directory source ... install [option] ... -d directory ... 创建空目录 选项 -m mode 默认755 -o owner -g group
expect 介绍
expect 是由Don Libes基于Tcl( Tool Command Language )语言开发的,主
要应用于自动化交互式操作的场景,借助 expect 处理交互的命令,可以将交互过
程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对
多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率 expect中相关命令 spawn 启动新的进程 send 用于向进程发送字符串 expect 从进程接收字符串 interact 允许用户交互 exp_continue 匹配多个字符串在执行动作后加此命令 执行多个命令 #!/usr/bin/expect set ip [lindex $argv 0] set user [lindex $argv 1] set password [lindex $argv 2] set timeout 10 spawn ssh $user@$ip expect { "yes/no" { send "yes\n";exp_continue } "password" { send "$password\n" } } expect "]#" { send "useradd lisi\n" } expect "]#" { send "echo 123456 |passwd --stdin lisi\n" } send "exit\n" expect eof #./expect.sh 192.168.209.7 root peng

3. shell脚本调用 expect #!/bin/bash ip=$1 user=$2 password=$3 expect <4. 为多台主机创建用户和密码 #!/bin/bash # cat <<-EOF > ip_user_pass.list 192.168.209.10 root centos 192.168.209.9 root centos 192.168.209.5 root centos 192.168.209.6 root centos 192.168.209.7 root centos EOF while read ip username password;do expect <<-EOF spawn ssh $username@$ip expect { "yes/no" { send "yes\n";exp_continue } "password" { send "$password\n" } } expect "]#" { send "useradd tom\n" } expect "]#" { send "echo 123456|passwd --stdin tom\n" } expect "]#" { send "exit\n" } expect eof EOF done < ip_user_pass.list
系统运维
2019-11-23 01:48:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
option->Global options –> Terminal->Apperance->ANSI Color



注意:
1:不同版本可能不一致,当前版本Version 8.3.2 (x64 build 1584)
2:在session options->terminal->emulation 勾选了asi color 和 user color scheme
系统运维
2019-11-22 22:10:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
https://blog.csdn.net/DarrenXf/article/details/82078427
系统运维
2019-11-22 19:09:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
shell中的函数
函数(也叫方法)就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可
格式: function f_name() { command }
示例一:调用该函数,输出函数的第一、第二个参数以及参数总数 #!/bin/bash function test() { echo $1 $2 $# } test a b c
执行结果: [root@linux ~]# sh fun1.sh a b 3
示例二:将两个参数求和 #!/bin/bash function test() { n=$[$1+$2] echo $n } test 1 2
执行结果: [root@linux ~]# sh fun2.sh 3
示例三:输出指定网卡的IP地址 #!/bin/bash function ip() { ifconfig |grep -A1 "$1:" |tail -1 |awk '{print $2}' } read -p "Please input the eth name: " e eth=`ip $e` echo "$e address is $eth"
执行结果: [root@linux ~]# sh fun3.sh Please input the eth name: ens33 ens33 address is 192.168.234.128
补充: 1.函数在脚本中需要放在最前面 2.定义函数时允许只写函数名,可以忽略掉function
shell中的数组
数组可以理解为变量,与普通变量不同的是,数组可以定义多个值,把每个值叫做元素
定义一个数组: [root@linux ~]# array=(a b c)
#数组名:array,包含3个元素:a,b,c
获取数组的第一个元素: [root@linux ~]# echo ${array[0]} a
获取数组的第二个元素: [root@linux ~]# echo ${array[2]} c
#元素的排序是以0开始的:0代表第一个元素,1代表第二个元素,以此类推...
获取数组所有元素的两种方式: [root@linux ~]# echo ${array[@]} a b c [root@linux ~]# echo ${array[*]} a b c
获取数组元素个数的两种方式: [root@linux ~]# echo ${#array[*]} 3 [root@linux ~]# echo ${#array[@]} 3
修改第一个元素的值: [root@linux ~]# array[0]=x [root@linux ~]# echo ${array[@]} x b c
增减一个元素: [root@linux ~]# array[3]=y [root@linux ~]# echo ${array[@]} x b c y
删除第一个元素: [root@linux ~]# unset array[0] [root@linux ~]# echo ${array[@]} b c y
删除数组: [root@linux ~]# unset array
数组的分片:
添加一个数组: [root@linux ~]# array=(`seq 1 5`) [root@linux ~]# echo ${array[@]} 1 2 3 4 5
从第1个元素开始截取3个元素: [root@linux ~]# echo ${array[@]:0:3} 1 2 3
#0表示第一个元素,3表示截取元素的数量
从第4个元素开始截取2个元素: [root@linux ~]# echo ${array[@]:3:2} 4 5
#3表示第四个元素,2表示截取元素的数量
从倒数第3个元素开始截取3个元素: [root@linux ~]# echo ${array[@]:0-3:3} 3 4 5
#0-3表示倒数第三个元素,3表示截取元素的数量
数组的替换:
将数组中值为3的元素替换为33: [root@linux ~]# echo ${array[@]/3/33} 1 2 33 4 5 [root@linux ~]# echo ${array[@]} 1 2 3 4 5
#该操作只是替换输出的结果,并没有真正替换数组中的元素
替换数组中的元素: [root@linux ~]# array=(${array[@]/5/55}) [root@linux ~]# echo ${array[@]} 1 2 3 4 55
#该操作是直接替换数值中的值,而不是只替换输出结果
系统运维
2019-11-22 16:41:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
查询端口有两种方法 ss -lnp | grep 端口号 或者 sudo lsof -i:端口号
然后删除占用线程 sudo kill -9 (PID)


Reference:
https://blog.csdn.net/pcf1995/article/details/83341304
系统运维
2019-11-22 16:34:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
微软现在不提供直接ISO镜像下载,而是弄成线上自动下载并制作成U盘的程序!
不多说,直接上图文

重要提示:
以下为操作或安装前的必读提示。
1、准备8G或8G以上U盘(32G以内)。制作U盘会格式化U盘,此U盘内的数据需要提前备份至其它U盘或移动硬盘。
2、在格式化、删除分区和重新安装操作系统之前,请提前备份好电脑中的所有数据至U盘或移动硬盘,避免产生任何损失。
3、预装Office的情况,请提前记录自己激活的Office账户和密码,避免重装系统后忘记账户和密码。
4、因为安装的Win10是纯净版本的,一般会自驱网卡,这样安装系统之后再去联网,点开系统的自动更新会自动更新系统需要的所有驱动。
5、如果无法自驱网卡,请至联想官网下载对应网卡驱动,拷贝过来安装。
6、因为教程中只说到新建一个系统盘,请安装完系统后,自行到磁盘管理新建分区。
7、建议优先安装和出厂系统相同的版本。如,预装系统为Win10家庭中文版,请安装家庭版。一般会自动联网激活,如果安装其他版本请自行联系微软购买相应的激活密钥。
操作步骤:
通过Media Creation Tool制作Win10系统的安装U盘
一、 点击此处 打开下载Win10的页面;
二、选择“立即下载工具”,之后,找到下载的软件(MediaCreationTool1909.exe)双击运行[注,1909指win10的版本,默认自动下载最新,没得选]。您需要成为管理员才能运行此工具。如果您同意许可条款,请选择“接受”;
三、 选择“为另一台电脑创建安装介质”,然后选择“下一步”;
四、选择 Windows 10 的语言、版本和体系结构(64 位或 32 位)。(此处去掉左下角的勾选,选择Windows10 64位,如果要装32位选择32位即可,但是建议64位,因为64位支持大于4G的内存。)
五、选择您要使用哪种介质:
1、 选择U盘,然后选择下一步。
2、 选择到您的U盘。然后选择下一步,耐心等待下载和创建介质过程,最后点击完成。(连接至少有5G空间的空白U盘,该U盘上的所有内容都将被删除)。
3、制作的电脑C盘至少拥有10G左右空余。


系统安装略!^_^

Reference:
http://iknow.lenovo.com/detail/dc_177365.html
系统运维
2019-11-22 15:41:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
可以用 PhotoShop 或 GIMP 这样的软件来处理图像。没人禁止你这么做,就像没人禁止你用大炮打蚊子一样。不过依我看,打蚊子最好还是用电蚊拍,而要处理大量图像的话,我推荐 ImageMagick。
先来介绍一下 ImageMagick。
ImageMagick(简称 IM)是一个支持 GPL 协议的开源免费软件包。
它由一组命令行工具组成的。
它可以对超过 100 种的图像格式(包括 DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, Postscript, SVG, 和 TIFF等等),进行读、写、编辑和转换的操作。
它支持多数主流操作系统,其中包括 UNIX、Mac OS X 和 Windows。
在ubuntu16.04里面是自带的
IM 的主页是 http://www.imagemagick.org/ 。你可以在那里下载它的源代码或可执行文件。
一般人可以直接下载它的 Windows 发行版。地址是:http://www.imagemagick.org/script/binary-releases.php#windows 。
有 6 种格式可供选择,如果你不清楚自己要什么,我建议你下载 Q16 的 static 版。
先来看看 ImageMagick 能做些什么:
1、批量旋转、分割,并顺序编号
2、自动批量切除白边(auto-crop)
3、自动倾斜校正(deskew)
4、批量加标注
5、批量去标注
6、批量加水印
7、批量去水印

一、最基本的格式转换
下面,我将结合与扫书制书有关的图像操作,来说明 IM 的用法。
前面已经说过,IM 由一组命令行工具组成,具体来说也就是 convert、mogrify、composite、montage、identify、compare、display、animate、stream、import 和 conjure,这 11 个命令。
其中最常用的,是 convert 和 mogrify。
1、将 a.gif 转为 png 格式
convert a.gif a.png
请注意,convert 命令的基本格式为
convert 源文件 [参数] 目标文件
在上面的命令中,源文件是 a.gif,目标文件是 a.png。由于这是最简单的格式转换,所以不需要中间的参数。
convert 常用于单个文件的转换。上面的命令是它最基本的用法。
前面说过 IM 支持超过 100 种的文件格式。
下面的命令,可以列出 IM 所支持的所有格式:
identify -list format

2、批量文件的格式转换
mogrify -path newdir -format png *.gif
这个命令的作用,是将当前目录下的所有 gif 文件,转换为 png 格式,并将其存放在 newdir 目录下。
mogrify 是用于批量处理文件的命令。它的基本格式是这样的:
mogrify 参数 源文件
mogrify 支持基本的通配符,例如你可以用 a*.png 指代所有以 a 打头的 png 文件,诸如此类。
再回到刚才的命令:
mogrify -path newdir -format png *.gif
这里的 -path 和 -format 是两个可选择的参数。
-format 指定输出的文件格式,而 -path 则指定输出的文件目录。
我在这里先强调一下:如果不加 -path 参数的话,mogrify 有可能会覆盖你的源文件,因此强烈推荐在每个 mogrify 命令里都加上 -path 参数,并在执行之前,先检查整个命令正确性。

二、图像的缩放:使用 -resize
IM 有好几种缩放图像的方法,在这里我只讲最基本的 resize 命令。
将一个200x304大小的图像缩小为100x152(长宽各缩短一半)。
convert page200.png -resize 100x152 page100.png
上面的 100x152,指定了目标文件的长和宽。
你也可以只指定目标文件宽度,这样它的高度会等比例放大:
convert page200.png -resize 100 page100.png
或者只指定高度:
convert page200.png -resize x152 page100.png
以上三句命令,其结果都是一样的。
你可以用 identify 命令来显示图像的尺寸以及其它一些信息:
identify page100.png
其结果为:
page100.png PNG 100x152 100x152+0+0 8-bit DirectClass 17.9kb
最后,你还可以通过指定百分比来缩放图像:
convert page200.png -resize 50% page100.png
convert page200.png -resize 150% page300.png
批量缩放图像
mogrify -path newdir -resize 200% *.png
这句命令的意思是将当前目录中所有的 png 文件都放大一倍,并存放到 newdir 目录中。

请注意,如果没有 -path 语句,新生成的 png 文件将会覆盖原始文件。因此,在使用 mogrify 命令时,-path 参数几乎是必须的。
系统运维
2019-11-22 14:58:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
10月30日,全球权威数据调研机构IDC正式发布《IDCMarketScape: 中国DevOps云市场2019,厂商评估》报告。京东云凭借丰富的场景和实践能力,以及高质量的服务交付和平台稳定性,取得优异的成绩, 跻身“Major Players”(核心厂商)位置 。
京东云DevOps能力起源于自身的业务实践,针对京东集团的复杂业务场景打造并经受住多次618、11.11电商大促的严峻考验,保证了高效高质的交付和对变化的灵活应对。能够支持复杂场景的自动化运维需求、实现工具链产品与平台化产品结合,帮助客户根据不同的需求灵活定制方案。
前两次的专题内容中,我们分别与大家分享了 大型企业级监控系统的设计 以及 监控系统的可观测性与数据存储 。今天,我们将通过介绍京东云DevOps落地实践,和大家继续分享DevOps中另一个重要内容:日志查询服务。
日志查询服务,是构建软件项目的基石之一,是系统稳定运行必不可少的一部分,已然成为DevOps中的标配选项。这里,我们来聊一聊京东云翼DevOps平台的日志查询服务实践。
本着客户为先,全心全意为用户服务的原则,云翼日志查询服务的发展分以下几个阶段解决用户的日志需求:
场景一:用户需要查看自己的应用日志,以此来判断自己的应用程序当前运行是否正常,或者在遇到问题时,需要通过查看应用输出的日志信息来定位问题。
针对用户的这个需求,我们开发并提供了 现场日志查询功能 。
何为现场日志?就是案发现场的日志。案发现场一般在哪里呢?当然是用户应用部署所在的主机了。
我们提供现场日志查询的功能,用于查询用户主机上的应用日志。该功能默认支持规范目录下的日志查询,且支持扩展的自定义路径。 规范目录 : /export/Logs/$appName/$instanceName/ ,在用户主机这个目录下的日志文件,会自动列到页面,用户选择要查询的文件进行查询即可。 $appName 代表用户的应用名称; $instanceName 代表应用部署的实例名称。 用户自定义路径举例 : /export/test.log ,由于这个路径对我们系统来讲是“不规范”的,用户如果需要查这个日志信息,就需要自己手动输入该日志路径,然后再执行查询操作。
现场日志查询文件选择示例图
如何实现现场日志查询功能
想想一般我们自己要查看主机上的日志是怎么做的呢?第一步往往是ssh登录到主机,然后通过 grep 命令查询指定内容。是的,我们的现场日志就是将这一过程进行了平台化,用户在现场日志页面上选择要查询的日志文件,输入要查询的关键字,点查询按钮即可。出于安全性考虑,ssh认证我们采用密钥认证而非密码认证。当然了,既然通过ssh连接,那就要求用户主机必须开放22端口。
现场日志通过ssh查询遇到的问题
比如有的用户的主机是在VPC里的,ssh直接访问不到,怎么办呢?想想办法这个问题是可以解决的,那就是配置代理,这样就导致渐渐地要维护一堆的代理配置。
改进措施
随着云翼内部新的控制系统zero的出现(zero是一套控制系统,通过给用户主机上的zero-agent下发任务实现对用户主机的一些操作),现场日志查询有了新的实现方式,可以通过调用控制系统API,用控制系统下发任务的方式来实现日志查询,这样采用http的连接方式替代之前的ssh,不再依赖密钥,也不再需要再维护一堆的ssh代理配置了。嗯,感觉一下清爽了好多。
新的困境
改变实现方式后,发现一个新的问题,就是用户单条日志太大的情况下,查询数据量如果超过zero-agent一次传输数据量的限制会导致查询失败,这里就需要做个权衡了,要么用户调整日志长度,要么减小一页的数据展示条数,再要么可以考虑换一种查询方式,比如用下面将要介绍的历史日志查询,当然了,这只是权宜之计,历史日志功能并不是为了解决这个问题才产生的。
场景二:用户的应用部署在多台机器上,用户需要对多台机器上的日志进行集中检索,且做日志检索时不希望消耗自己机器上的资源(比如带宽、内存、CPU)。
为此,云翼的 历史日志查询功能 应运而生。我们期望历史日志支持最近7天的日志检索。
既然要集中检索,那我们首先需要及时把日志数据采集走,进行集中存储。这里需要用户做一个日志订阅的操作,其实就是告诉日志服务要采集哪个应用下的哪个日志文件的数据。
日志数据流向图:
上图反映了用户订阅后,用户日志数据的流向情况。可以看到数据存储涉及两种介质,一种是kafka,一种是ES,数据先缓存到kafka,最终流向ES。ElasticSearch简称ES,是一个开源的分布式搜索引擎,我们的历史日志查询功能正是借助于ES强大的搜索能力实现的。
下面依次介绍一下上图中的log-agent、fwd和indexer模块。 log-agent ,是云翼的日志采集客户端,部署在用户的应用主机上。它可以动态发现用户的订阅信息,实时采集日志数据并将数据上报给fwd模块。log-agent内部封装了rsyslog,通过控制rsyslog的配置以及程序的启停来实现对用户日志的采集。rsyslog是linux上一款比较成熟的系统日志采集工具,我们拿来采集应用级别的日志,当然也是可以的。 fwd ,这个模块负责接收log-agent上报的数据,并转发至kafka。它的价值在于解耦了log-agent和kafka,避免了成千上万的主机和kafka直连;当kafka有变动的时候,我们只给有限的几台fwd做修改和升级即可,不需要对所有的log-agent做统一的升级了。 indexer ,该模块可以被看作一个数据搬运工,负责把日志数据从kafka搬到ES。indexer的本质是rsyslog,它的输入是kafka,输出是ES。是不是发现rsyslog很强大?这个模块虽然简单,但很重要。曾经一度令人特别头疼的是它经常罢工,要么吃内存,要么假死不干活。它不干活,ES就得眼巴巴等数据而不得,ES没数据,历史日志就查不出内容,这个问题简直太严重了。经过反复排查分析,最终发现是由于action队列里的消息出队太慢导致的,在对rsyslog的队列配置反复做了几次调整后,这家伙终于肯乖乖干活了,好开心。有时候并不是现成的工具不好用,而是我们不会用。
ES索引介绍
ES存储离不开索引,最初我们的索引是按照天的粒度来创建的,一天一个索引,例如: index-log-2019-10-21 。但是随着日志量的增加,按天索引,每次查询时,搜索范围太大,会导致一次查询特别慢,用户体验非常不好。为了提升查询效率,后来就把索引改成了小时粒度,例如: index-log-2019-10-21-13 。
索引时间如何确定
看完ES索引介绍,有人可能会有疑惑,既然是按时间索引,这个时间具体是怎么取的呢?从用户的日志消息中解析的吗?不是的。用户的日志,时间格式各不相同,从用户日志中解析时间显然是不现实的。
难道是按照当前的搬运时间来确定索引?这样的话,在数据处理不及时,kafka消息有积压的情况下,用户日志中的时间和索引的时间就很可能不一致了呀,比如15点的数据,可能会放到16点的索引中,这样在搜索15点的数据的时候是搜不到期望的数据的。
这里要说明一下,我们log-agent采集的每条数据,除了日志内容外,都会带有一些元信息,比如部门名称、应用名、日志文件路径,time时间戳等,这里的时间戳记录的是日志采集时的时间,由于是实时采集,这个时间和用户应用日志中的时间可以看作是几乎相等的。在索引数据前,先解析出time时间戳,通过这个时间戳来确定具体的索引。这样即使在kafka消息有积压的情况下,也能保证日志数据可以正确存放到期望的索引中。
历史日志查询示例图
历史日志面临的问题
随着日志量的增多,有一个比较尴尬的问题,就是ES存储资源会出现不足的情况。这是一个需要我们和用户一起努力来解决的问题。
场景三:有的用户觉得自己应用的日志比较重要,希望能够长久保留,比如三个月、半年……当突然需要某天的数据了,可以通过日志服务将数据文件下载下来进行查看。
针对这个用户需求,我们的做法是将用户的日志按照日期进行存储,然后在前端页面提供日志下载功能,供用户根据需要进行查询和下载指定日期的的日志文件。这里我们抽象出的功能叫 日志下载 。
日志下载功能的实现思路
日志下载的前提和核心是将零散的日志信息合并到文件进行长久存储。
之前我们将采集到的数据存放到了kafka,数据源有了,接下来就是把数据拉下来进行合并存储的问题了。对,期初我们选择的存储介质是HDFS(ES是检索利器,且存储成本太高,用做长久存储显然是不现实的)。
为此,我们写了一个Spark job的程序,起了一个consumerGroup从kafka消费数据,由于对实时性要求不高,我们用Spark Streaming的方式,每隔两分钟,进行一次数据拉取,然后进行离线计算。由于一条消息的元数据中包含采集时间戳和日志路径,我们很容易确定一条日志该追加到哪个HDFS文件中。最终通过httpfs从hdfs下载日志文件。
用HDFS作为存储,随着日志量的增加,资源不足的问题便呈现出来了。最终,我们把存储目标锁定到了京东云的对象存储OSS。当然了,初期的将数据计算后存储到HDFS的工作还是很有用的,接下来的工作就是把HDFS上的文件下载导入到OSS,然后生成OSS下载链接提供给用户就好了。这样HDFS相当于中转的作用,文件不需要保留太久,只要确定数据已经转存到OSS,HDFS上的文件就可以删除了,这样大大缓解了HDFS的存储压力。
日志转存(HDFS->OSS)遇到的问题及解决办法
在做日志转存至OSS的时候,我们遇到一个问题,比如用户的日志文件比较大,用户可能在自己的主机上做了日志切割,但是由于我们把数据采集后,变成了kafka中一条条的日志消息,我们相当于再把这一条条的日志消息重新合并到一个HDFS文件中。把一天的日志合到一个文件进行存储,有的应用日志打印比较频繁的话,最终合成的这个文件就会比较大,有的甚至超过了100G,这样不管是从HDFS进行下载和还是压缩上传至OSS操作都会比较耗时,而且磁盘空间占用也比较多。对于用户来说,下载一个大文件进行处理也会是一件比较头疼的事情。
为了解决这个问题,我们调整了spark job处理逻辑,实现了HDFS文件切割,确保单个HDFS文件大小不超过1G。这样一个大文件就被拆分成了多个小文件。对多个小文件进行并发转存,这样整体效率就大大提升了。压缩后的文件,一般不超过300MB,这样用户下载也会快很多。
日志下载功能示例图
OSS做持久化存储后,有一个缺点,就是由于需要转存,无法实时下载当天的日志,不过这并不是一个特别急迫的问题,因为当天的日志完全可以通过前面介绍的现场日志查询或历史日志查询功能来进行检索查看。
场景四:特定存储需求 - 用户说,我的日志数据不想交给你做集中存储,我想自己保存,然后用来做分析,你帮我收集到指定地方就好了。
这确实是比较典型的用户需求,为了满足用户的这个需求,我们开发了 自定义日志目的地 的功能。
自定义日志目的地,顾名思义,就是让用户自己来指定将日志存放到哪里,然后用户在做订阅操作的时候,指定这个目的地名称即可。
目前支持的日志目的地有两种类型:fwd和kafka。 fwd 类型,要求提供目的地服务的域名和端口号,且目的地服务支持RELP协议,RELP是一种比TCP更可靠的传输协议。 kafka 类型,需要指定kafka的broker和topic。
从使用情况来看,目前kafka类型的日志目的地占绝大多数。
至此,云翼日志服务的几个主要功能就介绍完了。从整个过程看,日志服务是连接运维和开发之间很好的桥梁,日志中几乎包含了运维和开发所关心的一切,也完整呈现出了应用程序在线上真实的运行情况。云翼的现场日志查询、历史日志查询、日志下载、自定义日志目的地这四个功能互相补充,可以满足用户在不同场景下的使用诉求。
目前京东云监控提供免费服务,点击【 阅读 】,了解更多关于京东云监控的内容。
欢迎点击“ 京东云 ”了解更多精彩内容
系统运维
2019-11-22 14:36:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

Nginx 安装
系统平台: CentOS release 6.6 (Final) 64位。
一、安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
二、首先要安装 PCRE
PCRE 作用是让 Nginx 支持 Rewrite 功能。
1、下载 PCRE 安装包 ,下载地址: http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz [root@bogon src]# cd /usr/local/src/
[root @bogon src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
2、解压安装包: [root@bogon src]# tar zxvf pcre-8.35.tar.gz
3、进入安装包目录 [root@bogon src]# cd pcre-8.35
4、编译安装 [root@bogon pcre-8.35]# ./configure
[root @bogon pcre-8.35]# make && make install
5、查看pcre版本 [root@bogon pcre-8.35]# pcre-config --version
安装 Nginx
1、下载 Nginx ,下载地址:http://nginx.org/download/nginx-1.6.2.tar.gz [root@bogon src]# cd /usr/local/src/ [root@bogon src]# wget http://nginx.org/download/nginx-1.6.2.tar.gz
2、解压安装包 [root@bogon src]# tar zxvf nginx-1.6.2.tar.gz
3、进入安装包目录 [root@bogon src]# cd nginx-1.6.2
4、编译安装 [root@bogon nginx-1.6.2]# ./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35 [root@bogon nginx-1.6.2]# make [root@bogon nginx-1.6.2]# make install
5、查看nginx版本 [root@bogon nginx-1.6.2]# /usr/local/webserver/nginx/sbin/nginx -v
到此,nginx安装完成。
Nginx 配置
创建 Nginx 运行使用的用户 www: [root@bogon conf]# /usr/sbin/groupadd www [root@bogon conf]# /usr/sbin/useradd -g www www
配置nginx.conf ,将/usr/local/webserver/nginx/conf/nginx.conf替换为以下内容 [root@bogon conf]# cat /usr/local/webserver/nginx/conf/nginx.conf user www www; worker_processes 2; #设置值和CPU核心数一致 error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别 pid /usr/local/webserver/nginx/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 65535; events { use epoll; worker_connections 65535; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; #charset gb2312; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 8m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; #limit_zone crawler $binary_remote_addr 10m; #下面是server虚拟主机的配置 server { listen 80;#监听端口 server_name localhost;#域名 index index.html index.htm index.php; root /usr/local/webserver/nginx/html;#站点目录 location ~ .*\.(php|php5)?$ { #fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ { expires 30d; # access_log off; } location ~ .*\.(js|css)?$ { expires 15d; # access_log off; } access_log off; } }
检查配置文件nginx.conf的正确性 命令 : [root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -t 启动 Nginx Nginx 启动 命令 如下: [root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx
本文原创地址: https://www.linuxprobe.com/nginx-installation-configuration.html
系统运维
2019-11-22 11:00:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
导读
Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。

编码
默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*-
上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码,对应适合语言为保加利亚语、白罗斯语、马其顿语、俄语、塞尔维亚语。
标识符
第一个字符必须是字母表中字母或下划线 _ 。
标识符的其他的部分由字母、数字和下划线组成。
标识符对大小写敏感。
在 Python 3 中,可以用中文作为变量名,非 ASCII 标识符也是允许的了。
python保留字
保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字: >>> import keyword >>> keyword.kwlist ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
注释
Python中单行注释以 # 开头,实例如下: 实例(Python 3.0+) #!/usr/bin/python3 # 第一个注释 print ("Hello, Python!") # 第二个注释
执行以上代码,输出结果为: Hello, Python!
多行注释可以用多个 # 号,还有 ''' 和 """: 实例(Python 3.0+) #!/usr/bin/python3 # 第一个注释 # 第二个注释 ''' 第三注释 第四注释 ''' """ 第五注释 第六注释 """ print ("Hello, Python!")
执行以上代码,输出结果为: Hello, Python!
本文原创地址: https://www.linuxprobe.com/several-basic-syntax.html
系统运维
2019-11-22 10:59:09
「深度学习福利」大神带你进阶工程师,立即查看>>>
节选自: Stackdriver tips and tricks: Understanding metrics and building charts Understanding the Google Stackdriver metrics model
In order to build useful charts, it's important to have an understanding of how the Stackdriver metrics model works under the hood. This model helps you configure charts in Stackdriver Metrics Explorer and custom dashboards.
All metrics are made up of two things: A metric descriptor that defines what the metric is and what resource it applies to; i.e., a "CPU usage" metric that applies to the "Compute Engine instance" resource type. The metric descriptor also defines a set of labels that are used as identifiers or metadata for the system writing the metric. For example, our disk write operations metric has a label called "device_name" that identifies which disk a data point was associated with. A time series that includes a set of points that are a combination of [time, value, labels/resource] and written against the metric descriptor.
Stackdriver metrics are one of three kinds: gauge, delta, and cumulative. A gauge metric measures a value at a particular point in time; i.e., “CPU utilization” for a Compute Engine instance, or “Instance count” for an App Engine app. A chart of CPU utilization will have points showing, as expected, the CPU utilization at that moment in time. A delta metric measures the change in a value over a sample period, often one minute. An example is the “Backend request count” for a load balancer. A chart of the backend request count will have one point for each minute, showing how many requests hit the load balancer in that minute. A cumulative metric measures a value that constantly increases, such as “sent bytes count” for Firebase . Cumulative metrics are never drawn directly in practice; you always use aligners (discussed below) to turn them into gauge or delta metrics first. If you could draw the raw data for “sent bytes count,” you would see an ever-increasing line going up as the total number of sent bytes grows without bound.
Finally, there are two types of metrics value types: numeric or distribution. A numeric metric consists of streams that have numeric values for specific points in time. All of the examples in the previous section are numeric-valued metrics. A distribution metric consists of (usually one) stream that has an array of “buckets” at each point in time that are used to draw a heatmap. Examples are “Backend latency” for a load balancer or “Execution times” for BigQuery .
为了构建有用的图表,理解Stackdriver 指标模型的后台工作原理是一件很重要的事。这个模型帮助你在Stackdriver指标浏览器和客制化面板中配置图表。
所有指标由两样东西构成:
1. 指标描述符,其定义了这个指标是什么以及适用的资源。列如,“CPU使用率”指标适用于“计算引擎实例”资源类型。这个指标描述符同时定义了一系列标签,用作标识符或者系统元数据。举个例子,我们的磁盘写操作指标有一个标签,“设备名称”,它用于标识数据点于哪个磁盘关联。
2. 时间序列,其包含一系列点,由【时间,值,标签/资源】构成,针对指标描述符编写。
Stackdriver指标有三种类型:计量(gauge),德尔塔(delta),累积(cumulative)。
1. 计量指标度量特定时刻的值。例如,计算引擎实例的“CPU利用率”,应用引擎应用的“实例计数”。CPU利用率图表以点的形式展示,表明在此时此刻的利用率。
2. 德尔塔指标衡量一个样本期间的变化的值,通常是一分钟。例如,负载均衡器的“后台请求计数”。后台请求计数的图表在每分钟会有一个点,展示在这一分钟内负载均衡器收到了多少请求。
3. 累积指标衡量持续增长的值。例如,Firebase的“已发送字节数”。实际情况中,累积指标不会直接描绘。你通常会先使用直线对准器(下面会讨论)去将它们转换为计量指标或德尔塔指标。如果你描绘“已发送字节数”的原始数据,你会得到一条随着已发送字节无限增长而不断上升的线条。
最后,指标值类型有两种:数字,分布。
1. 数字指标由多个数据流构成,其拥有指定时间点的数字值。前一节的所有例子都是数字指标。
2. 分布指标由(通常是一个)数据流构成,其拥有每个时间点的桶数组,用来描绘热力图。例如,负载均衡器的“后台延迟”,或者BigQuery的“执行时间”。
系统运维
2019-11-21 15:22:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
德国汉莎航空股份公司 (Deutsche Lufthansa AG),世界上第五大航空公司。汉莎航空下属的IT公司-汉莎系统公司(Lufthansa Systems),它支撑了汉莎所有线路,百万乘客,从机上到机下,从起飞到降落的所有信息化系统的建设和运营。
汉莎系统开发的机上娱乐系统采用了容器技术作为底层技术支撑 。对系统的扩展性,稳定性、模块化、用户友好度,要求非常之高。微服务和容器技术逐渐成为汉莎系统产品开发的底层支撑,并应用DevOps的方式来进行开发和管理。但在这个过程中, 汉莎遇到了重要的挑战,就是如何在系统灵活、易用、快速的前提下,保持数据的永久性。

汉莎发现并使用了Portworx来解决问题
我们来看看汉莎系统软件架构师麦克·威廉姆斯(Michael Wilmes)怎么评价Portworx:
“ Portworx与我们的IT系统是一个完美的结合 ,它对于传统的、云原生、第三方应用,非常便捷和易用。”我们的BoardConnecd系统,采用了微服务架构,运行Docker Swarm环境,和Consul-backed Service Discovery。我们采用了云上的对象存储功能与BoardConnecd系统进行数据交换,,同时我们运维大量的Block存储的服务。
以BoardConnect系统为基础的机上娱乐系统(CMS),采用的是传统的数据管理方式,数据被存储到硬盘和数据库里。当IT希望在项目上自动开启CMS的instance的时候,或者需要管理客户生产环境的每个CMS Instance的时候,就产生了对Docker 调度的强烈需要。
容器能够帮助我们提高开发速度,同时,能够帮我们更好的调节各个应用的部署和管理。以及同时保持容器的数据永久性和灵活性。 使用Portworx,我们可以在几分钟内部署完整的CMS系统,并且不需要手动的干预。 而之前我们需要几个小时。在生产系统中, Portworx可以帮助我们在不同的Cluster中移动CMS环境,并且同步移动数据。
不论是云环境还是硬件环境,Portworx都有工具能够帮助我们快速部署 ,这个实在太有价值了。Portworx帮助我们在更多的应用中使用Docker,同时更好的对应用进行生命周期管理。在我们的应用中,容器的Dev&Ops带来了易用性和快捷,就产生进一步的用传统方式管理存储的需要。但这种方式并不简单。 某些服务需要基于Block服务的高I/O。而另一些服务,比如CMS和数据库,本身并不支持云存储。而Portworx解决了这样的问题 。
Operations也有基于Docker的挑战:通过先部署的Host Mounts,再部署Docker命名的卷,我们就能够快速进行开发,但是这些容器就会被绑定到某个具体的Docker host上,而数据被延迟到了下一个host中。这就产生了很大的问题, 正常的容器可以在cluster上自动漂移,而需要数据永久性的容器就需要很多的手工动作来完成 。
一些通常的容器永久性解决方案,主要是建立存储应用和Docker的连接。但是这样的方式产生了1)对于某个存储和云服务的依赖性 2)存储的类型也受限。这样的解决方案无法真正满足需求。而Portworx的方案,则能够很好的解决这些问题。
部署Portworx相对简单,有很好的文档支持。 Portworx让我们的Docker变得与Cluster无关,也与底层的软件堆栈无关,我们可以基于不同的云服务提供商和数据中心来进行Docker一致性的管理。 同时可以把不同种类的容器用同样的方式来处理,包括云原生微服务,传统的CMS系统,和数据库。Portworx帮助我们同时对CMS,数据库,和文件系统进行自动部署和管理。当Portworx在Docker Cluster上安装完成后,管理容器变得非常简单,可以通过图形化界面,也可以通过命令行的方式,升级也很直接,存储系统可以用JSON来直接调用。
系统运维
2019-11-21 13:52:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
常用 Git 命令清单
我每天使用 Git ,但是很多命令记不住。 一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐怕要记住60~100个命令。
下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。
Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库
一、新建代码库
在当前目录新建一个Git代码库
$ git init
新建一个目录,将其初始化为Git代码库
$ git init [project-name]
下载一个项目和它的整个代码历史
$ git clone [url]
二、配置
Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。
显示当前的Git配置
$ git config --list
编辑Git配置文件
$ git config -e [--global]
设置提交代码时的用户信息
$ git config [--global] user.name "[name]" $ git config [--global] user.email "[email address]"
三、增加/删除文件
添加指定文件到暂存区
$ git add [file1] [file2] ...
添加指定目录到暂存区,包括子目录
$ git add [dir]
添加当前目录的所有文件到暂存区
$ git add .
删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
四、代码提交
提交暂存区到仓库区
$ git commit -m [message]
提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
提交时显示所有diff信息
$ git commit -v
使用一次新的commit,替代上一次提交
如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
五、分支
列出所有本地分支
$ git branch
列出所有远程分支
$ git branch -r
列出所有本地分支和远程分支
$ git branch -a
新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
新建一个分支,并切换到该分支
$ git checkout -b [branch]
新建一个分支,指向指定commit
$ git branch [branch] [commit]
新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
切换到指定分支,并更新工作区
$ git checkout [branch-name]
建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]
合并指定分支到当前分支
$ git merge [branch]
选择一个commit,合并进当前分支
$ git cherry-pick [commit]
删除分支
$ git branch -d [branch-name]
删除远程分支
$ git push origin --delete [branch-name] $ git branch -dr [remote/branch]
六、标签
列出所有tag
$ git tag
新建一个tag在当前commit
$ git tag [tag]
新建一个tag在指定commit
$ git tag [tag] [commit]
查看tag信息
$ git show [tag]
提交指定tag
$ git push [remote] [tag]
提交所有tag
$ git push [remote] --tags
新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]
七、查看信息
显示有变更的文件
$ git status
显示当前分支的版本历史
$ git log
显示commit历史,以及每次commit发生变更的文件
$ git log --stat
显示某个文件的版本历史,包括文件改名
$ git log --follow [file] $ git whatchanged [file]
显示指定文件相关的每一次diff
$ git log -p [file]
显示指定文件是什么人在什么时间修改过
$ git blame [file]
显示暂存区和工作区的差异
$ git diff
显示暂存区和上一个commit的差异
$ git diff --cached [file]
显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]
显示某次提交的元数据和内容变化
$ git show [commit]
显示某次提交发生变化的文件
$ git show --name-only [commit]
显示某次提交时,某个文件的内容
$ git show [commit]:[filename]
显示当前分支的最近几次提交
$ git reflog
八、远程同步
下载远程仓库的所有变动
$ git fetch [remote]
显示所有远程仓库
$ git remote -v
显示某个远程仓库的信息
$ git remote show [remote]
增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]
取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]
上传本地指定分支到远程仓库
$ git push [remote] [branch]
强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force
推送所有分支到远程仓库
$ git push [remote] --all
九、撤销
恢复暂存区的指定文件到工作区
$ git checkout [file]
恢复某个commit的指定文件到工作区
$ git checkout [commit] [file]
恢复上一个commit的所有文件到工作区
$ git checkout .
重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]
重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard
重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]
重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]
重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]
新建一个commit,用来撤销指定commit
后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]
十、其他
生成一个可供发布的压缩包
$ git archive
系统运维
2019-11-21 12:21:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
https://www.infoq.cn/article/L4LU1J0VxXtA6ASeGYbV
系统运维
2019-11-21 11:21:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
linux任务计划cron介绍
大部分系统管理工作都是通过定期自动执行某个脚本来完成的,Linux的cron就是用来定期执行脚本的。
Linux任务计划功能的操作都是通过crontab命令来完成的,常用的选项有以下几个:
-u:表示指定某个用户,不加-u则为当前用户。
-e:制定计划任务。
-l:列出计划任务。
-r:删除计划任务。
使用crontab -e来编写任务计划,实际上就是使用vim打开了crontab的配置文件,我们写下如下内容: 01 10 05 06 3 echo "ok" >/root/cron.log
上面的内容从左至右依次为:分、时、日、月、周和执行的命令。上面例子表示在6月5日(这一天必须是星期三)的10点01分执行命令:echo "ok" > /root/cron.log。
命令crontab -e实际上是打开了/var/spool/cron/username文件(如果用户是root,则打开的是/var/spool/cron/root)。打开这个文件使用了vim编辑器,所以保存时在命令行模式下输入:wq即可。但是不要直接去编辑那个文件,否则会出错,所以一定要使用命令crontab -e来编辑。
查看已经设定的任务计划用命令crontab -l:
删除任务计划用命令crontab -r:
系统运维
2019-11-21 11:20:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
在Linux/Unix 类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0.0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量, 输出结果中有如下内容:
DISPLAY=:0.0
使用xdpyinfo可以查看到当前显示的更详细的信息。
DISPLAY 环境变量格式如下host:NumA.NumB, host指Xserver所在的主机主机名或者ip地址, 图形将显示在这一机器上, 可以是启动了图形界面的Linux/Unix机器, 也可以是安装了Exceed, X-Deep/32等Windows平台运行的Xserver的Windows机器. 如果Host为空, 则表示Xserver运行于本机, 并且图形程序(Xclient)使用unix socket方式连接到Xserver, 而不是TCP方式. 使用TCP方式连接时, NumA为连接的端口减去6000的值, 如果NumA为0, 则表示连接到6000端口; 使用unix socket方式连接时则表示连接的unix socket的路径, 如果为0, 则表示连接到/tmp/.X11-unix/X0 . NumB则几乎总是0.
如果使用su username或者su - username切换到别的用户, 并且使用命令
export DISPLAY=:0.0
设置DISPLAY环境变量, 运行图形程序(如xclock)时会收到如下错误:
Xlib: connection to ":0.0" refused by server Xlib: No protocol specified Error: Can't open display: :0.0
这是因为Xserver默认情况下不允许别的用户的图形程序的图形显示在当前屏幕上. 如果需要别的用户的图形显示在当前屏幕上, 则应以当前登陆的用户, 也就是切换身份前的用户执行如下命令:
xhost +
这个命令将允许别的用户启动的图形程序将图形显示在当前屏幕上。
在2台Linux机器之间, 如果设置服务器端配置文件/etc/ssh/sshd_config中包含
X11Forwarding no
客户端配置文件/etc/ssh/ssh_config包含
ForwardX11 yes
则从客户端ssh到服务器端后会自动设置DISPLAY环境变量, 允许在服务器端执行的图形程序将图形显示在客户端上. 在服务器上查看环境变量显示如下(这个结果不同的时候并不相同):
DISPLAY=localhost:10.0
在客户机上用netstat -lnp可以看到有程序监听了6010端口
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 4827/1
如果希望允许远程机器上的图形程序将图形显示在本地机器的Xserver上, 除了要设置远端机器的DISPLAY环境变量以外, 还需要设置本地机器的Xserver监听相应的TCP端口. 而现在的Linux系统出于安全的考虑, 默认情况下不再监听TCP端口. 可通过修改/etc/X11/xinit/xserverrc文件, 将
exec /usr/bin/X11/X -dpi 100 -nolisten tcp
修改为
exec /usr/bin/X11/X -dpi 100
允许在直接使用startx启动图形时启动对TCP端口的监听。
修改/etc/kde3/kdm/kdmrc, 将
ServerArgsLocal=-nolisten tcp
修改为
ServerArgsLocal=
允许kdm作为显示管理器时, 启动会话时监听相应的TCP端口。
修改/etc/gdm/gdm.conf, 在[Security]一节增加
DisallowTCP=false
或者在登陆窗口选择"Options" -> "Configure Login Manager..."的Security页面, 取消"Deny TCP connections to Xserver", 允许gdm作为显示管理器时, 启动会话时监听相应的TCP端口。
重庆思庄红帽RHCE认证培训班火热报名中!每月循环开班,欢迎联系试听!
系统运维
2019-11-23 16:51:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
20191119 很久没有在服务器上安装 mysql 了,很多细节都已经忘记了!找出以前的纪录,亦步亦趋的操作,还是会出现不一样的情况!
所以,再次记录一下本次过程!
1、打开自己以前的记录
官网手册 https://help.ubuntu.com/lts/serverguide/serverguide.pdf 从前的纪录 https://blog.csdn.net/u010953609/article/details/88085218
2、第一步就遇到问题了 $ sudo apt install mysql-server
直接蹦出来一个错误 E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it? 打开以上 2 个文件看看
$ cd /var/lib/dpkg/
/var/lib/dpkg$ ll -rw-r----- 1 root root 0 Nov 22 11:47 lock -rw-r----- 1 root root 0 Dec 14 2018 lock-frontend
$ sudo cat lock $ sudo cat lock-frontend
都是空的! 说是有另一个 apt 在操作?我也没有搞懂为什么! 准备重复一次之后再重启开看 因为这服务器很久没有用,所以,应该先 update 看看
$ sudo apt update $ sudo apt install mysql-server 他自己就好了! 难怪一般安装什么首先都 apt update! 以前就知道 Ubuntu 1804 安装 mysql 之后没有初始密码的,所以这次特别留意(可惜当时专注操作设置密码,没有截图保留!) 记得中途要求设置管理员账号和密码,账号还是选择了 root ,设置密码的时候有一个选择密码强度,我选择了 strong (最强), 自然 123456 这种密码是不能过关了!所以设置了一个 wwzzhhXXXXXXXX 一大串,当时也没有注意就过去了! 这个密码问题为后面 phpmyadmin 买了一个大坑!
2、 确认安装结果 sudo netstat -tap | grep mysql tcp 0 0 localhost.localdo:mysql 0.0.0.0:* LISTEN 7132/mysqld ps -ef |grep mysql mysql 7132 1 0 15:48 ? 00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid dhbm 7252 26865 0 15:51 pts/2 00:00:00 grep --color=auto mysql dpkg -l |grep mysql ii mysql-client-5.7 5.7.28-0ubuntu0.18.04.4 amd64 MySQL database client binaries ii mysql-client-core-5.7 5.7.28-0ubuntu0.18.04.4 amd64 MySQL database core client binaries ii mysql-common 5.8+1.0.4 all MySQL database common files, e.g. /etc/mysql/my.cnf ii mysql-server 5.7.28-0ubuntu0.18.04.4 all MySQL database server (metapackage depending on the latest version) ii mysql-server-5.7 5.7.28-0ubuntu0.18.04.4 amd64 MySQL database server binaries and system database setup ii mysql-server-core-5.7 5.7.28-0ubuntu0.18.04.4 amd64 MySQL database server binaries ii php7.2-mysql 7.2.24-0ubuntu0.18.04.1 amd64 MySQL module for PHP which mysql /usr/bin/mysql
3、本地命令行确认
$ mysql -uroot 开始直接就可以的,没有加 -p ,也没有提示我需要输入密码的 后面在折腾 phpmyadmin 的时候,重设了 root 登录的 plugin 方式 现在需要加上 -p
$ mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1023 Server version: 5.7.28-0ubuntu0.18.04.4 (Ubuntu) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
3、安装 phpmyadmin 按照手册操作 sudo apt install phpmyadmin
操作过程中会提示选择按照 Apache 、httpd 等方式自动识别,因为我要使用 nginx ,所以一个都没有选 实际内容是西崽到了 /etc/phpmyadmin 这个版本是 4.6 的 自行下载安装 phpmyadmin 4.9 官网下载地址 https://www.phpmyadmin.net/files/ 现在最新版是 5.0.0-alpha1
sudo wget https://files.phpmyadmin.net/phpMyAdmin/4.9.1/phpMyAdmin-4.9.1-all-languages.zip
修改配置 sudo cp config.sample.inc.php config.inc.php sudo vim config.inc.php $cfg['blowfish_secret'] = 'wzh20191119'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */ 配置 nginx 网站 这是第一次安装的 4.6版的 sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin
第二次自己下载的就直接放在 /var/www 目录下了,无需再软连接
设置 phpmyadmin 网站 root /var/www/phpmyadmin49; 测试 curl 127.0.0.1:999
502 Bad Gateway

502 Bad Gateway


nginx/1.14.0 (Ubuntu)

浏览器测试同样出现 502 Bad Gateway 百度之后得知,root 账户的登录 plugin 方式 auth_socket ,php 连接不上!
mysql> select user, plugin from mysql.user; +------------------+-----------------------+ | user | plugin | +------------------+-----------------------+ | root | auth_socket | | mysql.session | mysql_native_password | | mysql.sys | mysql_native_password | | debian-sys-maint | mysql_native_password | | pmauser | mysql_native_password | +------------------+-----------------------+ 5 rows in set (0.00 sec)
mysql> update mysql.user set plugin='mysql_native_password' where user='root';
再次打开网站,可以了!
mysqli_real_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES) root 密码死活不对! 当时安装过程中特意 cp 并记录了,不能错的! 安装过程中,2 次输入密码都确认的! 由于安装 mysql 是选择了密码强度 strong ,所以,想到可能当时没有大写字母,所以冲色号再一次带有大写字母的密码 update mysql.user set authentication_string=PASSWORD('M..带有大写字母的密码') where user='root';
使用新密码就 ok 了!
到底是安装过程中两次密码的时候他不认真确认,还是我当时没有仔细看提示呢?
系统运维
2019-11-23 14:49:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Loading jar:file:/opt/liferay-ce-portal-7.2.1-ga2/tomcat-9.0.17/webapps/ROOT/WEB-INF/lib/portal-impl.jar!/system.properties
Loading jar:file:/opt/liferay-ce-portal-7.2.1-ga2/tomcat-9.0.17/webapps/ROOT/WEB-INF/lib/portal-impl.jar!/portal.properties
Loading file:/opt/liferay-ce-portal-7.2.1-ga2/portal-setup-wizard.properties
系统运维
2019-11-21 10:49:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
until 循环执行一系列 命令 直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

until 语法格式: until condition do command done
condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
以下实例我们使用 until 命令 来输出 0 ~ 9 的数字: #!/bin/bash a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done
运行结果:
输出结果为: 0 1 2 3 4 5 6 7 8 9
本文原创地址: https://www.linuxprobe.com/shells-until-loop.html
系统运维
2019-11-21 10:06:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、 ./include/caffe/common.hpp:5:27: fatal error: gflags/gflags.h: No such file or directory
解决办法:sudo apt-get install libgflags-dev
2、 ./include/caffe/util/mkl_alternate.hpp:14:19: fatal error: cblas.h: No such file or directory
解决办法:sudo apt-get install libblas-dev
3、 ./include/caffe/util/hdf5.hpp:6:18: fatal error: hdf5.h: No such file or directory
解决办法:修改Makefile.config
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
4、 ./include/caffe/util/db_lmdb.hpp:8:18: fatal error: lmdb.h: No such file or directory
解决办法:sudo apt install liblmdb-dev
5、/usr/bin/ld: cannot find -lcblas
/usr/bin/ld: cannot find -latlas
解决办法:sudo apt install libatlas-base-dev
对于Centos没有这个包的情况可以修改Makefile.config文件 BLAS := open
6、.build_release/lib/libcaffe.so: undefined reference to google ::protobuf...
解决办法:1、查看是否为多个gcc版本冲突问题 2、 sudo apt install libprotobuf-dev protobuf-compiler
系统运维
2019-11-21 09:51:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
CentOS 与Ubuntu该如何选择,哪个更好用。笔者在自媒体平台收集了一些网友的观点,较为经典,分享给大家。至于应该选择哪个,希望看完本文章后,读者心中有数。
观点1:CentOS适用于服务器,Ubuntu则适用于个人桌面
1.1 服务器
这一点是CentOS胜,虽然它们同样是开源,免费。CentOS它的源码是来自由商业服务器Red Hat Enterprise Linux 。有很多公司都是用CentOS来代替商业版的Red Hat Linux,同时它的稳定性也是值得信赖的。而Ubuntu的开发目的是为了使个人电脑变得简单易用,虽然也提供相应的企业服务器,不过专业的还是CentOS。
个人使用
没毛病,那就是Ubuntu,大多数人觉得Linux难,其中的原因之一就是难于安装,但Ubuntu提供了友好的安装界面,所以非常简单。同时它还有出名的社区,可以帮助你非常轻松的入门,甚至成为专家。同时它有很多支持的软件,这些软件基础可以让你在上面办公,玩耍。还有在2013年发布了面向智能手机的移动操作系统,在2014年与魅族合作推出Ubuntu版MX3。从这些可见它在单用户使用的强大,完美。虽然CentOS也有相应的友好安装功能和支持功能,不过总体上真没有Ubuntu完美。
总的来说,它们都是非常优秀的,都是免费的,开源的,有很多的开发者大神都一直在进行修改,完善。基本上两者都没什么很大的区别,内核一样,只是附加的功能问题,如果你足够强大,甚至可以以Linux内核,开发也自己的专属Linux版本,在里面随心所欲。
CentOS适用于服务器,Ubuntu则适用于个人桌面
观点2:CentOS和Ubuntu平分秋色
首先,我们需要区分用户场景,如果是用户在自己电脑上使用,很显然 ubuntu 系统要更加合适一些。不是 ubuntu 比 centos 好,而是 centos 主动放弃了这部分市场。所以,没得选咯!
所以,这点上,我和其他人的回答是一致的。不一致的是,我个人不认为在服务端,ubuntu 比 centos 要差。这主要取决于你想干什么,和你是一个什么样的生产环境。
我们知道,在国内的linux 运维环境中, centos 是占大头的。一方面是因为 centos 出生名门,作为 redhat 社区版本,其稳定性毋庸置疑。另一方面,很多人都是看《跟 鸟哥 学linux》成长起来的,而 鸟哥 就是讲的 centos 系统。算是人为的推广吧。
其实,在国际上,采用 centos 和采用 ubuntu 作为服务端是其实是五五开的。两者各有特色,完全可以根据自己的需求进行选择。
最最重要的差异就是,ubuntu 相比 centos 在更新策略上要积极一些。我们知道,在 centos 上如果不配置扩展源的话,很多软件都是没办法yum安装的,比如 nginx。
而如果是选择 ubuntu 系统,就没有这个烦恼啦,直接 apt install nginx 就可以咯!
所以,如果你希望更加容易的获得较新版本的软件,使用 ubuntu 系统可能会更加方便一些。当然,如果保守一些,希望稳定一些,还是选择 centos 靠谱。
当然,你也不要看到了我这个回答,就建议公司将生产环境换成 ubuntu 系统。因为运维工程师掌握的技能擅长哪个就用哪个就好了。强行更换系统,如果造成重大损失,会让你吃不了兜着走的。
centos和ubuntu如何选择
观点3:Ubuntu适合初学者,CentOS更适合公司服务器
两个平台都属于当今最流行的Linux平台,这两个平台在我负责的不同项目中都使用过,简单总结一下:
Ubuntu对于初学者来说是更好的选择。
Ubuntu有一个很大的社区平台, 为我们提供丰富的文档和经验,
Ubuntu服务器可以图形化界面都适合大部分人的习惯。
所以,如果你是初学者,没有任何特殊的要求,那就使用Ubuntu服务器吧。
CentOS更适合公司生产环境的使用:
Centos更新频率不高,只有稳定的版本才会发布。
网上的项目教程有很多是基于Centos。
Ubuntu适合初学者,CentOS更适合公司服务器
观点4:CentOS更加稳定,Ubuntu对新技术支持度更好
CentOS 更加稳定,服务器部署多,文档丰富,对运维友好
CentOS更稳定些,支持时间也比较长,比较适合稳定线上环境。从各种配置文档和使用数量来说也是centos比较有优势,当各种操作出问题,寻找资料时候centos比较有优势。
很多软件都也都会提供centos的二进制源,通过yum安装配置也非常省事。centos缺点也是其稳定点,由于追求稳定性,所以内核版本往往比较旧,一些新功能的支持也跟不上。centos对运维更加友好一点。
Ubuntu 功能更新,图形桌面支持更好,对开发和个人用更友好
ubuntu则比较相反,追求最新功能。内核版本版本较新,新的功能能及时推出同步。ubuntu桌面功能Xwindow更好,比较适合个人使用。很多开发和个人使用的都是首选ubuntu。但是在服务器应用方面较centos少一点。ubuntu对开发更加友好一点。
虚拟话和容器方面
当然随着docker崛起,这种差异也在逐渐较少。由于ubuntu内核版本更新,而docker容器对linux内核新功能要求比较高,所以使用ubuntu作为docker容器的宿主机更加友好一点。
而且很多项目docker配置时候也仅仅支持了针对ubuntu的Dockerfile配置,所以容器化方面ubuntu比较优势。
观点5:个人学习Linux推荐使用Ubuntu
看你做什么,如果个人PC虚拟机学习Linux,推荐ubuntu的LTS版本,不过不要最新,18.04LTS或者16.04LTS。服务端就CentOS好一些。
不过,不影响你学习的,对于bash来说,ubuntu做了部分的封装,CentOS更加原生一些。Ubuntu也预装了一些工具,CentOS是比较裸的。
软件源来说ubuntu的软件源国内镜像更多一些。CentOS的一般用yum源,官网国内访问比较麻烦,镜像源很多都是不是严格对应的,有的替换的是rehat的源,有些版本不对应,没有对应到小版本号。
个人学习,推荐ubuntu,此外,他们之间的区别真的不大。没有必要太纠结。
观点6:CentOS稳定,Ubuntu功能激进
centos稳扎稳打,python以及gcc用的版本都是偏向旧的,所以稳定性不错。
ubuntu桌面版则是较为激进,软件包都是挺新的,所以遇到问题的几率较大。
还有坑了我较久的问题 :
apt install docker只能安一个壳子,不如直接搜安装docker-ce教程.
而yum install docker则直接把docker-ce都安好了
观点7:Ubuntu更容易使用,初学者应先从Ubuntu开始
首先要知道,他两个都是 Linux系统 ,如果你是初学的话我建议你先从Ubuntu开始,就我自己使用感受而言,Ubuntu上手容易,最主要的是文献较多,你使用过程中遇到的任何问题随便搜,都会找到好多答案,所以,从易于使用方面来讲,Ubuntu优于centos。
观点8:服务器用CentOS,娱乐用Ubuntu
那要看你用电脑做什么了。如果是用作服务器,那自然是CentOS了。CentOS就是服务器版的系统啊,人家专业啊!现在很多中小企业的服务器都用它,因为它免费啊,不要银子。但是,也因为免费,所以,开发者不提供技术支持,有了问题,只好自己动手,丰衣足食了。
如果你是当作办公用,写写文档,上上网,听听歌,那还是用Ubuntu啊!Ubuntu虽不是Windows那样的桌面操作系统,但是,它还是为使用桌面而做足了功桌,尤其是办公使用,只要你要求不高,它也足够用了。而且,Ubuntu还有好多个衍生版本,你可以挑选使用。比如,Kubuntu,就是使用KDE桌面的,有人喜欢这种桌面;Lubuntu,就是使用LXDE桌在的,它适用老机器;Ubuntukylin,专为中国人开发的衍生版,有许多中国元素,如农历等等。
另外,还有一些基于Ubuntu开发的版本,如Mint,是界面上最像Window的Linux套件之一,和Window一样,有任务栏,也有开始菜单。如果你到百度下搜索一下,基于Ubuntu的Linux套件还多得是。Ubuntu16.04是长效支持版,支持5年的更新。它默认使用libreoffice为办公软件,能编辑MS-Office文档。Ubuntukylin提供WPS-Office Linux版下载链接。总之,只要你没有太高要求,办公使用足够用了。
观点9:CentOS适合于服务器,Ubuntu和Fedora适用于个人桌面
这就是要看你用的用途定位了!
ubuntu更类似windows xp,win7,win8,win10这些针对个人使用的消费市场。
centos则类似windows server 2008,windows server 2016的服务器市场。
如果是作为桌面使用的话那就是ubuntu,fedora这些桌面版的linux。
但是作为服务器使用还是用centos,不是说ubuntu不能用,如果用win7当作服务器上线总是感觉不放心啊,什么时候就死机了呢。服务器操作系统要求的稳定、强壮的运行!
在安装的时候选择包的时候就能看到区别,centos 的minunum安装不到700个软件包,这说明啥,越是少的软件包,出错的机率越是少啊!
再就是centos脱胎于redhat,Oracle在选择linux做发行版的时候也是选择的redhat的源码再发行,可见centos有着和 红帽 一样优秀的稳定的内核。不过centos被 红帽 收购了!
观点10:Ubuntu更合适于个人使用
如果有部署好的linux服务器,那么基本上大型服务器都是centos的,我的建议是,在个人终端上安装与服务器一致的系统,最好版本号都一样,也尽量别升级。
如果单纯想用linux我个人比较推荐ubuntu,两者在pc上区别不大。但是国内用户下载的ubuntu,如果在中文页面上下载大概率遇到没节操且内置奇怪软件的版本,所以建议下载英文原版操作系统。
额外说一下,如果电脑配置很差,还有xubuntu、lubuntu等等轻量级操作系统,也可以用,适合初学者。
总结
看了这么多观点,其实,笔者觉得网友都是按自己的感受表达。我个人的看法是,Ubuntu和CentOS系统都适用于服务器。笔者可以告诉你,在超大型的数据中心上,Ubuntu占有率绝对不会比CentOS弱。但如果想学习Linux技术,CentOS是更优的选择。需要参加红帽RHCSA、 RHCE 、RHCA认证,肯定要安装RHEL或CentOS系统。
系统运维
2019-11-21 01:28:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
linux下面的定时任务有时候需要限制只能一些用于可以使用,crontab 用来任务定时调度,在 Linux 下可以通过创建文件 /etc/cron.allow 或者 /etc/cron.deny 来控制权限,如果 /etc/cron.allow 文件存在,那么只有这个文件中列出的用户可以使用 cron, 同时/etc/cron.deny文件被忽略; 如果 /etc/cron.allow 文件不存在,那么文件 /cron.deny 中列出的用户将不能用使用 cron任务调度。 创建一个普通用于test,这里默认具有crontab权限,下面我们创建一个cron.deny文件然后把用户加进去
切换到root,在cron.deny增加test,如下:
再使用test用户然后使用test进行crontab -e任务,会提示没有权限执行crontab任务
如果/etc/cron.allow文件中也存在test用户,那么就会以此文件为准,如下:
也可以通过service crond status进行启停服务
系统运维
2019-11-20 22:55:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Project branch master updated. cf52d60ed8f58d87680560845a2e58098c758842
红色加粗部分为版本号。
第一步: git branch s105 cf52d60ed8f58d87680560845a2e58098c758842 ( git branch new_branch_name branch_name/tag_name )
s105这个分支号你可以随便定。
第二步: git checkout s105
就OK了。
系统运维
2019-11-20 22:42:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
来源: https://blog.csdn.net/Powerful_Fy
for、while循环
for循环语法:for 变量名 in 条件; do …; done
示例一:打印1-100的数字并求和 #!/bin/bash sum=0 for i in `seq 1 100` do sum=$[$sum+$i] echo $i done echo $sum
seq1 2 10:打印结果1,3,5,7,9(2表示步长,打印结果间隔为2)
seq10 -2 1:打印结果10,8,6,4,2(倒序打印步长为负)
seq -w 1 10:打印结果01,02,03,04,05,06,07,08,09,10(-w 表示等宽)
示例二:打印指定目录下的文件 #!/bin/bash cd /etc for i in `ls /etc` do if [ -f $i ] then ls -l $i fi done
while循环语法:while 条件; do … ; done
示例一:平均1分钟负载大于5时,发送邮件 #!/bin/bash while : do load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d . -f1` if [ $load -gt 5 ] then d=`date +%F_%T` top -nb1|mail -s "$d load is high: $load" asnfy@qq.com fi sleep 30 done
示例二:判断输入内容是否为空或包含非数字 #!/bin/bash while : do read -p "Please input a number: " n if [ -z "$n" ] then echo "you need input sth." continue fi n1=`echo $n|sed 's/[0-9]//g'` if [ -n "$n1" ] then echo "you just only input numbers." continue fi break done echo "you input number is $n"
#如果输入的内容为空为包含非数字,continue跳出重新执行,否则break结束循环
补充:
当使用for遍历一个文件中的每行内容时(for i in `cat test`),如果某行中有一个或多个空格,这行的内容就会被当做两行或多行打印,为了避免这种情况可以使用while来循环输出文件中的每行内容
示例: #!/bin/bash cat test.txt|while read i do echo $i done
#使用while遍历文件中的内容,即使某行有空格,也会被正常打印
break、continue、exit
break:直接结束循环 #!/bin/bash for i in `seq 1 5` do echo "第一次输出:$i" if(($i==3)) then break fi echo "第二次输出:$i" done echo "循环结束"
执行结果: [root@linux ~]# sh a.sh 第一次输出:1 第二次输出:1 第一次输出:2 第二次输出:2 第一次输出:3 循环结束
continue:忽略后面的代码,从新开始循环 #!/bin/bash for i in `seq 1 5` do echo "第一次输出:$i" if(($i==3)) then continue fi echo "第二次输出:$i" done echo "循环结束"
执行结果: [root@linux ~]# sh a.sh 第一次输出:1 第二次输出:1 第一次输出:2 第二次输出:2 第一次输出:3 第一次输出:4 第二次输出:4 第一次输出:5 第二次输出:5 循环结束
注意:循环支持嵌套,如果一个循环中嵌套了多个循环,break或continue只能作用于所在的某个循环中
exit:直接退出脚本 #!/bin/bash for i in `seq 1 5` do echo "第一次输出:$i" if(($i==3)) then exit fi echo "第二次输出:$i" done echo "循环结束"
执行结果: [root@linux ~]# sh a.sh 第一次输出:1 第二次输出:1 第一次输出:2 第二次输出:2 第一次输出:3
#循环外的echo语句没有输出,当脚本中遇到exit,会直接退出,后面所有内容都不再执行
补充: 当脚本遇到exit直接退出后,echo $? 查看执行结果会显示0,表示执行成功,所以一般使用exit会在后面加上指定的非0数字,方便调用结果(比如:exit 5)
系统运维
2019-11-20 22:41:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
环境:
Centos7.4 超微X10主板 2080TI显卡(用主板做显示)
报错信息:
Oh no! Something has gone wrong.Logout!
在安装完系统后桌面正常,在移除nouveau模块并安装nvidia驱动和CUDA之后桌面崩溃报错。
解决办法:
通过yum upgrade升级,然后再降内核版本、系统版本。
rpm -qa | grep kernel
yum remove <要删除的内核版本>
grub2-mkconfig -o /boot/grub2/grub.cfg #重新编译引导
rpm -Uvh --oldpackage centos-release-7-4.1708.el7.centos.x86_64.rpm #强制安装7.4系统版本并删除新版本
系统运维
2019-11-20 18:20:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
系统版本 root@cbsp2:/tmp/zabbixagent# cat /etc/issue Ubuntu 12.04.5 LTS \n \l root@cbsp2:/tmp/zabbixagent# cat /etc/*release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=12.04 DISTRIB_CODENAME=precise DISTRIB_DESCRIPTION="Ubuntu 12.04.5 LTS" NAME="Ubuntu" VERSION="12.04.5 LTS, Precise Pangolin" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu precise (12.04.5 LTS)" VERSION_ID="12.04"
1、下载
https://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/3.4.15/zabbix-3.4.15.tar.gz
2、上传到指定的服务器目录/tmp
我这里没有创建zabbix用户 我用 root启动的
3、编译安装 tar xvf zabbix-3.4.15.tar.gz cd zabbix-3.4.15 ./configure --prefix=/opt/zabbix-3.15 --enable-agent make && make install cp /tmp cp /tmp/zabbix-3.4.15/misc/init.d/debian/zabbix-agent /etc/init.d/

修改如下 root@cbsp2:/tmp/zabbixagent# cat /etc/init.d/zabbix-agent #!/bin/sh # # Zabbix agent start/stop script. # # Copyright (C) 2001-2018 Zabbix SIA NAME=zabbix_agentd DAEMON=/opt/zabbix-agent3.4.15/sbin/${NAME} ##修改这行是你编译的那个路径 DESC="Zabbix agent daemon" PID=/tmp/$NAME.pid test -f $DAEMON || exit 0 case "$1" in start) echo "Starting $DESC: $NAME" start-stop-daemon --start --oknodo --pidfile $PID --exec $DAEMON ;; stop) echo "Stopping $DESC: $NAME" start-stop-daemon --stop --quiet --pidfile $PID --retry=TERM/10/KILL/5 && exit 0 start-stop-daemon --stop --oknodo --exec $DAEMON --name $NAME --retry=TERM/10/KILL/5 ;; restart|force-reload) $0 stop $0 start ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload}" >&2 exit 1 ;; esac exit 0
修改zabbix配置文件如下 root@cbsp2:~# cat /opt/zabbix-agent3.4.15/etc/zabbix_agentd.conf |grep -v "^#"|grep -v "^$" LogFile=/tmp/zabbix_agentd.log Server=9.1.8.198 ServerActive=9.1.8.198 HostnameItem=system.hostname HostMetadataItem=system.uname AllowRoot=1
启动 root@cbsp2:~# /etc/init.d/zabbix-agent start #启动 我这个已经是启动的了 Starting Zabbix agent daemon: zabbix_agentd /opt/zabbix-agent3.4.15/sbin/zabbix_agentd already running. root@cbsp2:~# /etc/init.d/zabbix-agent Usage: /etc/init.d/zabbix_agentd {start|stop|restart|force-reload} root@cbsp2:~#
查看日志
系统运维
2019-11-20 18:20:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
摘要:介绍宜信智能运维平台UAVStack的设计思想、技术架构和核心功能,及落地实践经验。 内容来源:宜信技术学院第6期技术沙龙-线上直播|宜信智能监控平台建设实践
主讲人:宜信高级架构师 & 智能监控平台负责人谢知求
一、UAVStack平台的产生背景
目前业界常用的监控软件有很多,主流产品或以监控深度见长、或以监控广度见长。 关注监控广度的代表产品是Prometheus,其特点是生态圈活跃,针对常见的互联网中间件(如MySQL、Redis、Kafka、RocketMQ、MongoDB、ElasticSearch等)均提供了现成的指标采集插件来进行监控。类似产品还有Zabbix、Nagios和Open-Falcon。 关注监控深度的产品也有很多,如听云、OneAPM、PinPoint、SkyWalking。这类软件一般是探针型的,在应用性能监控方面提供了更深入的监控能力。
这些产品各有优势,也存在不足之处: 无法兼顾监控的广度和深度; 无法同时支持实时指标、调用链和日志三类类数据的采集,未考虑这三类功能的集成连通性,无法解决数据的时效、品控、对齐等问题。
为了克服上述不足,同时满足公司多样化和智能化的监控需求、降低二研的成本和难度,我们自主研发了全维监控与智能运维基础平台(UAVStack)。
作为智能监控平台,监控仅仅是智能化运维的第一环。我们认为,智能运维(AIOps)可以分三步走:全维监控、全维关联和全维智能。 第一步:全维监控,通过统一的采集体系,采集全维度的监控数据,包括系统、应用和服务的画像数据、实时指标数据、调用链数据和日志数据。 第二步:全维关联,获取全维度的监控数据后,需要进一步建立数据之间的关联关系。这种关联关系可以是通过画像、服务流图谱或调用链数据建立的强关联关系,也可以是通过机器学习算法建立的关联关系。通过全维关联,可以在监控数据之间建立实时关联关系;有了关联关系,我们就可以做根因分析了。 第三步:全维智能,通过引入包括异常检测、根因分析、智能降噪及任务机器人等AI服务,用机器取代人进行一些决策,从而持续提升公司智能化运维的水平。
二、UAVStack平台的总体技术架构
2.1 全维度监控+应用运维解决方案
使用UAV的全维监控和应用性能管理工具集可以搭建一站式全维度监控+应用运维解决方案。
首先,UAV在每个物理机、虚拟机以及容器上部署一个监控代理程序(MonitorAgent,MA)。MA实际上是部署在宿主机上的独立JVM进程。
其次,在每个JEE中间件、JSE应用或其他JVM语言应用中,可通过Java Agent的形式植入监控探针,监控探针会与应用在同一个JVM进程中一起启动。
监控探针启动时,会自动对应用进行画像和监控。应用画像包括服务组件、客户端组件和日志组件的画像。 服务组件是应用对外暴露服务能力的接口,如服务URL; 客户端组件是应用访问的其它服务或第三方数据源(如MySQL,、Oracle、 Redis、MQ等)客户端; 日志组件是应用输出的日志。
除对以上三类组件进行自动画像和实时数据采集外,监控探针也会记录每个请求/响应生成端到端的调用链路,绘制各个应用/服务之间的调用关系,并生成服务图谱。
监控代理程序(MA进程)会定时拉取监控探针采集的数据,同时也会采集应用环境的性能指标(如CPU、内存、磁盘IO等)。此外,MA还提供了插件机制,支持个性化指标的采集。
最终,我们采集到了包括指标Metrics、调用链Tracing及日志Logging的全维度监控数据。其中: Metrics数据包括:业务自定义指标、应用环境性能指标、应用集群/实例性能指标、服务组件/客户端组件/URL性能指标。 Tracing数据包括调用链指标、客户端体验(UEM)数据。 Logging数据包括日志、线程栈(Thread)数据。
2.2 监控探针架构
UAV采集侧主要包括监控Agent和监控探针两部分。 监控探针负责应用层面的监控。 监控Agent负责应用环境层面的监控,同时会定时拉取监控探针的数据并上送给UAV服务端。
上图所示是监控探针的架构图。随着UAV功能的增强,探针已不仅仅用于监控目的,现在已经改名为中间件增强框架。
上图左边可以看到,中间件增强框架位于应用服务器和应用之间,采用了中间件劫持技术,对应用服务器的代码进行了类加载劫持和字节码改写,对上层应用代码无侵入。
右边是监控探针放大之后的架构图,最底层是应用服务器适配层,对互联网常用的开源中间件(如Tomcat、Jetty、SpringBoot)提供了适配支持,对其它服务器可以相应地扩展一个Adapter适配器来进行支持。
在适配层之上,首先提供了一系列通用的扩展点SPI,再基于这些SPI,扩展出了与监控相关的画像收集和指标采集功能;与问题诊断分析工具相关的调用链跟踪、浏览器跟踪、JVM线程分析、堆内存dump执行等功能;与服务治理相关的服务限流/降级以及服务安全管控等功能。此外,还提供了这些功能对Docker和K8s容器环境的适配。
最上层提供了应用对接API以及数据发布API,支持通过HTTP和JMX两种方式来获取探针上的监控数据。
2.3 数据捕获架构
接下来将介绍UAV数据捕获和传输的架构。
从上图可以看到,监控代理程序Agent数据传输采用了双通道+双心跳的方式:
1)双通道是指HTTP心跳和MQ传输这两条通道: Http心跳传输通道,用来传输应用环境相关的监控数据,主要包括:容器/节点画像数据和实时监控数据; MQ传输通道,用来传输应用相关的监控数据,主要包括:应用实时数据,画像数据,日志数据,以及调用链和JVM线程栈等APM数据。MQ数据传输通道上的数据格式采用了统一的Schema,方便后期对数据的转换和处理。
2)双心跳是指不管来自Http通道还是MQ通道的数据,实际上既可以看成监控数据,也可以看成心跳数据。来自每个通道的数据都会到UAV监控后台服务“签到”。两种通信方式意味着更高的可靠性。
Agent通过双通道的方式,将数据传输到UAV监控后台,我们称之为健康管理服务。
健康管理服务会根据数据类型对监控数据进行解析处理,并分别持久化到合适的数据源,比如OpenTSDB存储时序指标数据;ES存储日志、调用链、JVM线程分析等APM数据。
AppHub是UAV的统一门户,提供了监控数据的集中展示及用户权限的管理功能。用户可以在PC端和移动端登录UAV,获得随时随地的运维体验。
健康管理服务也是采用微服务架构构建的,包括多个微服务,支持集群部署和扩容。
三、UAVStack平台的核心功能及其原理(附案例)
3.1 UAVStack核心功能
上图展示了目前UAVStack的核心功能,主要包括:应用监控、应用环境监控、服务流、调用链、JVM监控、数据库监控、日志监控、性能告警、浏览器跟踪、配置中心、时空沙盘、上帝罗盘、服务治理、容器生态支持、业务监控、智能运维(AIOps)等。其中: 浏览器监控:用来监控前端Web页面的性能数据; 时空沙盘:提供了对历史监控数据的查询; 上帝罗盘:提供了监控大屏的展示; 智能运维(AIOps)包括:异常检测、根因分析、告警收敛和智能降噪、任务机器人四个方面的能力。
此外,还包括图上未列出的一些运营支持的相关工具,如UAV统一升级中心;UAV监控日报、周报、月报;UAV使用情况统计等。本次分享将重点介绍上图中白色字样的功能。
3.2 应用监控
首先介绍UAV应用监控的核心原理。
3.2.1 核心原理:对应用代码无侵入技术
UAV应用监控的核心原理是:对应用代码无侵入技术。 UAV对应用代码无侵入,应用无需任何改造。 UAV不需要应用使用统一的开发框架。
UAV的代号是“无人机”的缩写,寓意:无人机翱翔蓝天,智能地、透明地完成任务。
其中用到的核心技术主要包括: 中间件劫持技术,含Java Agent探针和字节码改写; 应用/服务画像与监控技术。
3.2.2 无侵入技术:应用/服务画像
监控探针通过中间件劫持技术实现对应用/服务的自动画像和监控。 中间件劫持就是将我们自己的代码植入到中间件的各种行为中。 中间件劫持的核心是:掌控类加载树,获取优先加载权,植入我们自己的代码。
以应用/服务画像为例: 当Web容器中Standard Context这个类加载时,通过字节码改写植入了相关的画像代码。JEE应用启动时会执行植入的代码,生成应用画像和服务画像; 应用画像主要包括:应用标示、应用名称、应用的URI:http(s)://<本地IP>:<端口>/、应用的类库信息(从加载应用的webapp class loader中获取); 服务画像是按照JEE技术规范进行扫描的,通过扫描注解和部署描述符,提取了服务注册相关的信息,从而生成了服务画像。
3.2.3 无侵入技术:应用/服务监控
与应用/服务画像类似,应用/服务监控也是在加载服务器相关类时,通过字节码改写植入相应的监控代码。
以Tomcat为例: CoyoteAdapter负责整个Tomcat的服务请求;StandardWrapper负责所有Servlet的服务请求。 加载这两个类时,UAV会通过字节码改写植入监控代码。当有实际请求发生时,会调用植入的请求拦截代码和响应回复拦截代码,进行性能指标的采集。 采集到的性能统计指标会缓存到全局计数器中,后续由监控Agent集中采走。
上图所示是应用监控的一个实际展示界面。
可以从应用集群的展示界面,钻取到应用实例的监控展示界面,再钻取到自动画像出来的服务组件/客户端组件和日志组件的展示界面,最后再钻取到服务组件/客户端组件的每个URI的监控指标界面以及日志展示界面。可以从全局钻取到细节,获取想看的监控数据。
此外,我们还提供了服务URL监控报表和客户端URL监控报表。
以服务URL监控报表为例: 可以直观地看到该应用中所有服务URL的访问计数、平均响应时间、累计访问计数、累计错误计数、成功率等指标在选定时间区间内的统计数据。 时间区间支持最近10分钟、最近3小时、今天、昨天、最近7天以及自定义的任意时间区间。
如上图,点击查看某个URL的详情,可以查看该URL在不同时间区间的详细报表。
3.3 应用/服务拓扑:服务流
接下来介绍服务流相关的功能。基于应用/服务画像和监控数据,UAV提供了服务流的功能。服务流涵盖了应用拓扑的内容,但提供了比应用拓扑更丰富的运行时状态的展示。
从上图可以看到,当前服务位于中间位置,左边是调用当前服务的服务,右边是当前服务调用的其它第三方服务。
在服务流图上,连线的粗细表示调用量;连线的颜色代表健康状况,以响应时间和错误数为参考:绿色代表健康、黄色代表警告、红色代表严重。比如当连线为粗红线时,代表着有大量请求发生了错误。
如图,我们可以从全局的服务流钻取到某个业务线的服务流,再钻取到该业务线下某个应用集群/实例的服务流,进行全局范围的性能追踪。
3.4 调用链
3.4.1 调用链:全链追踪
调用链分为轻调用链、重调用链和方法级调用链。 轻调用链也叫基本调用链。应用无需任何改造,可以运行时启动和停止。获取的数据包括服务/请求URL、服务类+方法、调用类+方法、耗时、结果状态+异常、应用特征、技术栈特征等,性能开销可以忽略; 重调用链是在轻调用链的基础上增加了对请求/响应数据报文的获取,性能开销稍大,依据报文数据量一般会有5%的性能下降; 方法级调用链:如果不开启方法级调用链,则仅在服务的入口和出口生成调用链节点。如果想要在应用内部也生成调用链节点,可以使用方法级调用链。可以通过AppHub界面配置需要跟踪的类和方法。方法级调用链的性能开销较小,具体消耗取决于报文数据量。
3.4.2 调用链:实现原理
上图展示的是一个调用链具体的生成流程。调用链节点主要是在服务接口代码处和客户端调用代码处生成。如果开启了方法级调用链,也会在过程方法代码处生成调用链节点。
此外,介绍一下关于调用链上下文的传递。
服务内上下文的传递:同线程的情况下使用了基本ThreadLocal;跨线程(池)的情况下使用了可传递ThreadLocal(TTL)。
服务间上下文的传递:通过客户端劫持(client hook)对原协议(如HTTP,RPC,MQ)进行适配,并在协议头注入调用链上下文的元数据。传输到下一个服务接口的时候,会由下一个服务解析协议头里的调用链上下文元数据,重新构建调用链上下文,然后再继续往下传递。
3.4.3 调用链:关键技术
调用链的实现主要使用了4个关键技术。 服务内上下文的传递。主要基于原threadlocal实现了支持父子线程之间值传递的threadlocal。 服务间上下文的传递。通过客户端劫持(client hook),对原协议进行适配,并在协议内注入调用链上下文元数据。 报文体内容提取。重调用链提取请求/响应数据报文体内容时,为把对应用的影响降到最低,使用了servlet wrapper机制在用户读取报文体时进行数据转存(利用string池的属性最小占用内存)。 调用链数据的收集和处理。通过agent对调用链数据进行抓取,HM端进行数据解析入库并提供查询接口,使用极简数据格式最小化占用带宽。
3.4.4 调用链展示:可视化,可关联日志,快速定位问题
这是调用链的实际展示界面。在调用链列表上, 可以一键获取最近1分钟、最近12小时前100及最近1小时最慢的调用链。 可以根据应用服务的特征,按照时间区间或业务关键词自定义搜索相关的调用链。 在调用链的任何环节,都可以查看整个端到端的完整的调用链。 通过端到端完整的调用链的展示,可以快速发现调用缓慢的瓶颈或出错的节点。 可从调用链的任意节点跳转到日志界面,查看该调用链环节对应的日志。 可以从日志界面跳转到该日志对应的调用链,查看该日志位于完整调用链路的哪一环,从而帮助我们快速排查和定位问题。
3.4.5 调用链展示:查看请求/响应报文
开启了重调用链的情况下,我们可以查看请求/响应报文的详细数据。
上图中可以看到,开启了重调用链的情况下,我们可以获取到请求头信息、请求内容、响应头信息、响应内容等详细数据。
3.5 日志监控/管理
3.5.1 日志捕获架构
上图所示是UAV日志功能的架构图。UAV日志功能采用了日志管理系统流行的EKK架构,包括日志的采集、上送Kafka、ES存储/查询、RAID历史备份/下载以及基于异常/关键字和时间的统计和告警功能。
应用服务器上的Agent采集、读取日志,并把读取到的数据发送到Kafka集群上。 对于需热查询的日志,由logging-store程序从Kafka读取日志并保存到ElasticSearch集群中; 对于需冷备份的日志,由logging-raid程序从Kafka读取日志,先存到本地磁盘,每天凌晨会将本地日志按天压缩,备份到RAID集群中。
日志的统计和告警功能:由logging-statistics程序从Kafka读取异常、关键字、Nginx日志,并以分钟为单位统计数量,保存到Redis中,供后续统计展示和告警。
具体日志展示界面在介绍调用链关联到日志部分已出现过了,这里就不赘述了。
3.6 性能告警
3.6.1 性能告警:多指标联合表达式,流式/同比/环比,双收敛,反馈动作
UAV获取到全维度的服务端指标集、客户端指标集、日志指标集和自定义指标之后,可以设置多指标联合告警条件,这些条件包括流式/同比/环比的条件(“同比”比如今天10点和昨天10点的对比;“环比”比如最近5分钟和上一个5分钟的对比),可以混合使用构成联合表达式。
为避免告警轰炸,UAV提供了2种告警收敛策略:时间冷却收敛和梯度收敛。梯度收敛策略上,我们配置了“1”“5”“10”,即第1次、第5次、第10次满足告警条件时才会发送告警提醒,其他时间则进行压制处理,不发送告警提醒。
告警可通过短信、邮件、微信及移动App推送通知到人,也可以通过HTTP方式通知其他系统。
3.6.2 性能告警:预警策略模板、灵活的策略编辑、多种通知
创建预警策略时,可以使用预警策略模板。上图是系统里的预警策略模板截图。
选定策略类型之后,预警策略的规则和条件会根据我们缺省推荐的套餐自动设置,用户只要配置需要报警的目标范围和通知方式,直接保存就可以了。也可以调整模板套餐里的阈值和报警表达式。此外,告警也支持运行时动态启用和禁用。
3.7 JVM监控分析
3.7.1 JVM监控分析工具:整体架构
JVM监控分析工具基于UAVStack已有整体架构,如上图所示。整体分为前端、后台及探针MOF部分。 前端负责数据展示以及向后台发送用户的执行指令。 后台负责将指令下发到具体节点及结果的归集和处理。 监控探针MOF负责接收后台下发的指令,执行指令返回结果。
其中在探针部分: JVM实时监控数据,如堆内存大小、Minor GC和Full GC的情况,都是通过JMX提供的接口来获取。 JVM堆内存采样分析数据和CPU采样分析数据,则通过JDK提供的Java Attach API进行获取。
3.7.2 JVM监控分析工具:监控功能展示
上图是JVM监控分析工具的监控功能展示页面。JVM监控分析工具的功能主要包括: 基本信息Tab显示JVM基本信息,包括JVM版本、启动时间、JVM参数、系统属性等。 监控Tab提供JVM实时监控指标展示,包括CPU、线程、内存、GC统计等。用户可以切换时间/区间,比如最近10分钟、最近3小时、今天、昨天、最近七天或自定义的时间/区间,查看不同时间/区间内的JVM监控数据。 线程分析和内存Dump Tab提供了JVM线程分析与JVM堆内存Dump在线工具。 CPU采样和内存采样Tab提供了JVM堆内存采样分析和CPU采样分析工具。
3.7.3 JVM监控分析工具:堆内存采样和CPU采样分析
堆内存采样分析可实时采样JVM的堆内存分配、每个类实例对象的数量以及这些实例所占用的内存大小,从而辅助定位内存泄露的根源。 CPU采样分析可实时采样JVM每个方法的CPU执行时间,可辅助定位热点方法。比如CPU达到100%时,可以定位哪些方法占用CPU比例较高。
3.8 数据库监控
3.8.1 数据库监控:核心功能
区别于传统的数据库端的监控,UAV的数据库监控采用新的视角,从应用端切入分析,弥补了现有数据库端监控的不足,增加了数据库-应用的关联分析能力。
数据库监控目前已实现的功能包括:数据库连接池监控、SQL分类统计、慢SQL统计、慢SQL耗时分布统计、慢SQL追踪以及与调用链/日志关联。
慢SQL的监控功能主要包括慢SQL统计+慢SQL追踪。对慢SQL的监控,可以自主设定阈值,界定多慢才算是慢SQL。用户可以按具体应用和它操作的数据库实例来设置,高于设置阈值的SQL操作才计入慢SQL。
在开启调用链/日志归集的情况下, 慢SQL操作可关联至对应的调用链以及日志,帮助我们诊断和定位问题。
上图是数据库监控功能的慢SQL统计报表,展示了某段时间之内慢SQL的计数情况。慢SQL分类统计根据SQL类型,包括I-插入、D-删除、U-更新、Q-查询、B-批量操作,对慢SQL进行分类统计。
图中下方两个报表中,一个是数据库连接池监控,可以查看连接池总连接数、活动连接数以及空闲连接数;另一个是SQL分类统计,可以根据SQL类型来分类统计。
3.8.2 数据库监控案例:某催收系统
通过某外购催收系统的数据库监控案例来说明数据库监控的使用方法。
催收系统在查询催收历史时,统计记录数的count(*)语句,因为执行计划异常,执行效率低,占用了大量资源,导致数据库服务器CPU资源耗尽,进而系统不可用。从图上可以看到,故障期间的慢SQL数目明显变大,慢SQL具体为count(*)语句。
上图可以查看到慢SQL的详细SQL语句,得知故障期间的连接池资源被耗尽,活动连接数达到峰值,而空闲连接数为0;SQL分类统计图表也显示故障期间查询错误SQL数量明显变大。
通过慢SQL追踪界面,可以查看故障期间的慢SQL列表,发现执行时间长的三条SQL全是count(*)语句。
每一条慢SQL的执行结果及SQL语句都可以与调用链关联。继续点击,查看慢SQL详情及与调用链关联,均显示了count(*)语句执行时间长,且执行错误。通过慢SQL的执行与调用链、日志的关联,可以辅助定位和分析故障问题。
3.9 容器生态支持
3.9.1 容器生态支持:基本原理
对容器生态上的支持是指UAV以上所有功能都能在容器云平台上无缝迁移和使用。在容器环境下,监控Agent和应用分别在不同的容器中,需要做一些适配工作,主要体现在应用画像/监控数据的采集、进程画像/监控数据的采集、日志采集路径的适配上。
首先,在应用画像/监控数据的采集上,监控agent容器应允许通过容器的虚拟IP访问应用的容器,通过http请求获取应用画像及实时监控数据。 其次,在进程画像/监控数据的采集上,监控agent的容器PID namespace需要和宿主机保持一致,从而保证监控agent可以扫描宿主机的/proc目录获取进程信息。 最后,在日志采集路径的适配上,监控agent应允许通过API获取应用和agent自身使用的volume信息。有了双方的volume信息,agent才能正确地在自身的容器内找到应用输出的日志路径。
3.9.2 容器生态支持:应用环境监控 — Kubernetes
UAV以上所有功能都能在容器云平台上的无缝迁移和使用,所以从UI上看不出来和VM有何区别,仅在应用环境监控界面上有些不同。上图截取了Kubernetes环境下的应用环境监控界面,可以看到一个物理主机上有10个主机进程、17个容器、28个在容器里的进程。
应用环境监控可以显示容器和进程的对应关系。可点击分别查看容器性能指标和进程性能指标。
在容器或进程的属性列表里,新增了K8S相关的属性展示。这是在容器云环境下,我们可以从应用环境监控UI中看到和VM环境下的些许差异。而对于其它功能(如调用链、日志监控、数据库监控,等等)而言,界面在容器环境下和VM环境下是没有任何区别的,用户感觉不到差异。
3.10 Agent插件支持
3.10.1 Agent插件支持:支持Open-Falcon插件与UAV自定义插件
为了弥补监控广度上的不足,UAV目前提供了指标采集插件,支持已有的Open-Falcon的指标采集插件(类似Prometheus的exporter),也支持UAV自定义插件,使UAV监控能力可灵活扩展到对几乎所有常用的互联网中间件的监控,如MySQL、Redis、Kafka、RocketMQ、MongoDB、ElasticSearch等。
上图展示了UAV对Kafka、RocketMQ、Redis指标的监控曲线。
3.11 业务链路监控与告警
3.11.1 业务链路监控与告警:解决方案
宜信公司业务大多跨多个业务线和多个系统,为在IT层面可以快速定位问题系统,在业务层面上也可以给出受影响或波及的具体业务单据和客户范围,解决业务/运营人员的痛点,UAV提供了一套通用的业务链路监控与告警接入平台。
如图所示,该平台包括异构业务日志归集、数据上送、数据切分、过滤、聚合计算等功能,之后可以将结果持久化,提供业务报表大屏展示,也可以根据结果告警,生成业务工单。
实施过程中,各业务组先在应用中埋点具有业务涵义的日志,然后自助配置和维护对业务日志的解析逻辑、具体的告警策略和告警消息模板内容,从而可以快速搭建针对自身业务的链路监控系统。
这套业务监控系统的优势在于: 将IT层面的调用链与业务事件双向关联,给IT层面的调用链赋予了业务涵义的同时,将跨系统的调用跟踪升级为跨业务领域的跟踪。 发生问题后,可以发出具有业务涵义的告警消息,将业务问题直接反馈给业务/运营人员;也能根据调用链快速定位到问题节点,从而帮到技术运维人员;此外,技术人员与运营人员也可通过业务ID反查系统链路来追溯问题。
3.11.2 业务链路监控与告警:业务告警示例
这是一个业务告警的具体例子。
上方是发给业务同事的告警邮件,内容可以细化到X年X月X日X:X:X,在X个系统的X个业务环节,发生了X问题,影响了X类型的客户,客户姓名是X,手机号是X。帮助业务运营人员快速定位问题单据和受影响的客户。
下方是发给技术运维同事的邮件,在业务同事邮件的基础上,额外提供了IT调用链路,方便技术运维同事快速定位和诊断问题。
3.12 智能运维
目前UAV在AIOps智能运维上的工程实践主要包括异常检测,根因分析,告警收敛和智能降噪,以及任务机器人HIT这4个方面。本次分享将重点介绍指标异常检测和根因分析两部分。
3.12.1 智能运维:异常检测框架
上图是UAV工程实践中使用的较流行的时间序列异常检测框架。主要包括离线模型优化、在线模型预测、A/B TEST部分。其中,离线模型优化和在线模型预测形成了指标异常检测的智能监控闭环。具体流程如图所示,其中要点包括: 对无标记数据的分析,采用无监督的方法进行异常识别。比如,在进行连续数据的异常检测时,可选用孤立森林算法,通过多棵iTree树形成森林来判断是否异常。 对已标记的数据的分析,采用了监督学习的方法,学习异常和正常群体的历史表现。这样,进行新数据检测时,可以通过模型直接决策,输出异常情况。 但是采用人工标注样本,工作量比较大,一般难以满足监督学习方法对数据量级的要求,所以可采用半监督的方法扩充标注的样本库。
3.12.2 智能运维:全维度的数据可关联
按照全维监控->全维关联->全维智能的技术路线,UAV采集到了多维度的监控数据后,需要建立起这些数据之前的关联。
这种关联关系: 可以是通过画像建立的强关联关系,比如宿主机与虚拟机、虚拟机与应用服务器、应用服务器和应用、应用和服务组件之间的关系; 也可以是通过调用链路或服务流图谱建立的强关联关系; 也可以是通过机器学习算法建立的关联关系,比如同一时间窗口同时变化的指标,可能存在某种关联。
需要说明的是,金融行业本身的业务特点决定了对第三方存在依赖性,因此告警的随机性较大,客观上导致学习样本的质量不高。因此,UAV目前使用强关联关系。
3.12.3 智能运维:根因分析,告警收敛与智能降噪
有了关联关系,就可以做根因分析了。我们可以收集各个渠道的告警,先通过告警过滤将其中重复的告警和不重要的告警过滤掉,再根据关联分析建立同一时间窗口内不同类型告警之间的关联,可以按画像建立关联,也可以按调用链路建立关联。然后是权重计算,根据预先设置的各类告警的权重,计算成为根源告警的可能性。最后将权重最大的告警标记为根源告警。此外,还可以根据历史告警处理知识库,找到类似根源告警的推荐解决方案。
在根因分析和定位的过程中,顺带实现了告警收敛和智能降噪。比如我们对重复告警、非根源的一般告警、同一条链路的其它告警进行了压制。
四、总结
上图为线上实际的宜信核心业务线调用关系的图谱。UAV作为宜信的公司级智能监控标准软件,已持续覆盖到宜信所有关键业务系统,支持公司超过300个业务线。越来越多的同事可以熟练地使用UAV,将UAV应用于日常运维、事前预警、事中问题诊断和事后复盘分析等各个方面。
使用UAV,可以获得随时随地的运维体验。目前UAVStack监控部分已在GitHub上开源,可以登录查看更多详细介绍。 官方网站: https://uavorg.github.io/main/ 开源地址: https://github.com/uavorg
系统运维
2019-11-20 10:30:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
以 # 开头的行就是注释,会被解释器忽略。

通过每一行加一个 # 号设置多行注释,像这样: #-------------------------------------------- # 这是一个注释 # author:菜鸟教程 # site:www.runoob.com # slogan:学的不仅是技术,更是梦想! #-------------------------------------------- ##### 用户配置区 开始 ##### # # # 这里可以添加 脚本 描述信息 # # ##### 用户配置区 结束 #####
如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?
每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
多行注释
多行注释还可以使用以下格式: :<EOF 也可以使用其他符号: :<<' 注释内容... 注释内容... 注释内容... ' :<本文原创地址: https://www.linuxprobe.com/introduction-to-shell.html
系统运维
2019-11-20 09:43:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
本文档列出了面试云计算工程师岗位经常被问到的40个问题
1)使用云计算有哪些优点?
使用云计算有下列优点:
a)备份数据和存储数据
b)强大的服务器功能
c)SaaS(软件即服务)
d)信息技术沙盒功能
e)提高生产力
f)具有成本效益,并节省时间
2)可否列举哪些平台用于大规模云计算?
用于大规模云计算的平台包括:
a) Apache Hadoop
b) MapReduce
3)可否解释用于云计算部署的不同模式?
不同的云计算部署模式包括:
a)私有云
b)公共云
c)社区云
d)混合云
4)云计算与移动计算有何区别?
移动计算使用与云计算同样的概念。借助互联网而不是借助单个设备,云计算因数据而变得活跃。它为用户提供了需要按需获取的数据。在移动计算中,应用程序在远程服务器上运行,为用户提供了访问所存储数据的权限。
5)用户如何得益于公用计算(utility computing)?
公用计算让用户可以只需要为使用的资源付费。它是由决定从云端部署哪种类型的服务的企业组织管理的一种插件。
大多数企业组织青睐混合策略。
6)由于数据在云端传输,你如何确保数据安全?
数据从一个地方传输到另一地方的过程中想确保数据安全,就要确保针对你发送的数据所使用的加密密钥没有泄露。
7)云在安全方面的措施有哪些?
a)身份管理:授权应用程序服务。
b)访问控制:将权限授予用户,那样用户可以控制进入到云环境的另一个用户的访问。
c)验证和授权:只允许通过授权和验证的用户访问数据和应用程序。
8)可否列出定义云架构的不同层?
8)云架构使用的不同层包括:
a)CLC即云控制器
b)Walrus
c)集群控制器
d)SC即存储控制器
e)NC即节点控制器
9)云计算系统集成商的角色是什么?
在云计算中,系统集成商负责为用来设计云平台的复杂过程制定策略。集成商需要构建更准确的混合云和私有云网络,因为集成商拥有数据中心构建方面的全部知识。
10)“EUCALYPTUS”的全称是什么?
“EUCALYPTUS”的全称是将你的程序连接到实用系统的弹性公用计算架构。
11)可否解释“EUCALYPTUS”在云计算中有何用处?
Eucalyptus是云计算中的一种开源软件基础设施,它用来将集群实施到云计算平台上。它用来构建公共云、混合云和私有云。它能够将你自己的数据中心打造成私有云,并让你可以将其功能应用于其他许多企业组织。
12)虚拟化平台在实施云时有何要求?
虚拟化平台在实施云时的要求包括:
a)管理服务级别策略
b)云操作系统
c)虚拟化平台有助于让后端级别概念和用户级别概念彼此不同。
13)在使用云计算平台前,用户需要考虑哪些必要的方面?
a)合规
b)数据丢失
c)数据存储
d)业务连续性
e)正常运行时间
f)云计算的数据完整性
14)可否列举几个开源云计算平台数据库?
开源云计算平台数据库有:
a) MongoDB
b) CouchDB
c) LucidDB
15) 落实了哪些安全法规来保护云端数据的安全?
为保护云端数据安全而落实的安全法规包括:
a)处理:控制在应用程序中正确、完整处理的数据。
b)文件:它管理和控制任何文件中处理的数据。
c)输出调和:它控制输入和输出之间需要调和的数据。
d)输入验证:控制输入数据。
e)安全和备份:它提供安全和备份,还控制安全泄密日志。
16)可否列举几个大型云提供商的数据库名称?
a)Google bigtable
b)Amazon simpleDB
c)基于云的SQL
17)可否解释云与传统数据中心之间的区别?
a)由于供暖和硬件/软件问题,传统数据中心的成本比较高。
b)需求增加时,云可以扩增资源。大部分开支花在了数据中心的维护上,而云计算不是这样。
18)可否解释软件即服务(SaaS)的不同模式?
a)简单的多租户模式:在该模式中,每个用户有独立的资源,与其他用户分开来,这是一种高效的模式。
b)细粒度的多租户模式:在这种模式中,资源由许多租户共享,但是功能仍然一样。
19)API在云服务中有何用途?
API(应用编程接口)在云平台中非常有用
a)不需要编写功能完备的程序。
b)提供了在一个或多个应用程序之间进行联系的指令。
c)易于构建应用程序,并将云服务与其他系统联系起来。
20)为云计算部署了哪些不同的数据中心?
云计算包括不同的数据中心,比如
a)容器化数据中心
b)低密度数据中心
21)云计算中有哪些不同的层?
云计算的不同层包括:
a)SaaS:软件即服务,它让用户可以直接访问云应用程序,不必在系统上安装任何东西。
b)IaaS:基础设施即服务,它从硬件(比如内存和处理器速度等)等层面提供了基础设施。
c)PaaS:平台即服务,它为开发人员提供了云应用程序平台。
22)平台即服务有多重要?
平台即服务(PAAS)是云计算中一个很重要的层。它为提供商提供了应用程序平台。它负责提供基础设施层的全面虚拟化,让它运行起来如同单一的服务器。
23)云服务是什么?
云服务用来通过互联网,使用网络中的服务器来构建云应用程序。它提供了这种便利:不必将云应用程序安装到计算机上,即可直接使用。它还减少了维护和支持使用云服务开发的应用程序的工作。
24)可否列出云计算领域的三种基本云?
A)专业云
B)私人云
C)高性能云
25)就基础设施即服务而言,它提供了什么资源?
IAAS(基础设施即服务)提供了用来构建云的虚拟资源和物理资源。它负责处理部署和维护这一层提供的服务带来的复杂性。在这里,基础设施是服务器、存储系统及其他硬件系统。
26)云架构有什么样的业务好处?
云架构具有的好处包括:
a)无需基础设施投入
b)适时的基础设施
c)更高效地利用资源
27)云架构有别于传统架构的特点有哪些?
让云架构有别于传统架构的特点包括:
a)按照需求,云架构满足硬件要求。
b)云架构能够按需增减资源。
c)云架构能够管理和处理动态工作负载,顺畅无阻。
28)可否列举云计算中弹性与可扩展性的区别?
可扩展性是云计算的一个特点;借助可扩展性,只要相应增加资源容量,就可以处理增加的工作负载。作为云计算的另一个特点,弹性强调了启用和停用庞大的资源容量这一概念。
29)可否列举由Window Azure操作系统提供的服务?
Window Azure提供了三种核心服务,包括:
a)计算服务
b)存储服务
c)管理服务
30)在云架构中,必需的不同部分有哪些?
a)云入站
b)处理器速度
c)云存储服务
d)云提供商服务
e)云间通信
31)在云架构中,经历的不同阶段有哪些?
a)启动阶段
b)监测阶段
c)关闭阶段
d)清理阶段
32)可否列出云计算的基本特点?
a)弹性和可扩展性
b)自助式配置和自动取消配置
c)标准化界面
d)自助计费的使用模式
33)在云架构中,基本的构建模块有哪些?
a)参考架构
b)技术架构
c)部署操作架构
34)可否描述云架构以哪些方式来提供自动化和性能透明度?
为了提供性能透明度和自动化,云架构使用许多工具。它可以管理云架构和监测报告。它还可以共享使用云架构的应用程序。自动化是云架构的关键部分,有助于改善质量级别。
35)可否解释一下高性能云在云计算中的角色?
高性能云在立即传输最大数量的数据方面很有用。从事高性能计算研究的专业人员经常使用高性能云。
36)可否解释混合云和社区云?
混合云:混合云包括多家服务提供商。它结合了公共云和私有云的功能。公司同时需要私有云和公共云时,就会使用混合云。
社区云:这种模式的成本相当高;多家企业组织有着共同的目标和需求,又准备共享云服务的优点时,就会使用社区云。
37)在云中,优化策略有哪些?
为了克服维护成本,并且优化资源,用到云端三个数据中心这个概念:提供恢复和备份机制,万一出现灾难或系统故障,可确保所有数据安全无恙。
38)亚马逊SQS是什么东东?
为了在不同的连接件之间联系,就要使用亚马逊SQS消息;它在亚马逊的不同组件中充当“联络者”。
39)缓冲器如何用于亚马逊网络服务?
为了让系统更高效地应对流量或负载突增的情况,提供商使用缓冲器。缓冲器可同步不同的组件。组件始终以一种不平衡的方式接收和处理请求。不同组件之间的平衡由缓冲器来负责管理,好让它们以同样的速度来工作,从而提供更快的服务。
40)可否描述云计算中的虚拟机管理程序及其类型?
虚拟机管理程序是虚拟机监测工具,为虚拟机管理资源。虚拟机管理程序主要有两种类型。
类型1:访客虚拟机直接在主机硬件上运行,比如Xen和VMWare ESXI。
类型2:访客虚拟机通过主机操作系统在硬件上运行,比如KVM和Oracle VirtualBox. 本文地址: https://www.linuxprobe.com/cloud-computing-engineer.html
系统运维
2019-11-20 09:42:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
近段时间发现很多APP程序用的是thinkcmf,此程序源码存在getshell漏洞,我们Sine安全紧急对此高危漏洞进行了分析和漏洞修复,攻击者可以通过构造特定的请求包get请求即可在远程服务器上执行任意脚本代码。
根据index.php中的配置,项目路径为application,打开 Portal 下的 Controller 目录,选择一个控制类文件。
发现他的父类为Common\Controller\HomebaseController。
在HomeBaseController中加入如下测试代码
ThinkPHP是一套基于MVC的应用程序框架,被分成三个核心部件:模型(M)、视图(V)、控制器(C)。
由于添加的代码在控制器中,根据ThinkPHP框架约定可以通过a参数来指定对应的函数名,但是该函数的修饰符必须为Public, 而添加的代码正好符合该条件。
可以通过如下URL进行访问,并且可以添加GET参数arg1传递给函数。
cmfx-master/?a=test_public&arg1=run%20success
HomeBaseController类中有一些访问权限为public的函数,重点关注display函数.看描述就是可以自定义加载模版,通过$this->parseTemplate 函数根据约定确定模版路径,如果不符合原先的约定将会从当前目录开始匹配。
然后调用THinkphp Controller 函数的display方法
/**
* 加载模板和页面输出 可以返回输出内容
* @access public
* @param string $templateFile 模板文件名
* @param string $charset 模板输出字符集
* @param string $contentType 输出类型
* @param string $content 模板输出内容
* @return mixed
*/
public function display ($templateFile = '', $charset = '', $contentType = '', $content = '', $prefix = '') {
parent ::display($this->parseTemplate($templateFile), $charset, $contentType,$content,$prefix);
}
再往下就是调用Think View的fetch方法,这里的TMPL_ENGINE_TYPE 为Think, 最终模版内容解析在ParseTemplateBehavior中完成
如下调用即可加载任意文件
http://127.0.0.1:81/cmfx-master/?a=display&templateFile=README.md
五、执行漏洞
网站漏洞修复建议
通过此次审计代码发现问题的重点是对display 和 fetch 函数的修饰符模板函数进行修改,如果对程序代码不熟悉的话建议联系专业的网站安全公司来修复漏洞,国内做的比较专业的如Sinesafe,绿盟,启明星辰,等等,对此很多app调用此程序的api接口源码,建议大家遇到此问题首先要进行全面的网站漏洞检测和渗透测试,来达到事先预防此类攻击带来的危害。
系统运维
2019-11-20 09:06:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
来源: https://blog.csdn.net/Powerful_Fy
shell脚本逻辑判断语法
格式1:if 条件 ; then 语句; fi #!/bin/bash read -p "input a number:" n if [ $n -gt 5 ] then echo "1" fi
格式2:if 条件; then 语句; else 语句; fi #!/bin/bash read -p "input a number:" n if [ $n -gt 5 ] then echo "1" else echo "2" fi
格式3:if …; then … ;elif …; then …; else …; fi #!/bin/bash read -p "input a number:" n if [ $n -gt 90 ] then echo "A" elif [ $n -gt 70 ] then echo "B" else echo "C" fi
格式4:if 中嵌套 if #!/bin/bash read -p "input a number:" n if [ $n -gt 70 ] then echo "OK" if [ $n -gt 90 ] then echo "A" elif [ $n -gt 80 ] then echo "B" else echo "C" fi else echo "???" fi
补充: -gt 大于(>) -lt 小于 (<) -ge 大于等于 (>=) -le 小于等于 (<=) -eq 等于 (==) -ne 不等于 (!=)
可以使用 && || 结合多个条件
大于5并且小于10: if [ $a -gt 5 ] && [ $a -lt 10 ]; then
第二种写法: if [ $a -gt 5 -a $a -lt 10 ]; then
#-a表示:and
大于5或小于3: if [ $b -gt 5 ] || [ $b -lt 3 ]; then
第二种写法: if [ $b -gt 5 -o $b -lt 3 ]; then
#-o表示or
if判断文件或目录的属性
[ -f file ] 判断是否是普通文件,且存在 [ -d file ] 判断是否是目录,且存在 [ -e file ] 判断文件或目录是否存在 [ -r file ] 判断文件是否可读 [ -w file ] 判断文件是否可写 [ -x file ] 判断文件是否可执行
补充: 1.如果判断对象为socket等特殊文件,可以使用-e判断是否存在
2.root用户对文件的读写比较特殊,即使一个文件没有给root用户读或者写的权限,root用户照样可以读或者写(x:执行权限除外)
3.取反使用感叹号: if [ ! -f filename ]
if判断的一些特殊用法
判断变量为空时: if [ -z "$a" ]; then ...
判断变量不为空时: if [ -n "$a" ]; then ...
判断命令成功时: if ls /tmp/test.sh; then ...
#判断文件是否存在的用法,当ls命令执行成功时,要怎样...
将产生的信息重定向到/dev/null: if ls /tmp/test.sh &> /dev/null; then ...
#不管ls命令执行是否成功,都将输出的信息流写入到/dev/null,不打印
判断文件是否包含关键字: if grep -q '123' /tmp/test.sh; then ...
#当文件包含关键字时,要怎样...,-q:包含关键字时,不输出匹配到的信息
if [ $a -gt 5 ]的另一种写法: if (($a>5)); then ...
#[ ] 中不能使用<,>,==,!=,>=,<=这样的符号,但双括号中可以
shell脚本中case判断用法 case 变量名 in value1) command ;; value2) command ;; *) commond ;; esac 在case中,可以在条件中使用|,表示或的意思: 2|3) command ;;
示例: #!/bin/bash read -p "input a number: " n #判断输入内容是否为空 if [ -z "$n" ] then echo "Please input a number." exit 1 fi #判断输入内容是否含有非数字 n1=`echo $n|sed 's/[0-9]//g'` if [ -n "$n1" ] then echo "Please input a number." exit 1 fi #当输入内容非空且为纯数字时,开始判断 if [ $n -lt 60 ] && [ $n -ge 0 ] then t=1 elif [ $n -ge 60 ] && [ $n -lt 80 ] then t=2 elif [ $n -ge 80 ] && [ $n -lt 90 ] then t=3 elif [ $n -ge 90 ] && [ $n -le 100 ] then t=4 else t=0 fi case $t in 1) echo "D" ;; 2) echo "C" ;; 3) echo "B" ;; 4) echo "A" ;; *) echo "The number range must be 0-100." ;; esac
系统运维
2019-11-19 23:38:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
vim ~/.bashrc 文件
alias sit='cd /usr/local/' 是我加的,在执行 source ~/.bashrc ,使变动的文件生效, 下一次我直接输入 sit 系统自动执行cd /usr/local/命令

2.第二种方法
在sbin 目录下vim tt 创建tt文件
编写自己的shell脚本
例如:
echo hello
:wq退出保存
赋予权限:chmod 777 -R tt
在任意的目录执行tt指令,都会输出hello


/bin、/sbin、/usr/bin、/usr/sbin、/usr/local/sbin放置可执行文件的区别

/bin:供所有用户(包括root用户和一般用户)使用的基本命令,主要有cat,chmod,date,cp,bash等等常用的命令。
/sbin:放置在/sbin下的文件一般是用来设置系统环境的,这些命令只有root用户才能够利用来“设置”系统,
其他一般用户只能够用来“查询”,该目录下的命令常为开机过程所需要的,里面包括开机、修复、还原系统所需要的命令。


/usr/bin:存放的文件是**保证系统拥有完整功能而提供的应用程序;(通常所有用户都能运行),与开机过程无关。**
/usr/sbin:非系统正常运行所需要的命令,往往与某些服务器软件程序命令相关。
/usr/local/sbin:与本机自行安装的软件产生的系统执行文件
系统运维
2019-11-19 19:37:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1.进入ZKEYS官网,单击首页右上角免费注册按钮
2.选择注册方式,有手机注册和有限注册两种
3.填写手机或邮箱,设置密码
4.注册完成,即可登录ZKEYS会员中心
单击右上角 免费注册 按钮
填写手机号码:
长度为11位的国内手机号码
滑动验证:
向右滑动填充图片完成验证
输入验证码:
点击获取验证码,输入收到的手机验证码
设置密码:
密码格式为英语+数字,长度为8-30个字符
阅读服务协议,勾选同意我已阅读并同意
点击立即注册按钮,即注册成功
注册成功
到此,即可登录ZKEYS会员中心
系统运维
2019-11-19 16:10:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
早起的鸟儿有虫吃。
2019年java面试经典100问,进入BAT不是梦。
2019年马上就要结束了,领完年终奖是不是该跳槽了呢,提前准备起来吧,小伙伴。
本文由公众号「情系IT」整理,设计到的内容由java基础、数据库、SSM框架、redis、消息队列、spring boot、spring cloud、git及一些前端知识。
由于篇幅过长,故在此只发布问题,如果想要获取完整的问题及答案,请关注 微 信 公众号「情系IT」,回复 面试 即可获得pdf版经典面试100问。公众号二维码如下:
[TOC]
一、java基础
1、面向对象的特征有哪些方面? 【基础】
2、int 和Integer 有什么区别? 【基础】
3、Math.round(11.5) 等于多少? Math.round(-11.5)等于多少? 【基础】
4、编程题: 用最有效率的方法算出2 乘以8 等於几? 【基础】
5、数组有没有 length()方法?String 有没有 length()方法?【基础】
6、构造器(constructor)是否可被重写(override)?【基础】
7、是否可以继承String 类? 【基础】
8、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 【基础】
9、String 和StringBuffer 的区别?【基础】
10、String, StringBuffer StringBuilder 的区别。【基础】
11、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?【基础】
12、描述一下 JVM 加载 class 文件的原理机制?【中等】
13、interface可以有方法的实现吗?【中等】
14、是否可以从一个static 方法内部发出对非static 方法的调用?【基础】
15、GC 是什么? 为什么要有GC? 【基础】
16、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?【基础】
17、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?【基础】
18、Java 中的 final 关键字有哪些用法?【基础】
19、编码转换:怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串?【基础】
20、error 和exception 有什么区别? 【基础】
21、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?【基础】
22、List,Set,Map 是否继承自Collection 接口?【基础】
23、说出ArrayList,Vector, LinkedList 的存储性能和特性?【基础】
24、HashMap 和Hashtable 的区别? 【基础】
25、Arraylist 与Vector 区别?【基础】
26、List、Map、Set 三个接口,存取元素时,各有什么特点?【基础】
27、sleep() 和wait() 有什么区别? 【基础】
28、当一个线程进入一个对象的一个synchronized 方法后,其它线程是否可进入此对象的其它方法? 【基础】
29、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 【基础】
30、当一个线程进入一个对象的 synchronized 方法 A 之后,其它线程是否可进入此对象的 synchronized 方法 B?【中等】
31、简述synchronized 和java.util.concurrent.locks.Lock 的异同?【中等】
32、编写多线程程序有几种实现方式?【中等】
33、Java 中如何实现序列化,有什么意义?【中等】
二、数据库
34、阐述 JDBC 操作数据库的步骤。【基础】
35、使用 JDBC 操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?【中等】
36、在进行数据库编程时,连接池有什么作用?【基础】
37、事务的ACID是指什么?【基础】
38、谈谈脏读、幻读和不可重复读?【中等】
39、JDBC中如何进行事务处理?【中等】
40、获得一个类的类对象有哪些方式?【基础】
41、JSP 有哪些内置对象?作用分别是什么?【基础】
42、get 和 post 请求的区别?【基础】
43、讲解 JSP 中的四种作用域。【基础】
三、SSM框架
44、MyBatis 中使用#和$书写占位符有什么区别?【中等】
45、解释一下 MyBatis 中命名空间(namespace)的作用。【中等】
46、什么是 IoC 和 DI?DI 是如何实现的?【中等】
47、解释一下什么叫 AOP(面向切面编程)?【基础】
48、你是如何理解"横切关注"这个概念的?【中等】
49、你如何理解 AOP 中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?【基础】
50、Spring 支持的事务管理类型有哪些?你在项目中使用哪种方式?【中等】
51、Spring MVC的工作原理是怎样的?【基础】
52、什么是 XSS 攻击?【困难】
53、SQL 注入攻击?【困难】
54、什么是CSRF攻击?【困难】
四、redis
55、使用redis有哪些好处?【基础】
56、Redis有哪些数据结构?【基础】
57、如果有大量的key需要设置同一时间过期,一般需要注意什么?【中等】
58、为什么Redis需要把所有数据放到内存中?【中等】
59、Redis提供了哪几种持久化方式?【中等】
60、如何选择合适的持久化方式?【中等】
61、redis支持的java客户端你用过哪个?【基础】
62、Redis集群的主从复制模型是怎样的?【困难】
63、Redis集群之间是如何复制的?【中等】
64、怎么测试Redis的连通性?【基础】
五、消息队列
65、为什么要用消息队列?【中等】
66、使用消息队列有什么缺点【中等】
67、为什么选用RocketMQ;RocketMQ和ActiveMQ的区别【困难】
68、RocketMQ是怎么保证系统高可用的?【困难】
69、消息中间件集群崩溃,如何保证百万生产数据不丢失?【中等】
六、spring boot
70、Spring Boot 的核心配置文件有哪几个?它们的区别是什么?【中等】
71、Spring Boot 的配置文件有哪几种格式?它们有什么区别?【中等】
72、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?【基础】
73、开启 Spring Boot 特性有哪几种方式?【基础】
74、Spring Boot 需要独立的容器运行吗?【基础】
75、如何在 Spring Boot 启动的时候运行一些特定的代码?【中等】
76、Spring Boot 有哪几种读取配置的方式?【中等】
77、Spring Boot 如何定义多套不同环境配置?【中等】
78、SpringBoot中的定时任务如何实现?【中等】
79、我们如何连接一个像 MYSQL 或者 orcale 一样的外部数据库?【中等】
七、spring cloud
80、什么是微服务【中等】
81、微服务之间是如何独立通讯的spring Cloud和 Dubbo有哪些区別?【困难】
82、springcloud如何实现服务的注册和发现【中等】
83、Ribbon和Feign的区别【中等】
84、springcloud断路器的作用【中等】
85、springcloud如何实现服务的注册和发现【中等】
86、springcloud中的组件有那些?【中等】
八、其他
87、cookie和session的区别【基础】
88、一次完整的http请求过程【中等】
89、讲一下长连接【困难】
90、TCP如何保证可靠传输?【困难】
91、URI和URL的区别【中等】
92、http和https的区别?【中等】
93、docker常用命令【中等】
94、什么是Docker镜像?【中等】
95、什么是Docker容器?【中等】
96、什么是Docker Hub?【中等】
97、什么是 Git 复刻(fork)?复刻(fork)、分支(branch)和克隆(clone)之间有什么区别?【中等】
98、“git pull”和“git fetch”之间有什么区别?【中等】
99、使用Ajax的优缺点分别是什么?【中等】
100、跨域问题,谁限制的跨域,怎么解决【困难】 如果文章对您有帮助,请记得点赞关注哟~
欢迎大家关注我的公众号:情系IT,每日推送技术文章供大家学习参考。
系统运维
2019-11-19 13:51:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、查看可用的 redis 版本 docker search redis
2、取最新版的 redis 镜像
这里我们拉取官方的最新版本的镜像: $ docker pull redis:latest
3、查看本地镜像
使用以下命令来查看是否已安装了 redis: $ docker images
4、运行容器
安装完成后,我们可以使用以下命令来运行 redis 容器: $ docker run -itd --name redis-test -p 6379:6379 redis
5、安装成功
最后我们可以通过 docker ps 命令查看容器的运行信息:
接着我们通过 redis-cli 连接测试使用 redis 服务。 $ docker exec -it redis-test /bin/bash
6、启动redis
最后我们可以通过 docker ps 命令查看容器的运行信息,
同时使用docker ps查看容器id,并启动: docker start b8ced766903c
系统运维
2019-11-19 10:11:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
9月18日,腾讯宣布开源自主研发的轻量级物联网实时操作系统 Ten centOS tiny。TencentOS tiny是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,安全可靠等特点,可有效提升物联网终端产品开发效率。TencentOS tiny 提供精简的 RTOS 内核,内核组件可裁剪可配置,可快速移植到多种主流 MCU (如STM32全系列)及模组芯片上。而且,基于RTOS内核提供了丰富的物联网组件,内部集成主流物联网协议栈(如 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT 等),可助力物联网终端设备及业务快速接入腾讯云物联网平台。
TencentOS tiny 主体架构图,从下到上主要包括:
CPU 库 :TencentOS tiny 支持的 CPU IP 核架构,当前主要支持 ARM Cortex M0/3/4/7。
驱动管理层 :包括板级支持包(BSP,主要由 MCU 芯片厂家开发与维护)、硬件抽象(HAL,主要由 TencentOS tiny提供,方便不同芯片的适配与移植)、设备驱动(Drivers,例如 Wi-Fi、GPRS、LoRa 等模块的驱动程序)。
内核 :TencentOS tiny 实时内核包括任务管理、实时调度、时间管理、中断管理、内存管理、异常处理、软件定时器、链表、消息队列、信号量、互斥锁、事件标志等模块。
IoT 协议栈:TencentOS tiny 提供 lwip、AT Adapter、SAL 层,支持不同的网络硬件,例如以太网、串口 Wi-Fi、GPRS、NB-IoT、4G等通信模块。TCP/IP 网络协议栈上提供常用的物联网协议栈,例如 CoAP、MQTT,支撑终端业务快速接入腾讯云。
安全框架:TencentOS tiny 为了确保物联网终端数据传输安全以及设备认证安全,提供了完整的安全解决方案。安全框架提供的 DTLS 和 TLS 安全协议,加固了 COAP 及 MQTT 的传输层,可确保物联网终端在对接腾讯云时实现安全认证和数据加密;另外针对低资源的终端硬件,安全框架还提供与腾讯云 IoTHub 配套的密钥认证方案,确保资源受限设备也能在一定程度上实现设备安全认证。
组件框架:TencentOS tiny 提供文件系统、KV 存储、自组网、JS 引擎、低功耗框架、设备框架、OTA、调试工具链等一系列组件,供用户根据业务场景选用。
开放 API(规划开发中):TencentOS tiny 将在协议中间件和框架层上提供开放 API 函数,方便用户调用中间件功能,使用户无需过多关心中间件具体实现,快速对接腾讯云,实现终端业务上云的需求,期望最大程度减少终端物联网产品开发周期,节省开发成本。
TencentOS tiny优势
1、小体积
最小内核:RAM 0.6KB,ROM 1.8KB 典型LoraWAN及传感器应用:RAM 3.3KB,ROM 12KB
2、低功耗
休眠最低功耗低至2 uA 支持外设功耗管理框架
3、丰富的IoT组件
集成主流IoT协议栈 多种通信模组SAL层适配框架; 支持OTA升级 提供简单易用端云API,加速用户业务接入腾讯云
4、可靠的安全框架
多样化的安全分级方案 均衡安全需求&成本控制
5、良好的可移植性
内核及IoT组件高度解耦,提供标准适配层 提供自动化移植工具,提升开发效率
6、便捷的调试手段
提供云化的最后一屏调试功能 故障现场信息自动上传云平台,方便开发人员调试分析 本文地址: https://www.linuxprobe.com/open-tencentos-tiny.html
系统运维
2019-11-19 09:26:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
我们常常听到很多人说要学学 Linux 或者被人告知说应该学学Linux,那么学Linux到底要学什么?
为什么要学Linux?
在回答学什么之前,我们先看看为什么要学。首先我们需要认识到的是,很多服务器使用的是 Linux系统 ,而作为服务器应用程序的开发者或者维护者,如果不了解Linux的基本使用,该如何进行开发或者维护呢?
当然,也有可能你听说Linux更高大上,或者是说Linux对开发者更加友好(Windows用户把刀放下),这都是题外话了。
在我看来,学习Linux主要有以下两点原因
使用标准C/C++ 编写运行在Linux上的应用程序
编写部署在Linux上的应用程序,如Python,Java web服务程序
一探究竟。众所周知,Linux开源,windows并非如此。
而对于Python,它有Python解释器,Java有Java虚拟机,他们实际上对Linux的需求是没有C/C++来的高。即便如此,Linux也是值得Python/Java开发者去学习的。如果你是做C/C++开发,那么Linux是必备的,还记得当前被VC6支配的恐惧吗?
Linux学习方向
那么一般说的学Linux是要学什么呢?方向不同,要学习的内容也不同,可以大致分为这么几个方向:
运维,维护Linux服务器
应用开发,开发Linux应用程序
底层开发
我本人是做Linux应用开发的,因此对于运维方向和底层方向不是很了解,这里仅简单说一下。
运维Linux主要需要学会对服务器的基本部署,监控,配置,管理等等, 你可以认为,这些机器归你管了,7*24小时保障它能正常提供服务(删库跑路就别做了),所以7月24日请对运维的朋友好点。也欢迎运维的朋友留言纠正或者补充我的说法。
底层开发需要了解uboot,文件系统,内核等底层相关内容,主要工作可能涉及文件系统裁剪,驱动开发,内核模块定制(如内存管理,进程调度)等等。底层开发总体来说要求比较高。
应用开发自然是需要学习如何开发在Linux上运行的应用程序,如何定位Linux应用程序问题等等。
Linux应用开发学什么
Linux的学习很多会以 命令 为主,因而初学会觉得枯燥甚至疑惑,鼠标点点点就能完成的事,为什么要劈里啪啦敲这么多?这里给出两点理由,也欢迎你补充:
出于资源的考虑,绝大部分Linux服务器没有图形界面
命令 行便于自动化,将一系列操作写入 脚本 ,可代替手动操作
而它的学习我把它分为这么几个阶段:
基本使用
开发调试
系统认识
这三个阶段对知识积累的要求不一样,但总体来说并没有严格的先后之分。
类于windows,当年你学习windows的时候学了什么?
开关机?
安装卸载软件?如安装视频播放器,音乐播放器(为啥要安这玩意?)。
如何打开安装的软件?如打开浏览器上网,打开编辑器写文档
如何存放自己的资料?移动,创建,删除等等
如何使用office 办公软件
……
是不是想想好像也没有特意地去学习?
那么对于学习Linux来说也是类似的,就是学会这些最普通的使用,
如何开关机
如何上网
如何打开命令行
如何使用命令行安装卸载软件
如何编辑文本
如何创建,移动,删除文件
如何查看文件内容,解压缩文件
……
这个阶段最难的就是从图形界面到命令行的转换。
那么第二阶段呢,就需要学会:
如何编写Linux应用程序
如何编译或者构建你的程序
如何运行你的程序
如何定位程序bug
而第三阶段,则是一个需要漫长的学习过程,但都是为开发服务,包括:
理解并践行一切皆文件
ELF文件,Linux主要可执行文件格式
Linux各大机制的基本原理,如进程调度,内存管理,虚拟内存,文件系统等,既然要写Linux应用程序,怎么能不了解它所在平台的主要机制呢?
越是疑难问题,越需要这些最基本的知识。
怎么学?
来到了大家最关心的问题了,同样的,每个人的情况不太一样,这里只给出我的个人建议。
关于第一阶段,你可以先定个小目标,例如一段时间内学会在Linux下进行你的日常活动(玩游戏就算了),例如编写文档,看视频等等。同时建议:
选择主流的发行版,如ubuntu, centos 等,遇到问题时比较容易解决
在window下安装虚拟机,这样Linux环境就随你折腾了
在这期间,你可能需要了解
使用apt-get或者yum安装或卸载软件
使用tar,unzip,zip,gz等解压缩命令安装包
了解运行环境,学会如何执行命令
这里的学习你可以通过网上搜索资料(包括文档和视频教程)或者购买相关书籍进行操练。如果你不想安装虚拟机或者docker,你可以通过一些在线的Linux来体验。
第二阶段也是主要的阶段,这一阶段要学习的东西非常多,多是命令的学习,这里同样可以参考《 鸟哥 的Linux私房菜-基础篇》。不过初期阶段建议抱着一个目的去学习,就是如何在Linux写一个完整的程序,为了达到这个目的你需要学习
cd touch cp mv rm ls,find,切换目录,创建,复制,移动,删除,查看,查找等等
vi/vim 编写代码,这里有一个在线练习网站 https://www.openvim.com/
gcc编译代码,后期可能需要学习makefile,cmake等构建工具
版本管理,git也是当前必备的一个工具了,学习资料推荐pro git或者官方git教程
gdb调试,可以参考《GDB调试指南》
问题定位,除了观察最基本的打印之外,还需要知道,如何查看进程信息(ps),如何查看网络连接信息(ss,netstat),如何强制停止进程(kill -9)如何查看进程文件打开情况(lsof),如何多种姿势查看文本文件(cat,tail,more,less)等等。
脚本 学习,学习Linux,就不得不学习shell脚本了,它在很多时候能毫无抱怨地帮你做事,前提是你会调教。《Linux命令行与shell脚本编程大全》也是调教教程之一。这里也有一些《必备的shell知识》
这个过程涉及到的命令非常多,但是不建议每一个都去细学,首先知道有这么一个命令即可,然后需要的时候能够快速找到用法,如通过man命令查看手册。总之,记住你的目标就是流畅地进行开发调试,而在达成这个目标地过程中,你自己自然会慢慢接触很多东西。
但是有必要说明的是,开发Linux应用程序并不一定要在Linux下编写代码,你可以选择利用samba等工具在windows和linux之间共享文件,然后再在windows下熟悉的工具中或者你认为比较强大合适的工具中编写代码,在Linux下进行编译调试即可。当然你也可以选择Linux下的IDE,或者将vim调教一下也是可以的。
第三阶段要求是比较高的,这个时候你应该学习过操作系统的相关课程(如,《现代操作系统》,《操作系统原理》等),然后你可以通过诸如《Linux内核设计与实现》,《深入Linux内核架构》,《深入理解Linux内核》等书籍进行相关概念学习,也可以通过阅读源码进行深入学习,最终,你需要了解堆和栈,内存管理,进程调度,虚拟内存,文件系统等相关知识。
当然相关命令学习也必不可少,例如readelf,nm,ipcs,iostat,objdump,free,chrt,pmap,uptime,top,pidstat等。
以上就是三个阶段Linux相关的学习内容和建议,实际上其他相关内容的同步学习也非常重要,包括相关数据结构与算法,系统编程,计算机网络等内容的学习,否则看到很多命令的结果仍然会一脸懵逼。
最后,建议实践再实践。
总结
限于本人知识水平有限,以上属个人建议和看法,仅供参考,欢迎留言说说你为什么要学Linux,有什么学习方法? 本文地址: https://www.linuxprobe.com/linux-how-learn.html
系统运维
2019-11-19 09:25:00