Linux-Redis : No rule to make target ‘release.h’, needed by ‘release.o’

最近公司开发的游戏,本地需要搭建环境,然后复制了一份从服务器拷贝来redis源码一直编译不过去(最后去官方站下载新版的覆盖也是没用的),老是出现如下提示:

No rule to make target ‘release.h’, needed by ‘release.o’.  Stop

经过辛苦的查找,才在《Redis编译问题》中找到解决方法,收藏一下,感激,其他文章基本都是扯淡~用不到。

解决方法就是给src/mkreleasehdr.sh脚本授权。

chmod 777 mkreleasehdr.sh

SHELL-自动修改文件的所有者

最近,前端同仁反馈,模板目录经常性提示没有权限修改文件,经检查是里面的文件的所有人变了,具体为什么变,暂时没找到,那就弄个脚本让他们执行修改吧。

传入的参数是要修改的目录,必须是/data/Site/下的任意目录,其他的程序排除了。

提示:

这个脚本有权限的,chown需要管理员权限,而正常部署的账号是www结果是可以执行,但没有效果噢。

#!/bin/bash

checkroot="$1"
hasexist=$(echo $checkroot | grep "/data/Site/")
if [[ (${#checkroot} -gt 0) && ($hasexist!="") ]];
then
find $checkroot -type f -user root -exec chown www:www {} \;
fi

 

SHELL-常用的功能脚本

最近,大量测试虚拟机,结果安装复制很麻烦的,特别有时候需要重新配置常用项的内容。还是写一个脚本自动完成吧。

错误提示:

如果执行的时候出现“-bash: ./ecs.sh: /bin/bash^M: bad interpreter: No such file or directory”错误则将文件的格式保存为unix格式试试看。

目前有的功能:

  1. 网卡配置生成
  2. YUM 阿里云镜像
  3. 虚拟机 共享软件夹

源码如下

#!/bin/bash

if [ $(id -u) != "0" ]; then
    echo "You must be root to run this script"
    exit 1
fi

# 网卡配置生成
eth_generate()
{
	while true
	do
		read -p "please input network card's name:" eth_input_name
		read -p "please input network card's IP ADDR:" eth_input_ipaddr
		read -p "please input network card's Gate WAY:" eth_input_gateway
		if [[ ${#eth_input_name} -gt 0 && ${#eth_input_ipaddr} -gt 0 && ${#eth_input_gateway} -gt 0 ]];
		then
			break
		else
			echo '******'
		fi
	done
	ethconfig="/etc/sysconfig/network-scripts/ifcfg-$eth_input_name"
	if [ -e /etc/sysconfig/network-scripts/ifcfg-$eth_input_name ];
	then
		mv $ethconfig $ethconfig.bak.$(date +"%Y%m%d")
	fi
	echo "TYPE=Ethernet
BOOTPROTO=static
NAME=$eth_input_name
DEVICE=$eth_input_name
ONBOOT=yes
IPADDR=$eth_input_ipaddr
GATEWAY=$eth_input_gateway">>$ethconfig
	if [ -e $ethconfig ];
	then
		echo '##### config generate OK~! #####'
	fi
	service network restart
	mv /etc/resolv.conf /etc/resolv.conf.bak.$(date +"%Y%m%d")
	echo "nameserver 223.5.5.5
nameserver 223.6.6.6">>/etc/resolv.conf
	exit 1
}

# YUM 阿里云镜像
yum_source_aliyun()
{
	if grep -Eqi "release 6." /etc/redhat-release; then
		centosver='6'
	elif grep -Eqi "release 7." /etc/redhat-release; then
		centosver='7'
	fi
	if [[ centosver -eq 6 || centosver -eq 7 ]];
	then
		mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak.$(date +"%Y%m%d")
		curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-$centosver.repo
		echo '##### CentOS-Base.repo is download OK~! #####'
		yum makecache
		echo '##### CentOS-Base.repo CACHE is OK~! #####'
	fi
	exit 1
}

# 虚拟机 共享软件夹
# 1.执行之前请点击 设备 安装增强工具
# 2.设置 共享文件夹 设定 共享文件夹名称,脚本将用到
vbox_sharefloder()
{
	# 0
	echo '1.执行之前请点击 设备 安装增强工具'
	echo '2.设置 共享文件夹 设定 共享文件夹名称,脚本将用到'
	read -p "你是否已经准备好了?准备好请输入yes回车。" isok
	if [ "$isok" != "yes" ];
	then
		echo '请前往设置后再来尝试。'
		exit 1
	fi
	# 1
	read -p "请输入共享文件夹名称: " sharefoldername
	if [[ ${#sharefoldername} -le 0 ]];
	then
		echo "共享文件夹名称 必填"
		exit 1
	fi
	read -p "请输入您希望挂载到的目录,默认/data: " mountto
	if [ ${#mountto} -le 0 ];
	then
		mountto='/data'
	fi
	# 2
	yum install kernel-headers kernel-devel gcc* make -y
	if [ ! -e /mnt/cdrom ];
	then
		mkdir -p /mnt/cdrom
	fi
	# 3
	mount /dev/cdrom /mnt/cdrom
	cd /mnt/cdrom
	./VBoxLinuxAdditions.run
	# umount /mnt/cdrom
	# 4
	if [ ! -e $mountto ];
	then
		mkdir -p $mountto
	fi
	mount -t vboxsf $sharefoldername $mountto
	# 5
	cp /etc/fstab /etc/fstab.bak.$(date +"%Y%m%d")
	echo $sharefoldername $mountto vboxsf rw,gid=100,uid=1000,auto 0 0 >> /etc/fstab
}


#
SelectTo="$1"

#
echo "1: Auto generate network card config(as ifcfg-eth0)"
echo "2: YUM source mirror from aliyun"
echo "3: Visual Box's Tool set"
echo "0: DO NOTHING"

#
if [ ${#SelectTo} -le 0 ];
then
	read -p "Choice One To Setup (1,2,3 or 0): " SelectTo
fi

#
echo '-----';

case "${SelectTo}" in
1)
	eth_generate
	;;
2)
	yum_source_aliyun
	;;
3)
	vbox_sharefloder
	;;
0)
	exit 1
	;;
*)
	echo "you can run :$0 [1|2|3...]"
	exit 1
esac

CentOS-VBox虚拟机中网络的设置及yum库更新

最近,项目使用比较多的技术,所以也开始使用虚拟机测试了,自己安装过程麻烦,还会遇上一些问题,这边记录一下吧。

1、网络连接方式

连接方式:桥接方式

界面名称:默认或者按照实际选择

混杂模式:拒绝

2、怎么查看网络的IP信息

ip add
...
inet 192.168.1.201/24 brd 192.168.1.255 scope global enp0s3
...

或者

ifconfig
...
inet addr:192.168.1.201 ...
...

3、ifcfg-eth*最基本的配置项

TYPE="Ethernet"
BOOTPROTO="static"
NAME="eth1"
DEVICE="eth1"
ONBOOT="yes"
IPADDR="192.168.1.201"
GATEWAY="192.168.1.1"

注意:大小写不要紧,加不加引号不要紧。

4、启动网卡配置

ifup eth1

或者

service network restart

5、Yum库的更新及源替代

打开

OPSX:https://opsx.alibaba.com/mirror

选择centos最右边帮助,找到安装的版本,我的是:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

或者

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

之后运行yum makecache生成缓存。

6、

SHELL定时任务执行后钉钉机器人通知

最近,服务器不稳定,一些定时任务居然会出现没有执行的情况,所以,今天抽空写一个公共库,方便执行完毕调用钉钉机器人通知一下。

使用方法:将下面的代码保存为SdevSHcommon.sh文件,然后在需要的地方调用,注意,路径的正确。另外就是代码中的e**************************************************************f位置要修改为钉钉机器人的token值。要不,通知会出现错误,或者,在调用的时候指定token值。

然后在需要的地方,增加:

trap ‘finishNotice “{DATETIME}\n我这个是替换测试” 180********’ EXIT

将上面的”{DATETIME}\n我这个是替换测试”替换成你需要的内容,180********改为你的钉钉账户号,或者不填写,则通知全体。如果没有修改默认的token值则需要指定第三个参数。

其他就看代码吧,很简单的。

**********

#!/bin/bash

#
# . ./SdevSHcommon.sh
#

#
# USAGE:
# DingNotice “通知内容” [“AT谁”] [“群机器令牌”]
#
DingNotice()
{
local URL=”https://oapi.dingtalk.com/robot/send?access_token=”
# 通知内容
local MSG=$1
# at 谁
local TO=$2
# 机器人授权令牌
local TOTOKEN=$3
#
if [ “${MSG}” == “” ]; then
echo “通知内容不能为空”
exit 1
else
local datetime=$(date +”%Y-%m-%d %H:%M:%S”)
MSG=`echo ${MSG} | sed “s/{DATETIME}/${datetime}/g”`
#echo ${MSG}” – “${TO}” – “${TOTOKEN}
#exit 1
MSG=”\”msgtype\”: \”text\”,
\”text\”: {
\”content\”: \”${MSG}\”
}”
fi
if [ “${TO}” != “” ]; then
MSG=${MSG}”,”
TO=”\”at\”: {
\”atMobiles\”: [
\”${TO}\”
],
\”isAtAll\”: false
}”
fi
if [ “${TOTOKEN}” == “” ]; then
TOTOKEN=${URL}”e**************************************************************f
else
TOTOKEN=${URL}${TOTOKEN}
fi
#echo $@
#echo ${MSG}” – “${TO}” – “${TOTOKEN}
#exit 1
curl \
${TOTOKEN} \
-H ‘Content-Type: application/json’ \
-d “{
${MSG}
${TO}
}”
}

# DingNotice “测试一下”

#
# trap finishNotice EXIT
#
finishNotice()
{
# 通知内容
local MSG=$1
# at 谁
local TO=$2
DingNotice ${MSG} ${TO}
}
# trap ‘finishNotice “{DATETIME}\n我这个是替换测试” 180********’ EXIT

NGINX日志分析

需要在NGINX的nginx.conf中设置

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $request_time';

然后需要在站点配置中开启

access_log /www_$server_port.log main;

一定要指定main这个格式名,因为上面定义了,不指定会使用默认的则没有输出时间。

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# Check if user is root
if [ $(id -u) != “0” ]; then
echo “Error: You must be root to run this script, please use root.”
exit 1
fi

NginxLogFile=$1
if [ “${NginxLogFile}” = “” ]; then
echo “Error: must input a log’s path.”
exit 1
fi

FileName=$(basename ${NginxLogFile}|sed ‘s/\.log//’)
OutPutFileName=”Analysis_”${FileName}.txt
OutPutCSVFileName=”Analysis_”${FileName}.csv

echo “Analysis Nginx’s log : “${NginxLogFile}

# 获取最初的数据
# IP
cat ${NginxLogFile} | \
awk ‘{print $1}’ \
> a1.txt

# TIME
cat ${NginxLogFile} | \
awk ‘{print $4″]”}’ \
> a2.txt

# URL
cat ${NginxLogFile} | \
awk ‘{print $7}’ \
> a3.txt

# REQ TIME
cat ${NginxLogFile} | \
awk ‘{print $(NF)}’ \
> a4.txt

# 合并文件
paste -d ‘ ‘ a1.txt a2.txt a3.txt a4.txt > ${OutPutFileName}

# 删除临时文件
rm -rf a1.txt a2.txt a3.txt a4.txt

echo “Analysis is Success, output file name is “$(pwd)/${OutPutFileName}

# IP 访问时间 URL 响应时间
cat ${OutPutFileName} | sort | \
awk ‘$NF ~/^[0-9.]+$/ {print $1″,””\””$3″\”””,”$4}’ \
> ${OutPutCSVFileName}

echo “OK…CSV is “${OutPutCSVFileName}

xargs与tar合并查询文件并打包问题检查

今天在整理服务器上的日志的时候,希望能将日志打包保存之后再删除,然后就出现了问题了。

find /debugLog -mmin +21600 -type f -print | xargs tar cvf /debugLog_$(date +”%Y%m%d%H%M%S”).tar

会出现提示:

tar: Exiting with failure status due to previous errors

大意是上一步中存在错误,怎么查看错误是啥?

查一下,在《Linux常见问题解答–如何修复“tar:Exiting with failure status due to previous errors”》找到答案,只需要将v参数去掉就行。

使用下面的命令查看:

find /debugLog -mmin +21600 -type f -print | xargs tar cf /debugLog_$(date +”%Y%m%d%H%M%S”).tar

然后打印出好多的错误信息了:

tar: Removing leading `/’ from member names
tar: /debugLog/efast/20171204_b2c_apiv_apis_response_goods: Cannot stat: No such file or directory
tar: -: Cannot stat: No such file or directory
tar: get_all_list.txt: Cannot stat: No such file or directory
tar: /debugLog/wxauth/20180103_wxauth_115.239.174.134,: Cannot stat: No such file or directory
tar: 10.53.26.130.txt: Cannot stat: No such file or directory
tar: /debugLog/wxauth/20180103_wxauth_115.239.174.134,: Cannot stat: No such file or directory
tar: 10.53.29.194.txt: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

对于第一行的错误,百度了一下,在《“tar: Removing leading `/’ from member names”的错误》找到答案,这个因为是相对路径的缘故,需要增加P参数。

命令改为:

# find /debugLog -mmin +21600 -type f -print | xargs tar cfP /debugLog_$(date +”%Y%m%d%H%M%S”).tar

然后,继续出现下面的错误了:

tar: /debugLog/efast/20171204_b2c_apiv_apis_response_goods: Cannot stat: No such file or directory
tar: -: Cannot stat: No such file or directory
tar: get_all_list.txt: Cannot stat: No such file or directory
tar: /debugLog/wxauth/20180103_wxauth_115.239.174.134,: Cannot stat: No such file or directory
tar: 10.53.26.130.txt: Cannot stat: No such file or directory
tar:/debugLog/wxauth/20180103_wxauth_115.239.174.134,: Cannot stat: No such file or directory
tar: 10.53.29.194.txt: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

根据实际查看错误的文件名发现,这两个文件其实都有特殊:

/debugLog/efast/20171204_b2c_apiv_apis_response_goods – get_all_list.txt

/debugLog/wxauth/20180103_wxauth_115.239.174.134, 10.53.29.194.txt

因为xargs默认分割符是空格,所以,上面的就被分为5个文件了。

/debugLog/efast/20171204_b2c_apiv_apis_response_goods

get_all_list.txt

/debugLog/wxauth/20180103_wxauth_115.239.174.134,

10.53.29.194.txt

所以,我们需要将分割符换一下,代码改为下面形式就OK了~

find /debugLog -mmin +21600 -type f -print0 | xargs -0 tar cfP /debugLog_$(date +”%Y%m%d%H%M%S”).tar

完美解决,如果你需要压缩完毕后就直接删除文件,则需要增加参数

find /debugLog -mmin +21600 -type f -print0 | xargs -0 tar cfP /debugLog_$(date +”%Y%m%d%H%M%S”).tar –remove-files

就可以了。

介于上面的文件名问题,我比较不赞同直接增加参数,毕竟,架不住有时候文件名里面出现个/被解析为根目录呢?

使用下面命令麻烦了点,但是稍微比较保险,你说呢?

find /debugLog -mmin +21600 -type f -print -exec rm -rf {} \;

Linux-yum:File “/usr/bin/yum”, line 30 except KeyboardInterrupt, e: SyntaxError: invalid syntax

自从上次更新服务器开始,yum就不能用,老麻烦了,提示错误信息如下:

File “/usr/bin/yum”, line 30
except KeyboardInterrupt, e:
^
SyntaxError: invalid syntax

这个错误从网上搜出来的原因是python版本问题,是正确的,但是没有说明怎么升级yum,不懂,还好之前备份了旧版本的python了,要不就完蛋了。

vim /usr/bin/yum

将第一行的python改为旧版本的执行程序就行。

我服务器上的是python2.6

记录一下,省的忘记,还要思考怎么解决。

Linux-find:自动设置文件的所有人

网站程序在关键的地方有输出日志,日志文件以日期为文件名,每天一个,同时也开启了计划任务也会执行这个关键地方的代码,这就造成计划任务执行后新建日志文件后,所有者为root,结果,前台执行的时候就会发生错误,老是提示权限不足的问题(关键词Permission denied….)。

怎么办呢?老是这么提示也不是办法,那就使用定时任务,定时查询日志目录的文件权限。

# crontab -e

1 */1 * * * find /data2/ -type f -user root -exec chown www:www {} \;

然后保存,就会每小时执行一次。

如果时间不懂得设置的话,可以使用下面的工具协助设置:crontab执行时间计算

当然,你要是觉得这样子很麻烦的,其实,你还可以直接使用www账户登录设置计划任务的。

文件格式unix与dos转换,CRLF与LF的区别查看

这两天被一个客户的网站系统搞得很头痛的,开发的好好地不知道哪里错了,新建的文件都是不能正确执行的。

怎么检查代码都是不正确的,噢,文件是PHP的文件,经过调试,最终定位在凡是require_once进来的文件都是不会被初始化的。

奇怪的是,原先的程序代码是可以的,但是一旦修改了,就会出现空白的情况。

一直翻查程序文件都没问题。

终于在调试的过程不断的变换编码中发现一个问题:就是程序里面的代码会莫名其妙的成了“乱码”直接显示出来了。

好吧,引入今天的话题吧。

文件的格式虽然都叫做纯文本,但是他们的存储格式还是有不同的,比如这个文件格式就分unxi、dos、mac。

文件格式之外,存储的内容还有编码的区别,比如utf-8、ansi等的区别。

同一个编码还存在有BOM没有BOM的区别。

当然,还有CRLF与LF的区别,天呐,真的会疯了的。

我不就想要好好编个程嘛~

下面就是使用notepad++来查看这些内容的。

第一、文档格式

编辑、文档格式转换

  1. 转换为Windows格式
  2. 转换为UNIX格式
  3. 转换为MAC格式

当前的文档格式会成灰色。

VI操作:

set fileformat=[unix|dos]

这个决定下面换行符的行为模式。

第二、CRLF与LF的查看

视图、显示符号、显示全部字符

然后你会发现,全部的字符后面都增加了CRLF或者LF了,具体是根据你的文档格式来定的。

这个决定行与行之间是什么关系,比如本来应该单行注释一行,紧跟一行正确代码,然后这个不正确的话就变成了同一行了,然后文件就错了。而使用这些智能的编辑器,他显示是自动转换的,结果你是死活不知道原来他的处理已经并成一行了。

第三、存储的编码

编码、选择合适的编码

这个决定文件的字符是正常文字还是“乱码”。

这样子之后就正常了~