分类存档: linux

脚本获得当前所在的目录

写脚本时经常需要获取当前执行的脚本所在的目录。

我最早使用的是:

shellPath=`echo $PWD/``echo ${0%/*}`

今天在做一个远程执行脚本时才发现,如果执行脚本时使用绝对路径,上面会得到错误的路径,现修改如下,可同时支持相对路径和绝对路径执行脚本:

shellPath=`echo $PWD/``echo ${0%/*}`

# process absolute path
shellPath1=`echo $PWD/`
shellPath2=`echo ${0%/*}`
if [ ${shellPath2:0:1} == '/' ] ; then
    shellPath=${shellPath2}
fi

记一次排查服务器被控制

一个朋友联系我说服务器被当做肉鸡了,在 /etc/init.d 目录有几个脚本无法删除,删除后自动生成。

联系云服务器技术客服,回复说是被当做肉鸡了。

我连上服务器查看了下那个脚本:

#chkconfig: 12345 90 90
#description: acdnfhruvx
#BEGIN INIT INFO
#Provides: acdnfhruvx
#Required-Start:
#Required-Stop:
#Default-Start: 1 2 3 4 5
#Default-Stop:
#Short-Description: acdnfhruvx
#END INIT INFO
case $1 in
start)
/bin/acdnfhruvx
;;
stop)
;;
*)
/bin/acdnfhruvx   
;;
esac

感觉没有任何有用的线索。

查看 conrtab -e ,也仅有一个正常的业务逻辑脚本。

本来以为他是常驻内存的进程来定时检测文件是否被删除,但查看history, ps 等也没有得到任何有用的线索。

打开 /etc/crontab 脚本时,发现异常了:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

*/3 * * * * root /etc/cron.hourly/gcc4.sh

这个 gcc4.sh 是什么鬼,而且每3分钟执行一次,如此高频率就不仅仅是可疑,简单就是在自己脸上贴上我是木马。

打开 /etc/cron.hourly/gcc4.sh 后就很明了了:自动执行一个二进程代码文件。

把gcc4.sh 文件备份后修改名字,再去 /etc/init.d 目录下清除可疑的自启动脚本,删除后没有重新创建出来。

再去 修复 /etc/crontab ,把最后一行删除。把 gcc4.sh 删除,把里面提到的 so 文件删除。

OK,结束。

减少mongod占用的内存

日志服使用的mongod,发现其中一台上占用内存比较多:

google之,发现如果开启journal时,会导致内存占用过多,同时也会有journal文件占用硬盘空间。

因为我们的日志并不是关键数据,允许故障时丢失。所以首先要关闭mongod的journal。

如果在启动时,可以指定: –nojournal 来关闭。

另外,如果内存占用过多,可以定时调用以下命令来释放缓存:

use admin;

db.runCommand({closeAllDatabases:1})

jenkens设置允许启动的进程不被kill掉

https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller

java -Dhudson.util.ProcessTree.disable=<span class="code-keyword">true</span> -jar jenkins.war

linux下查看及修改客户端连接的端口号

[root@xyxm-iosgame-001 ~]# cat /proc/sys/net/ipv4/ip_local_port_range 
1024    65535

查看客户端分配的端口。因为游戏开发通常也需要绑定端口号,所有需要我们游戏绑定的端口号和socket连接分配的端口号不能冲突。

这里可以修改这个分配的范围:

#修改端户端允许分配的端口号范围
echo 32668 65535 > /proc/sys/net/ipv4/ip_local_port_range

unixbenchmark

游戏在越南服上,其中一个虚拟机上,一直说是玩家玩起来非常卡。

查了两天时间,终于确认那台虚拟机就是非常卡。

从网上找了一个benchmark工具,测试一下,明天把测试结果结果贴出来。

unixbench-5.1.2.tar

注意:

1、yum -y  install perl-Time-HiRes

2、如果没有图形界面,需要修改Makefile,将其中的 GRAPHIC_TESTS 注释掉。

 

以后最好新开服时,直接用这个脚本测试一下机器性能。避免入坑。

昨天晚上跑的结果,出问题的那台机器得分只有其它机器的30%左右。

 

 

脚本手动可执行,但crontab执行失败

运维同事遇到的问题。

开始感觉很奇怪,脚本正确,手动可以执行正确。但是在crontab中执行就不正确。

查到后来发现crontab中的PATH变量只有最基础的:PATH:/usr/bin:/bin

手动输出下PATH:

[root@GiangMa_Login2_Payment router-log]# echo $PATH

/data/service/jdk1.8.0_45/bin:/usr/java/jdk1.7.0_80//bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql-5.5.44/bin:/home/monitor/bin

好了,原因找到了,在脚本中直接export PATH=$PATH:/data/service/jdk1.8.0_45/bin:/usr/java/jdk1.7.0_80//bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql-5.5.44/bin:/home/monitor/bin

问题顺利解决掉。

 

 

记一次redis数据修复

运维同学一不小心将redis数据清空了。

redis中大部分数据都不重要,只有一个排行榜数据,需要按排行榜名次发放奖励。

记下这次修复的方案:

grep 限时 moon30001-gold_2015-08-21.log | awk -F ' ' '{print $3}' | awk -F '(' '{print $1}' | sort | uniq -c | sort -n | awk -F ' ' '{print $1*20,$2}'

从log中取出所有分数及角色id.

redis-cli -p 7000 EVAL "local a=redis.call('zscore','shenJiang.score.20150821','506027'); if not a  then return redis.call('zadd','shenJiang.score.20150821','201440149466188','506027') end;return a" 0

使用lua脚本恢复排行榜数据。

nginx根据ip进行转发

今天有这样一个需求:

http://xxxx/yyy

如果请求来自于某个特殊ip,则访问:

http://xxxx/yyyy_test

之前想的是nginx中的proxy很easy就可以实现,判断一下来源,进行转发。

类似于:

location /yyyy/ {
                if ( $remote_addr ~* "1.2.3.4" ){
                        proxy_pass http://127.0.0.1/yyyy_test;
                        break;
                }
        }

结果发现 yyyy_test uri的变动无法应用至 if 代码段:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /opt/nginx/conf/nginx.conf:125

最终修改为如下:

另开一个81端口的server进行跳转一下

        location /moonsrc/ {
                if ( $remote_addr ~* "1.2.3.4" ){
                        proxy_pass http://127.0.0.1:8|ԌE|Ԍ  break;
                }
                if ( $http_x_forwarded_for ~* "1.2.3.4" ){
                        proxy_pass http://127.0.0.1:81;
                        break;
                }
        }
    }

    server {
        listen       81;
        server_name  abc.com;

        location / {
            root   html;
            index  index.html index.htm index.php;
                autoindex on;
        }

        location /yyyy/ {
                proxy_pass http://127.0.0.1:81/yyyy_test/;
        }

    }

linux 计算某一列数字的总和

awk ‘{print $1}’ | awk ‘{sum+=$1}END{print sum}’