标签归档:shell

proc_open使用一例

平时工作中很少用到proc_open这个函数,最近用这个函数做了一个数据库管理小程序。

实现如下:


//file name db.php
$mysql_list = array(
'test' => 'mysql -hlocalhost -utest -p123456 -P3306 test',
'test2' => 'mysql -h172.16.190.199 -utest2 -p654321 -P3306 test2',
);
$desc = array(
0 => STDIN,
1 => STDOUT,
2 => STDERR,
);
$flag = @$argv[1];
$env = $_ENV;
$cwd = getcwd();
if(!isset($mysql_list[$flag]))
{
exit("can not found the $flag");
}
$re = proc_open($cmd, $desc, $pipes, $cwd, $env);
if(!$re)
{
exit('failed to execute cmd');
}

这样有很多数据库需要管理的时候就比较容易了,直接配置下连接参数,然后:

php db.php test

简单实用吧~

补一个bash实现的。

#!/bin/bash
flag=$1;
case $flag in
'test')
(mysql -hlocalhost -utest -p123456 -P3306 test);
;;
'test2')
(mysql -h172.16.190.199 -utest2 -p654321 -P3306 test2);
;;
*)
echo 'can not found the flag cmd';
;;
esac;

一个简单的日志监控脚本

用最小的成本实现的一个日志监控程序,示例如下:

#!/bin/sh
sleep 5m
log=/var/log/php5.log
tail -Fn0 $log | \
while read line; do
echo $line | grep 'Fatal error'
if [ $? = 0 ]
then
pids=$(ps aux | grep $0 | grep -v 'grep' | awk '{print $2}')
php mail_error.php 'PHP Fatal error' "$line" # do what you want to do
sh $0 "$@" &
[ "$pids" != "" ] && kill -9 $pids
fi
done

代码副本:https://gist.github.com/tomheng/7600651

程序会在找到第一个错误的时候后会重新启动自己(先kill 掉自己,然后再启动),此外程序开始的时候会有一个休眠时间。这样做防止同一个错误被不断的报错,特别是访问量大的时候可以会造成问题(如果有报警的话,也会造成干扰)。当然这样同时也产生了一个负面问题,因为有休眠时间,所以有可能会漏掉一部分错误日志,不过这个应该影响不大。

发邮件的话可以用PHPMailer,简单实用,特别是对那些没有安装软件权限的主机。

顺祝周末愉快,亲~

Linux 命令wc 小插曲

做开发的或多或少都会接触过wc 这个命令吧,手册里说这个命令的的作用是“print newline, word, and byte counts for each file”,一般情况下大家可以用wc -l $file 来统计文件中行数。

但是你如果按下面这样操作,就会发现一个有趣的事情。

php -r 'file_put_contents("/tmp/a.txt", implode(PHP_EOL, array(1, 2)));';
wc -l /tmp/a.txt #one line
awk '{print NR}' /tmp/a.txt #two lines

我理解的这个地方正常应该显示两行才对,因为换行符意思就是结束上一行开始新一行,所以在有一个换行符的情况下应该按两行来处理。这个在工作中有时可能需要注意下,有很多程序可能写入文件的时候都没有在最后添加换行符,所以如果直接用wc可能不够准确。

如何利用shell命令在特定文件类型中做搜索

比如在log文件中搜索相应的代码:

#第一种方法,{}在这里指find搜索的结果
find $dir -type f -name '*.log' -exec grep -o $pattern {} \;
#第二种方法
find $dir -type f -name '*.log' -print0 | xargs -0 grep -o $pattern

参考:http://zh.wikipedia.org/wiki/Xargs
摘录自:http://www.unix.com/unix-dummies-questions-answers/53172-how-do-i-grep-specific-file-types.html

Linux中的md5命令

今天想生成一个字符串的MD5, shell中有一个md5sum命令,但是这个适合用来验证MD5,如果要生成字符串的MD5可以这样

echo -n ‘123456’ | md5sum

这样不是很方便,so我写了个超简单的shell脚本


#!/bin/bash
echo -n $1 | md5sum | awk '{print $1}'

https://gist.github.com/2271597

将上面的代码写入/user/bin/md5文件,并且给文件加上执行权限。

于是世界变得美好了;


md5 123456

#print e10adc3949ba59abbe56e057f20f883e

SSH实现免密码登录

如果用登录远程服务器每次都要输入密码,效率会很低。那么怎么实现SSH的免密码登陆呢?

方法很简单,先用ssh-keygen生成一对私钥和公钥,然后把公钥添加到远程主机的authorized_keys里就行了。

#生成私钥和公钥,默认放在~/.ssh/文件夹下,也可以自定义,提示输入passphare时,直接回车
#顺利的话就会在~/.ssh/文件夹下生成id_rsa.pub和id_rsa两个文件
ssh-keygen -t rsa

#把id_rsa.pub上传到远程主机,方法很多,ssh-copy-id只是其中一种
ssh-copy-id username@hostname
#如果id_rsa.pub在其他文件夹下
ssh-copy-id -i /path/to/id_rsa.pub username@hostname
#以后直接使用下面的命令登陆
ssh hostname

摘录自:http://blog.leezhong.com/tech/2010/08/28/ssh-tips.html
参考:http://hi.baidu.com/thinkinginlamp/blog/item/e74ab051102c5f12367abef6.html