Archive for the ‘bash’ Category

全局性的vim配置可以写在.vimrc等配置文件里,而有的时候,希望针对某些特殊文件配置,也希望这些文件即使分发到其他人那里,也可以保留这些配置,这个时候,就需要vim modeline了!

在文件开头,或者最后,按照如下写法:

# vim: filetype=php

就可以把当前文件指定为php类型的文件。具体配置语法与vimrc没有区别。

具体参考:http://vim.wikia.com/wiki/Modeline_magic

gnuplot简介

Gnuplot 是一种免费分发的绘图工具,可以移植到各种主流平台。它可以通过交互式的命令行画图,也可以从文件中读取命令画图。

Gnuplot supports many types of plots in either 2D and 3D. It can draw using lines, points, boxes, contours, vector fields, surfaces, and various associated text. It also supports various specialized plot types.

gnuplot安装

方式1:

自动安装,如geetoo下的emerge: sudo emerge gnuplot

方式2:

源代码安装。

SourceForge下载gnuplot源代码,并解压缩:tar -xzvf gnuplot.tar.gz

./configure

make ; sudo make install

命令行运行方式

输入gnuplot命令,启动后,进入交互式模式,在”gnuplot>”提示符下可以开始画图。

如果是桌面下运行,则输入: plot sin(x)后,会弹出图片浏览器,显示正弦曲线图。

还可以把图片保存在文件里:

>set term jpeg

>set output ‘a.jpg’

>plot sin(x)

这时,会生成a.jpg文件。

更复杂的作图方式可以参考ibm的教程:http://www.ibm.com/developerworks/cn/linux/l-gnuplot/index.html

可能出现的问题

1. 安装中,如果configure出现问题,可以查看源代码下的config.log,看看其中有报哪些error。可能是缺少依赖库等。

2. 安装后,启动gnuplot,输入set term jpeg,报错:

unknown or ambiguous terminal type

这是因为安装时缺少jpeg的依赖库,查看config.log可以看到jpeg test的结果是no!

所以需要事先安装支持jpeg的gd库(确保重新安装gd后,gnuplot安装时使用的libgd.so和libjpeg.so是你新安装的)。

参考文档:

gnuplot官网:http://www.gnuplot.info/

gnuplot 让您的数据可视化:http://www.ibm.com/developerworks/cn/linux/l-gnuplot/index.html

今天发现一个挺奇怪的现象,ms用户的home下有.bash_profile,其中我定义了一些path。但是当我从flykobe用户 sudo su ms之后,echo $PATH发现.bash_profile没有被加载。

flykobe@138 v1 $ echo $PATH
/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.1.2:/usr/local/apache/bin:/usr/local/mysql/bin:/home/yicheng/tools/:/usr/local/mysql/bin/:/home/yicheng/music_seo/script/:/home/yicheng/music_seo/script/smalltools/
ms@tj1cantispam002 /home/yicheng $ echo $PATH
/bin:/usr/bin
而且这个path明显也不是从flykobe用户带来的。
经过查找,发现sudo、su之间的微小差别:

su = switch user
su – username = switch user to that username and transfer current environment variables
sudo <command> = execute this command as root (requires you to be set as an admin in OS X)
sudo su = execute the switch user command as root, this is a little weird – you don’t need to be root to switch users.

也就是说,当我执行 sudo su ms的时候,仅仅是切换了用户,但是没有重新登录,所以也没有加载ms用户对应的一些配置文件。

而执行 sudo su – ms的时候,相当于真正的重新登录了!

最近有个用户推荐算法的项目,需要分析大量的log日志,并进行计算。由于时间较紧,来不及去研究mapreduce的成熟项目,就自己用php、bash等写了一些最简单的代码。

但是,这样的弊端是,每天都要跑较长时间,所以想办法把其中的calculate的部分抽取出来,做了简朴的分布式计算。

######## 在每台独立计算服务器上,进行计算 #####################
{scp $ANALYDATAPATH/idf.2 ms@10.60.0.105:$ANALYDATAPATH; ssh ms@10.60.0.105 "cd $ANALYPATH; ./cal.php" ;scp $ANALYDATAPATH/load.2   ms@10.60.1.138:$ANALYDATAPATH}&
{cd $ANALYPATH; ./cal.php; cd -}&
wait

这里主要参考了:http://www.cnitblog.com/sysop/archive/2008/11/03/50974.aspx

其中可以控制线程数目的代码比较有意思,摘录如下:

#!/bin/bash
# 2006-7-12, by wwy
#———————————————————————————–
# 此例子说明了一种用wait、read命令模拟多线程的一种技巧
# 此技巧往往用于多主机检查,比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况
# 还说明了多线程的控制
#———————————————————————————–



function a_sub {
# 此处定义一个函数,作为一个线程(子进程)
sleep 3 # 线程的作用是sleep 3s
}


tmp_fifofile
=/tmp/$$.fifo
mkfifo
$tmp_fifofile # 新建一个fifo类型的文件
exec 6<>$tmp_fifofile # 将fd6指向fifo类型
rm $tmp_fifofile


thread
=15 # 此处定义线程数
for ((i=0;i<$thread;i++));do
echo
done
>&6 # 事实上就是在fd6中放置了$thread个回车符


for ((i=0;i<50;i++));do # 50次循环,可以理解为50个主机,或其他

read u6
# 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
# fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制


{
# 此处子进程开始执行,被放到后台
a_sub && { # 此处可以用来判断子进程的逻辑
echo a_sub is finished
}
|| {
echo
sub error
}
echo
>&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
} &

done

wait # 等待所有的后台子进程结束
exec 6>&- # 关闭df6


exit 0

sleep 3s,线程数为15,一共循环50次,所以,此脚本一共的执行时间大约为12秒

即:
15×3=45, 所以 3 x 3s = 9s
(50-45=5)<15, 所以 1 x 3s = 3s
所以 9s + 3s = 12s

$ time ./multithread.sh >/dev/null

real        0m12.025s
user        0m0.020s
sys         0m0.064s

而当不使用多线程技巧的时候,执行时间为:50 x 3s = 150s。

此程序中的命令

mkfifo tmpfile

和linux中的命令

mknod tmpfile p

效果相同。区别是mkfifo为POSIX标准,因此推荐使用它。该命令创建了一个先入先出的管道文件,并为其分配文件标志符6。管道文件是进程之间通信的一种方式,注意这一句很重要

exec 6<>$tmp_fifofile # 将fd6指向fifo类型

如果没有这句,在向文件$tmp_fifofile或者&6写入数据时,程序会被阻塞,直到有read读出了管道文件中的数据为止。而执行了上面这一句后就可以在程序运行期间不断向fifo类型的文件写入数据而不会阻塞,并且数据会被保存下来以供read程序读出。