作者归档:aigol

关于aigol

Hi boby

CentOS7 Lsyncd 文件实时同步(替代Rsync和Inotify)

Lsyncd结合了inotify + rsync,Lsyncd监视本地目录树事件监视器接口(inotify或fsevents)。它聚合和组合事件几秒钟,然后生成一个(或多个)进程(es)来同步更改。

部署环境

# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 

# uname -a                
Linux filesync-20.203.localdomain 3.10.0-693.11.1.el7.x86_64 #1 SMP Mon Dec 4 23:52:40 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
    
# rsync --version   
rsync  version 3.0.9  protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
    
# lsyncd --version         
Version: 2.2.2

  安装部署 lsyncd

部署机器

Server-A  192.168.20.203   [主文件服务器,  读写]
Server-B  192.168.20.204   [备份文件服务器,只读]

密钥登录

Server-A服务器上操作

#生成密钥文件
ssh-keygen -t rsa
#将公钥拷贝到B
ssh-copy-id username@192.168.20.204
#测试
ssh username@192.168.20.204

安装 lsyncd

yum -y install lsyncd

配置文件

settings {
    logfile    = "/tmp/lsyncd.log",
    statusFile = "/tmp/lsyncd.status",
    insist = true,
    statusInterval = 10
}
sync {
    default.rsyncssh,
    source="/data",
    host="username@192.168.20.204",
    targetdir="/data",
    rsync = {
        archive = true,
        compress = false,
        whole_file = false,
        _extra = {"--bwlimit=40960"}
    },
    ssh = {
        port = 22
    }
}

测试

lsyncd -nodaemon /etc/lsyncd.conf

后台启动 lsyncd

systemctl start lsyncd
systemctl enable lsyncd

系统优化

echo -e "\nfs.inotify.max_user_watches = 8192000" >> /etc/sysctl.conf 
sysctl -p

参考文档

CentOS6 LVM 管理

CentOS6 LVM 管理

添加磁盘到LVM

fdisk /dev/vdb
n

t # 磁盘id设置为 8e ,Linux LVM


 umount /data
 fdisk /dev/vdb
 vgdisplay 
 d
 vgextend VolGroup /dev/vdb1 
 vgdisplay 
 lvextend -L +490G /dev/VolGroup/lv_root 
 lvdisplay 
 resize2fs /dev/VolGroup/lv_root 
 df 
 df -h
 vi /etc/fstab 

参考文档

使用sed删除匹配行及上下几行

删除包含DATA Partition的行,同时删除这行的后面2行和上面3行
sed -i ‘/DATA Partition/,+2d;:go;1,3!{P;N;D};N;bgo’ report.cfg

参考文档:
sed ‘/5/,+3d;:go;1,2!{P;N;D};N;bgo’ file
/5/,+3d 对匹配到5的那一行以及该行的后三行都执行d操作(d 清空模式空间)
:go 设一个标签go
1,2!{P;N;D} 除了第一行和第二行,其他行都执行P;N;D操作(P 打印当前模式空间的第一行;N 将下一行添加到当前模式空间中;D 删除模式空间的第一行并开始一个新的循环)
N 这个命令只对第一行和第二行有效了,因为其他行在上一个命令中都执行了D,直接开始新的循环了,所以这个命令不会被执行。
bgo 返回go标签

http://bbs.chinaunix.net/thread-3775201-1-1.html

 

CentOS6 安装Webmin

官网:http://www.webmin.cn/download.html
参考:http://spikedighole.blog.163.com/blog/static/176998045201562805435418/

# uname -a                
Linux localhost.localdomain 2.6.32-573.18.1.el6.x86_64 #1 SMP Tue Feb 9 22:46:17 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/redhat-release 
CentOS release 6.7 (Final)
# rpm -qa|grep webmin
webmin-1.780-1.noarch


# webadmin安装升级会用到perl-Net-SSLeay
yum -y install perl-Net-SSLeay
# wget http://prdownloads.sourceforge.net/webadmin/webmin-1.740-1.noarch.rpm
wget http://jaist.dl.sourceforge.net/project/webadmin/webmin/1.780/webmin-1.780-1.noarch.rpm
rpm -ivh webmin-1.780-1.noarch.rpm 
netstat -ntlp|grep 10000

 

转:使用 /sys 文件系统访问 Linux 内核

sysfs 虚拟文件系统提供了一种比 proc 更为理想的访问内核数据的途径

sysfs 是 Linux 内核中设计较新的一种虚拟的基于内存的文件系统,它的作用与 proc 有些类似,但除了与 proc 相同的具有查看和设定内核参数功能之外,还有为 Linux 统一设备模型作为管理之用。相比于 proc 文件系统,使用 sysfs 导出内核数据的方式更为统一,并且组织的方式更好,它的设计从 proc 中吸取了很多教训。本文就 sysfs 的挂载点 /sys 目录结构、其与 Linux 统一设备模型的关系、常见属性文件的用法等方面对 sysfs 作入门介绍,并且就内核编程方面,以具体的例子来展示如何添加 sysfs 支持。

详见  https://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/

centos 6 如何动态识别新插入物理磁盘(一) http://afatech.iteye.com/blog/2278379

CentOS 使用lynx更新3322.org DDNS

参考文档:
http://www.pubyun.com/products/dyndns/download/

# 安装lynx
# yum install lynx

# lynx -mime_header -auth=hahaha:2016! "http://members.3322.net/dyndns/update?system=dyndns&hostname=hahaha.f3322.net"
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 23 Feb 2016 09:12:23 GMT
Content-Type: text/plain; charset=utf-8
Connection: close
Vary: Cookie

good 16.26.19.26
#
# 
# lynx -mime_header -auth=hahaha:2016! "http://members.3322.net/dyndns/update?system=dyndns&hostname=hahaha.f3322.net"
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 23 Feb 2016 09:14:00 GMT
Content-Type: text/plain; charset=utf-8
Connection: close
Vary: Cookie

nochg 16.26.19.26

 

CentOS6 安装phpMyAdmin

# cat /etc/redhat-release 
CentOS release 6.7 (Final)
# rpm -qa|grep phpMyAdmin
phpMyAdmin-4.0.10.14-1.el6.noarch
# rpm -qa|grep mysql-server
mysql-server-5.1.73-5.el6_6.x86_64

# 添加epel源
# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm

# 安装相关软件包
# yum -y install httpd mysql php php-mysql phpmyadmin

# 修改index文件
# vi /etc/httpd/conf/httpd.conf 
DirectoryIndex index.php index.html index.html.var

# 允许远程登录phpMyAdmin
# vi /etc/httpd/conf.d/phpMyAdmin.conf 
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 1.1.1.2
     Allow from 127.0.0.1
     Allow from ::1
   </IfModule>
   
# 重启httpd
service httpd restart

# 登录
http://server_ip/phpmyadmin/

 

golang动态更新CCProxy账号对应的IP

环境:
Windows2008R2系统上安装CCProxy代理,安全起见只允许自己的IP可以使用代理。
由于自己使用的ADSL拨号,IP不固定,每次手动修改太麻烦。
所以使用Golang自动更新CCProxy配置。
大概过程:
1、自己这边使用一个DDNS,域名为 test.allgo.cc
2、使用golang每个1分钟解析一次test.allgo.cc
3、解析结果若同CCProxy配置中的不同,则更新配置
4、重新载入CCProxy配置

 

package main

/*
编译后台运行
go build -ldflags "-H windowsgui" -o ddns_ccproxy.exe edit_win_ini.go

goconfig库教程
https://github.com/Unknwon/go-rock-libraries-showcases/tree/master/lectures/01-goconfig
*/

import (
	"fmt"
	"github.com/Unknwon/goconfig"
	"log"
	"net"
	"os/exec"
	"time"
)

const (
	DDNS_STR      = "test.allgo.cc"
	INI_PATH      = "C:/CCProxy/AccInfo.ini"
	EXE_PATH      = "C:/CCProxy/CCProxy.exe"
	TIME_INTERVAL = 60
)

var (
	cfg_ip string
)

func main() {
	cfg, err := goconfig.LoadConfigFile(INI_PATH)
	if err != nil {
		log.Fatalf("无法加载配置文件:%s", err)
	}

	cfg_ip, err = cfg.GetValue("User001", "IPAddressLow")
	if err != nil {
		log.Fatalf("无法获取键值(%s):%s", "IPAddressLow", err)
	}
	log.Printf("%s > %s: %s", "User001", "IPAddressLow", cfg_ip)

	for {
		now_ip, err := get_cfg_ip()
		if err != nil {
			log.Printf("dns无法解析: %s", err)
		} else {
			if now_ip != cfg_ip {

				log.Printf("now_ip ->[%s] , cfg_ip->[%s]", now_ip, cfg_ip)

				//更新ini文件IP
				isInsert := cfg.SetValue("User001", "IPAddressLow", now_ip)
				log.Printf("设置键值 %s 为插入操作:%v", "IPAddressLow", isInsert)

				isInsert0 := cfg.SetValue("User001", "IPAddressHigh", now_ip)
				log.Printf("设置键值 %s 为插入操作:%v", "IPAddressHigh", isInsert0)

				//更新ini文件时间
				isInsert1 := cfg.SetValue("User001", "DisableDateTime", ntime())
				log.Printf("设置键值 %s 为插入操作:%v", "DisableDateTime", isInsert1)

				err := goconfig.SaveConfigFile(cfg, INI_PATH)
				if err != nil {
					log.Fatalf("无法保存配置文件:%s", err)
				}
				reload_ccproxy_cfg()
				err1 := cfg.Reload()
				if err1 != nil {
					log.Fatalf("重新载入ini配置失败:%s", err)
				}
				cfg_ip, err = cfg.GetValue("User001", "IPAddressLow")
				if err != nil {
					log.Fatalf("无法获取键值(%s):%s", "IPAddressLow", err)
				}
				log.Printf("%s > %s: %s", "User001", "IPAddressLow", cfg_ip)
			} else {
				log.Printf("DNS IP not change !")
			}
		}
		time.Sleep(time.Second * TIME_INTERVAL)
	}

}

//解析域名,返回字符串类型IP
func get_cfg_ip() (ip_str string, err error) {
	dns_ip, err := net.LookupIP(DDNS_STR)
	ip_str = iptostr(dns_ip[0])
	log.Printf("dns resolve : %s", ip_str)
	return ip_str, err
}

//获取当前时间
func ntime() string {
	tmpnow := time.Now()
	return fmt.Sprintf(tmpnow.Format("2006-01-02 15:04:05"))
}

//ip类型转字符串类型
func iptostr(tip net.IP) string {
	return fmt.Sprintf("%s", tip)
}

//重新加载CCProxy配置
func reload_ccproxy_cfg() {
	log.Println("Reload CCProxy Config...")
	argv := []string{"-update"}
	//fmt.Println(argv)
	_, err := exec.Command(EXE_PATH, argv...).Output()
	if err != nil {
		log.Printf("Reload CCProxy Config Error: %s", err)
	}
}

 

vbs系统后台持续检测一个进程是否存在

回答百度知道问题:
http://zhidao.baidu.com/question/713784585787480605

问题:
vbs,系统后台持续检测一个进程是否存在,如:qq.exe。如果存在,倒计时X秒将其关闭,如果不存在,继续后台检测。检测时间间隔可设置。

Const INTERVA = 5  '检测间隔
dim ps,ps_str
Set objShell = createobject("wscript.shell")
 
REM 解决CMD黑色闪运行
REM 参考<a href="http://demon.tw/programming/vbs-run-and-exec.html?replytocom=1928" target="_blank">http://demon.tw/programming/vbs-run-and-exec.html?replytocom=1928</a>
host = WScript.FullName
If LCase(Right(host, 11)) = "wscript.exe" Then
    objShell.run "cscript """ & WScript.ScriptFullName & chr(34), 0
    WScript.Quit
End If
REM -----------------------------------------------------------------------
 
do while true
    Set ps = objShell.Exec("tasklist")
    ps_str = ps.Stdout.ReadAll
    'msgbox ps_str
    if find_yn(ps_str) then
        objShell.Popup "5秒后将关闭 QQ !", 5, "Close QQ"
        Set ps = objShell.Exec("taskkill /F /IM QQ.exe /T")  '测试程序
    end if
    wscript.sleep 1000 * INTERVA  '检测间隔
loop
set ps = nothing
set objShell = nothing
 
 
Function find_yn(str_s)   '查找进程是否存在,不存在返回0
    Dim re,ms,m
    find_yn = 0
    set re = New RegExp
    re.Global = True
    re.MultiLine = True 
    're.Pattern = "^(QQa|QQb|QQ).exe"     '可以检测查看多个进程
    re.Pattern = "^QQ.exe"  '测试查找进程
    set ms = re.Execute(str_s)
    For Each m In ms
        'msgbox m
        find_yn = find_yn + 1
    Next
End Function