Joyber 发布的文章

版本:
zabbix-agent: 5.0.7
mysql: 10.4.12-MariaDB
报错信息
Warning: World-writable config file '/var/lib/zabbix/.my.cnf' is ignored

原因是 .my.cnf 权限过多,人人可改,mysql为了安全不会加载这样的配置文件,所以被忽略

将文件改为644权限即可

chmod 644 /var/lib/zabbix/.my.cnf

测试,能正常进入即可:

mysql --defaults-file=/var/lib/zabbix/.my.cnf

/var/lib/zabbix/.my.cnf 文件内容:

[client]
user=xxxxxxx
password=xxxxxx
host=localhost

测试环境:
centos 7, mysql, nginx

根据官方下载安装文档一路下来:
https://www.zabbix.com/cn/download?zabbix=5.0&os_distribution=centos&os_version=7&db=mysql&ws=nginx
原文如下:

Install and configure Zabbix server for your platform
a. Install Zabbix repository
产品手册
# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
# yum clean all
b. Install Zabbix server and agent
# yum install zabbix-server-mysql zabbix-agent
c. Install Zabbix frontend
产品手册
Enable Red Hat Software Collections

# yum install centos-release-scl
编辑配置文件 /etc/yum.repos.d/zabbix.repo and enable zabbix-frontend repository.

[zabbix-frontend]
...
enabled=1
...
Install Zabbix frontend packages.

# yum install zabbix-web-mysql-scl zabbix-nginx-conf-scl
d. 创建初始数据库
产品手册
Make sure you have database server up and running.

在数据库主机上运行以下代码。

# mysql -uroot -p
password
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by 'password';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> quit;
导入初始架构和数据,系统将提示您输入新创建的密码。

# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
e. 为Zabbix server配置数据库
编辑配置文件 /etc/zabbix/zabbix_server.conf

DBPassword=password
f. 为Zabbix前端配置PHP
编辑配置文件 /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf, uncomment and set 'listen' and 'server_name' directives.

# listen 80;
# server_name example.com;
编辑配置文件 /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf, add nginx to listen.acl_users directive.

listen.acl_users = apache,nginx
Then uncomment and set the right timezone for you.

; php_value[date.timezone] = Europe/Riga
g. 启动Zabbix server和agent进程
启动Zabbix server和agent进程,并为它们设置开机自启:

# systemctl restart zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm
# systemctl enable zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm

我的不同:
机子已经先安装了bt的宝塔系统,安装有nginx + mysql + php 环境

按照zabbix步骤,我安装nginx和php的时候用了官方的方法安装了nging和php72,mysql用了宝塔安装的mysql

当我进入后台时,看到了 zabbix-server is not runing的提示,找到 /etc/zabbix/zabbix_server.conf 中的日志文件路径 /var/log/zabbix/zabbix_server.log ,再查看日志,发现报错是没有连接到mysql,原因是默认配置的DBSocket和我的环境不一致,宝塔的mysql 套接字路径是 /tmp/mysql.sock,修改配置,重启zabbix-server,发现跑起来了

解决切换成中文后,图表中的汉字显示成方框的问题

进入win10系统 C:\Windows\Fonts 目录,双击一个简体字包,进去后有三个字体,ctrl+c复制出来一个字体文件,上传到 /usr/share/zabbix/assets/fonts

原来的文件是一个软链接
graphfont.ttf -> /etc/alternatives/zabbix-web-font
备份一下
mv graphfont.ttf graphfont.ttf.bak
添加一个软链接 graphfont.ttf -> msyhl.ttc
ln -s msyhl.ttc graphfont.ttf

现在刷新图表页面,显示正常的汉字内容了

看一个真正的专家操作命令行绝对是一种很好的体验-光标在单词之间来回穿梭,命令行不同的滚动。
我也想成为那样的高手,所以记录了一下这些技巧

Ctrl+a跳到本行的行首,
Ctrl+e则跳到页尾。
Ctrl+u删除当前光标前面的文字,使用Ctrl+y进行恢复
ctrl+k-删除当前光标后面的文字,使用Ctrl+y进行恢复
Ctrl+w和Alt+d-对于当前的单词进行删除操作,w删除光标前面的单词的字符,d则删除后面的字符
Alt+Backsapce-删除当前光标后面的单词,如果删除错误,使用Ctrl+y进行恢复Ctrl+L进行清屏操作

ctrl+a:光标移到行首。
ctrl+b:光标左移一个字母
ctrl+c:杀死当前进程。
ctrl+d:退出当前 Shell。
ctrl+e:光标移到行尾。
ctrl+h:删除光标前一个字符,同 backspace 键相同。
ctrl+k:清除光标后至行尾的内容。
ctrl+l:清屏,相当于clear。
ctrl+r:搜索之前打过的命令。会有一个提示,根据你输入的关键字进行搜索bash的history
ctrl+u: 清除光标前至行首间的所有内容。
ctrl+w: 移除光标前的一个单词
ctrl+t: 交换光标位置前的两个字符
ctrl+y: 粘贴或者恢复上次的删除
ctrl+d: 删除光标所在字母;注意和backspace以及ctrl+h的区别,这2个是删除光标前的字符
ctrl+f: 光标右移
ctrl+z : 把当前进程转到后台运行,使用’ fg ‘命令恢复。比如top -d1 然后ctrl+z ,到后台,然后fg,重新恢复
esc组合
esc+d: 删除光标后的一个词
esc+f: 往右跳一个词
esc+b: 往左跳一个词
esc+t: 交换光标位置前的两个单词。

shell 脚本关键字&符号:https://www.cnblogs.com/xiaojiang1025/p/5863984.html

shell概念
"shell"既是一种解释型编程语言,也是一个这种编程语言的解释器的名字
shell是解释型语言,就是解释器会一条一条的翻译每一条语句并执行,对比之下,C语言是编译型语言,编译器把整个工程编译成可执行文件才能执行
在没有续行符(\回车)的情况下,shell脚本的一条语句以"回车"为结束
任何一个shell脚本程序都必须在开头用#!标识使用的shell程序,如果用的是bash,那就是#!/bin/sh
shell脚本一行中的#之后的部分为注释
刚刚写完的一个shell script程序通常是没有执行权限的,需要手动$chmod +x filename.sh来添加可执行权限
shell语言本身并不包含linux内置的命令,那些命令本质上都是一个可以在shell环境中执行的程序,只是在shell环境中执行shell脚本可以调用这些程序而已。
特殊符号
$
表示取结果。和变量名一起使用表示取变量的值,和()一起使用表示取命令群组的执行结果

$tunset=123
$echo "$tunset"
123
$echo $(ls Downloads)
lukas-h.github.io-theme.zip youdao-dict_1.1.0-0-deepin_amd64.deb
( )
表示在"nested sub-shell"中划分一个命令群组(command group),如果我们希望里面的命令对之前和之后的设定不影响的话,就要用(),反之,如果需要在当前shell(non-named command group)中执行相关命令,就要用{}表示命令群组。
在数学计算中就是数学中的()
定义数组
$cat shell.sh;./shell.sh

!/bin/bash

line="123 25 36532 454"
(

line="wwww"
echo "$line"

)
echo "$line"

wwww
123 25 36532 454
$arr=(0 1 2 var) #定义一个数组
$echo "${arr[0]}" #显示数组下标为0的元素
0
{ }
用作范围限定
标明在"non-named command shell"中执行的命令群组。shell函数就是使用{}的特性来定义的
配合:,-,+,=,#,/,%,?对变量进行操作
$echo $var
123
$echo $variable

$echo ${var}iable
123iable
$cat shell.sh;./shell.sh

!/bin/bash

line="123 25 36532 454"
{

line="wwww"
echo "$line"

}
echo "$line"

wwww
wwww
$file=/opt/ros/jade/include/image_view/ImageViewConfig.h

匹配+删除

$echo ${file#*/} #从左侧开始匹配符合模式最短部分,将其剔除,返回剩下的
opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file#//}
ros/jade/include/image_view/ImageViewConfig.h
$echo ${file##*/} #从左侧开始匹配符合模式的最长部分,将其剔除,返回剩下的
ImageViewConfig.h
$echo ${file%/*} #从右侧开始匹配符合模式的最短部分,将其剔除,返回剩下的
/opt/ros/jade/include/image_view
$echo ${file%%/i*} #从右侧开始匹配符合模式的最长部分,将其剔除,返回剩下的
/opt/ros/jade

按个数返回

$echo ${file:0:4}
/opt
$echo ${file:4:9} #将第4个字符当作第1个,计数9个, 返回
/ros/jade

匹配+替换

$echo ${file/opt/root} #将file中的第一个opt替换为root
/root/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file//i/++} #将file中的所有i都替换为++
/opt/ros/jade/++nclude/++mage_v++ew/ImageV++ewConf++g.h

根据变量状态操作,

$echo ${file-fault} #只要设定了,就返回file,否则返回fault
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file1-fault}
fault
$echo ${file:-fault} #只要设定了且非空,就返回file,否则返回fault
/opt/ros/jade/include/image_view/ImageViewConfig.h

$echo ${file+fault} #只要设定了,就返回fault
fault
$echo ${file:+fault} #只要设定了且非空,就返回fault
fault

$echo ${file=fault} #只要file没设定,就将fault赋值给file并返回
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file1}

$echo ${file1=fault}
fault
$echo ${file1}
fault

$echo ${file:=fault} #只要file没设定或非空,就将fault赋值给file并返回
/opt/ros/jade/include/image_view/ImageViewConfig.h

$echo ${file?fault} #只要file没设定,就将fault输出至STDERR
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file:?fault} #只要file没设定或为空,就将fault输出至STDERR

统计字符数

$echo ${file}
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${#file}
50
(( ))
用作计算,shell支持十进制/十六进制/二进制的+ - / % & += -= = /= %= ++ -- 等算术运算,以及| ^ ! > >= < <= !=等逻辑运算。同样的效果也可以使用expr ...来实现,但是expr是Linux的内置软件,并不是shell语言的关键字

$echo $((1 + 2))
3
$echo $((0xf + 1))
16
$cal=132
$echo $(($cal+1))
133

[ ]
用作取数组元素,使用${arr[n]}访问数组编号为n的元素
$arr=(0 1 2 var)
$echo "${arr[0]}"
0
$echo "${arr[3]}"
var

两个反单引号表示命令替换,和$()是等价的。个人觉得看着比$()清晰,但是如果多层嵌套的话可能需要转义,此时就没有$()看着易懂。在下面的嵌套结构中,我们本意是先执行cmd3,将执行结果传给cmd2,再将结果传给cmd1

cmd1 cmd2 cmd3``
但是其实被解析成了下面这个

cmd1 cmd2cmd3 ``
为了解决这个问题,我们需要使用转义字符,写成下面这个样子才能正确的传达我们的意思

cmd cmd2 \cmd3\``
但如果我们使用$(),就可以让代码更清晰

$echo echoecho 12 #被分解成了 echo `echo` echo 12
echo 12
$echo echo \echo 12\`` #这个才对
12
$echo $(echo $(echo 12)) #这个才对
12
|
管道表示将前一个命令的返回结果用作后一个命令的参数,管道的前后必须都是命令,管道是管理Linux十分有用的工具
$grep "test" file1.txt | wc -l

以新建的方式重定向,如果文件不存在就创建文件并将内容写入,如果文件存在就把文件清空再写入内容
以追加的方式重定向,如果文件不存在就创建文件并将内容写入,如果文件存在就在原文件后面写入内容

<
我们通常的操作就是文件,其实已经使用的输入重定向

2>
标准输入,标准输出,标准错误其实是三个完全不同的文件,虽然我们看起来标准输出和标准错误都输入到显示屏中显示,但是不能用输出重定向将错误重定向到其他文件
标准输入,标准输出,标准错误的文件描述符分别是0,1,2,这也是错误重定向2>的由来
&&
&&前的命令执行成功了就继续执行后面的命令

||
||前的命令执行失败了就去执行后面的命令

;
不论;前的命令执行成功与否都去执行后面的命令

关键字
readonly
相当于C中的const,readonly将变量设为只读模式,任何针对他们的赋值都是错误的

$readonly var=123
$var=345
bash: var: readonly variable
unset
删除变量

unset var_name 删除变量var_name
unset -v first middle last 删除其他变量
unset -f fcn 删除函数
$tunset=123
$echo $tunset
123
$unset tunset
$echo $tunset

$
shift
用来截去来自列表的位置参数,从左侧开始,一旦执行shift,$1的初始值就会永远消失,取而代之的是$2的旧值,依次类推,$#的值也会依次减1
shift也可以带一个参数,表示一次截取的个数

$cat shell.sh

!/bin/bash

echo "${1}"

shift

echo "${1}"
$./*.sh 123 456
123
456
set
设置新的位置参数

$set qq ww ee
$echo "${1}"
qq
$echo "${0}"
bash
$echo "${2}"
ww
$echo "$#"
3
export
添加变量到变量导出列表,即如果在shell中执行子shell,该变量将作为环境变量从而在子shell中变得可以使用。

$cat shell.sh

!/bin/bash

echo "$NEWENV"

$NEWENV=123
$./shell.sh

$export NEWENV
$./shell.sh
123
exit
提前结束标本

test
test 和[ ]既是一个linux缺省安装的软件命令,又是一个shell关键字。两者的功能都是一模一样的

脚本内容,注意由于是在每天凌晨进行备份,所以备份时的备份目录是生成的昨天的日期目录:

#! /bin/bash
#===============
# Back up files once a day and delete old backups
# Author: joyber
#===============
ReservedNum=7  #keep last backup num
BSPATH=/var/lib/jenkins/workspace  #jenkins
for dir in `ls -d $BSPATH/*_bak`
do
  BSNAME=`basename $dir | sed 's/_bak//'` #project name
  BAKDIR=`ls -t $dir | head -1` #last project code backup diri basename
  SRC=$dir/$BAKDIR/  #copy src dir
  DESC=$BSPATH/${BSNAME}_daybak/`date +%Y%m%d -d '-1 day'`/  #copy desc dir, yesterday
  echo "$SRC => $DESC"
  if [ ! -d $DESC ]; then
    mkdir $DESC -p
  fi
  rsync -r $SRC $DESC    #use rsync copy files

  if [ $? -eq 0 ]; then
    BAKDIR=`dirname $DESC`
    cd $BAKDIR   #goto day bak dir
    FileNum=$(ls -l | grep '^d' | wc -l)   #check backup num at now

    while(( $FileNum > $ReservedNum))
    do
      OldFile=$(ls -rt | head -1)         #del old backup files
      echo  $date "Delete File:"$OldFile
      rm -rf $BAKDIR/$OldFile
      let "FileNum--"
    done
    echo -e "\033[34mbackup success\033[0m"
  else
    echo -e "\033[31mbackup failed\033[0m"
  fi
done

可以结合这篇日记方法,实现代码能快速恢复到某一天的备份
jenkins 创建可回滚的项目发布:https://blog.qqvbc.com/default/364.html

将rollback部分的代码改写一下,把path变量设置为天备份,不存在的话就是发布备份了:

case $Status  in
    Rollback)
        echo "Status:$Status"
        echo "Version:$Version"

        if [ $Version -lt 1 ];then
            echo "Version val is error"
            exit 1
        fi
        
        path="${WORKSPACE}/../${JOB_NAME}_daybak/$Version"            #每天备份的目录
        if [ ! -d $path ]; then
            path="${WORKSPACE}/../${JOB_NAME}_bak/$Version"            #备份目录
        fi
        
        if [ ! -d $path  ]; then
            echo "Bak dir not exists: $path"
            exit 2
        fi

        #清除工作空间中除了.git文件夹的所有文件
                find ${WORKSPACE}/  ! -regex .*\.git.* -empty -delete

        rsync -r --exclude=".git" ${path}/ ${WORKSPACE}/       #将备份拷贝到构建工作空间
        echo "Copy bak code ${path} to ${WORKSPACE} Completing!"
        ;;
    *)
        exit
        ;;
esac

初学shell脚本编写,望指证