星期一, 二月 05, 2007

验证我的blog

--huolatdeclare:11:6e1df2d7-5897-4767-918b-c29eb04b9fc6--
message from huolat.com
692b1532 c5ca62c6
message as beta.feedsky.com

星期一, 十二月 25, 2006

摘录:有用的表格(一)MYSQL Cheat Sheets

MYSQL Cheat Sheets
http://www.nparikh.org/unix/mysql.php

Selecting a database:
mysql> USE database;
Listing databases:
mysql> SHOW DATABASES;
Listing tables in a db:
mysql> SHOW TABLES;
Describing the format of a table:
mysql> DESCRIBE table;
Creating a database:
mysql> CREATE DATABASE db_name;
Creating a table:
mysql> CREATE TABLE table_name (field1_name TYPE(SIZE), field2_name TYPE(SIZE));
Ex: mysql> CREATE TABLE pet (name VARCHAR(20), sex CHAR(1), birth DATE);
Load tab-delimited data into a table:
mysql> LOAD DATA LOCAL INFILE "infile.txt" INTO TABLE table_name; (Use n for NULL)
Inserting one row at a time:
mysql> INSERT INTO table_name VALUES ('MyName', 'MyOwner', '2002-08-31'); (Use NULL for NULL)
Retrieving information (general):
mysql> SELECT from_columns FROM table WHERE conditions;
All values: SELECT * FROM table;
Some values: SELECT * FROM table WHERE rec_name = "value";
Multiple critera: SELECT * FROM TABLE WHERE rec1 = "value1" AND rec2 = "value2";
Reloading a new data set into existing table:
mysql> SET AUTOCOMMIT=1;
# used for quick recreation of table
mysql> DELETE FROM pet;
mysql> LOAD DATA LOCAL INFILE "infile.txt" INTO TABLE table;
Fixing all records with a certain value:
mysql> UPDATE table SET column_name = "new_value" WHERE record_name = "value";
Selecting specific columns:
mysql> SELECT column_name FROM table;
Retrieving unique output records:
mysql> SELECT DISTINCT column_name FROM table;
Sorting:
mysql> SELECT col1, col2 FROM table ORDER BY col2;
Backwards: SELECT col1, col2 FROM table ORDER BY col2 DESC;
Date calculations:
mysql> SELECT CURRENT_DATE, (YEAR(CURRENT_DATE)-YEAR(date_col)) AS time_diff [FROM table];
MONTH(some_date) extracts the month value and DAYOFMONTH() extracts day.
Pattern Matching:
mysql> SELECT * FROM table WHERE rec LIKE "blah%";
(% is wildcard - arbitrary # of chars)
Find 5-char values: SELECT * FROM table WHERE rec like "_____"; (_ is any single character)
Extended Regular Expression Matching:
mysql> SELECT * FROM table WHERE rec RLIKE "^b$";
(. for char, [...] for char class, * for 0 or more instances ^ for beginning,
{n} for repeat n times, and $ for end)
(RLIKE or REGEXP) To force case-sensitivity, use "REGEXP BINARY"
Counting Rows:
mysql> SELECT COUNT(*) FROM table;
Grouping with Counting:
mysql> SELECT owner, COUNT(*) FROM table GROUP BY owner;
(GROUP BY groups together all records for each 'owner')
Selecting from multiple tables:
(Example) mysql> SELECT pet.name, comment FROM pet, event WHERE pet.name = event.name;
(You can join a table to itself to compare by using 'AS')
Currently selected database:
mysql> SELECT DATABASE();
Maximum value:
mysql> SELECT MAX(col_name) AS label FROM table;
Auto-incrementing rows:
mysql> CREATE TABLE table (number INT NOT NULL AUTO_INCREMENT, name CHAR(10) NOT NULL);
mysql> INSERT INTO table (name) VALUES ("tom"),("dick"),("harry");
Adding a column to an already-created table:
mysql> ALTER TABLE tbl ADD COLUMN [column_create syntax] AFTER col_name;
Removing a column:
mysql> ALTER TABLE tbl DROP COLUMN col;
(Full ALTER TABLE syntax available at mysql.com.)
Batch mode (feeding in a script):
# mysql -u user -p source batch_file;
Backing up a database with mysqldump:
# mysqldump --opt -u username -p database > database_backup.sql
(Use 'mysqldump --opt --all-databases > all_backup.sql' to backup everything.)
(More info at MySQL's docs.)
 

星期四, 十二月 14, 2006

构思:Parser 调度流程

构思:Parser 调度流程
tags:构思,简单的调度,调度,shell
PS:下面是自己的一段构思,伪代码,很伪... 呵呵 希望你能看得懂
目的是实现一个可以被监控的任务处理

程序
Worker 执行parser任务
Fairy 检测worker 是否正常运行中
数据
Lastupdate-yyyy-mm-dd.hh 任务流,即时追加中(url)

kill_worker.tmp 当前任务的id
Last_line.tmp 最后处理的行数
Logs/[job].err_lines.err 处理失败的数据

[raw_base]/[mpath].raw 数据源
[out_base]/[mpath].path 对应数据原始路径(url)
[out_base]/[mpath].rss 结果数据
Logs/[job].worker.err 错误日志
Logs/[job].worker.log 处理日志

Fairy 每10分钟启动一次
Max_pause_time=5min
If (!-f last_line.tmp) or (last_line.tmp’s change time -lt current time-$Max_pause_time) # 如果任务标记文件不存在或的最后更新时间 超过了限定的间隔
Then
cat kill_worker.tmp|sh # 假定工作进程宕机,将当前的工作进程杀掉
err_line=`cat last_line.tmp`; # 获取宕机时刻的任务
if `tail -1 logs/[jobs].err_lines.err`==$err_line # 如果同上一次宕机的任务相同
then
echo $err_line|awk ‘{sub(“.*”,$2++,$2);print}’> cat last_line.tmp; # 重置当前任务为下一个任务
echo $err_line >> logs/[jobs].err_lines.err # 记录当前出错的任务
worker [job] & # 启动下一次任务
fi

Worker 由Fairy 自动启动
$job=$1; # 获取任务
Pid=$$; # 获取当前进程的id
Echo kill $pid > worker_pid.tmp; # 设置kill操作
Start_line=`cat last_line.tmp|awk ‘{if(/$job/){print $2}else{print 1}` # 获取开始的行号
Line=1;
While read $line
If($line –gt $start_line)
Then
Continue;
Fi

Echo $job $Line > last_line.tmp; # 设置最后行号
Echo $line |php stream-parser.php ; # 开始单次任务
$Line++; # 递增
Done<$job # 设定任务流 > Logs/$job.worker.$pid.log # 记录日志
2> Logs/$job.worker.$pid.err # 记录错误日志


星期三, 十二月 13, 2006

code:管理shell中的子任务

管理shell中的子任务
tags:shell,kill,awk
---------------------------------------------------------------
PS:好久之前的代码了 不过正好用到 就找来发到这里了
---------------------------------------------------------------

http://fallseir.livejournal.com/58926.html
ps #打印运行的进程列表
kill #杀掉指定的进程
awk #操作字符数据
$$ #当前进程的PID
tmp_sh.sh # 测试shell脚本 在shell中 定时kill到超时的子进程


获取父进程的pid
$ ps lx|awk '/ps lx$/{print $4}' # 查看当前进程的父PID
ppid=`ps lx|awk '/ps lx$/{print $4}'`
$(date -u;sleep 120m;date -u;)& #创建一后台运行的任务
$ ps lx #查看当前运行的进程
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
0 503 8500 8499 16 0 4492 1408 wait Ss pts/1 0:00 -bash
1 503 8556 8500 16 0 4492 1408 wait S pts/1 0:00 -bash
0 503 8558 8556 16 0 3904 556 - S pts/1 0:00 sleep 120
0 503 8561 8500 17 0 4420 708 - R+ pts/1 0:00 ps lx
#查看根任务的子任务列表
$ ps lx |awk 'BEGIN{ps[8500]="root";}{if($4 in ps){ps[$3]=$13;}}END{for(i in ps){print i ":" ps[i];}}'

tmp_sh.sh # 测试shell脚本 在shell中 定时kill到超时的子进程
-----------------------------------------------------------------------------------------------
# fallseir.lee (fallseir@gmail.com ,http://feed.feedsky.com/fallseir)
# -20060620 17:08
# 获取当前的进程PID
ppid=$$;
##
# 将满足条件的子进程kill掉
##
function kill_subs(){
# 打印所有进程并输出满足条件的进程ID
ps lx|awk '
BEGIN{
ps['$ppid']="root";#设置父进程ID
}
##
# 判断当前进程是否为kill的进程
# pid 进程ID
# w 进程启动的shell命令名称
# t 进程执行的时间 hh:mm
##
function is_kill(pid,w,t){
split(t,arr_t); # 分离hh:mm时间的时间格式以便用于计算
# 测试规则 将所有存在的wget进程标记为kill进程
if(w=="wget" && (arr_t[0]>0 || arr_t[1]>=0)){
return 1;
}else{
return -1;
}
}
{
# 设定使用的参数
ppid=$4; # 当前行的父进程ID
pid=$3; # 当前行的进程ID
w=$13; # 当前行的shell命令
t=$12; # 当前行的shell命令执行时间

if(ppid in ps){ # 如果父进程ID在ps列队里,只有子进程别操作
ps[pid]=t; # 将当前进程id添加到ps列队
if(is_kill(pid,w,t)>0){ # 如果当前进程满足kill条件
ks[pid]=w " " t; # 加入到ks列队
}
}
}
END{
# 输出kill名令,kill掉ks列队里的PID
for(i in ks){
print "kill " i;
}
}'
}
##
# 判断是否有worker在工作
##
function is_working(){
# 打印当前进程列队并查看是否有当前进程的子进程中的worker数量
ps lx|awk '
BEGIN{
ps['$ppid']="root";
}
function is_work(w){
# 假设 worker 的 shel l命令为 wget 和 awk 命令
if(w == "wget" || w=="awk"){
return 1;
}else{
return -1;
}
}
{
ppid=$4;
pid=$3;
w=$13;
t=$12;
if(ppid in ps){
ps[pid]=t;
if(is_work(w)>0){ # 将 worker 放入 ws 列队
ws[pid]=w " " t;
}
}
}
END{
c=0;
for(i in ws){ #计算worker数量
c++;
}
print c; #打印worker数量
}'
}

## --- work ---
# -- 创建 worker 的工位
mkfifo $$.test # 以当前进程ID构建管道
exec 3<>$$.test # 将管道已读写方式连接到3号流
rm $$.test # 删除构建的管道,当需要的流建立后 之前建立的管道已无用
# 建立5个工作者的位置
for((i=0;i<5;i++))
do
echo i>&3;
done
# 在后台进行100个数量的wget任务
(for((i=0;i<=100;i++))
do
read t; # 获取一个工作的位置
(r=$(wget "http://feed.feedsky.com/fallseir" --timeout=3000 --spider 2>&1 |cat);
# 判断wget的执行结果是否成功
r=$(echo $r|awk 'BEGIN {r=-1;} {if(/200/){r=1;}} END{print r;}') ;
if( [ "$r" == "1" ] )
then
echo "# $t $i";
else
echo "- $t $i";
fi;
# 任务完成后归还工作位置
echo $t >&3;)& # 任务在后台进行
# 设定 for 范围中默认从3号流读取数据
done <&3)&
while [ "1"="1" ] # 建立 killer 监听进程
do
kills=`kill_subs`;
echo $kills; #输出要被kill的进程
$kills # 执行kill 操作 #kill_subs|sh;
if([ "`is_working`" -gt 0 ]) # 如果还有worker在工作 sleep 5 秒钟
then
#echo `is_working`
echo "killer sleep 5 s";
sleep 5s;
else # 如果没有 worker 在工作 退出killer 监听
#is_working;
echo "killer end `date -u`";
break;
fi
done

echo "wait sh end `date -u`";
wait; # 等待所有自进程结束
exec 3<&- # 关闭 3 号流
echo "end `date -u`";




--
[:p] --飞扬.轻狂 [fallseir.lee]
http://fallseir.livejournal.com
http://feed.feedsky.com/fallseir

星期一, 十一月 27, 2006

Code:简单的服务器端发送http请求

Tag:php,rpc,socket,post

因为手里需要所以简单的写了点点,但没有对后期数据进行处理,也没有加异常处理
先用之,再改进...

$remove_url="http://localhost/worktest/test_server.php";
// Create the client object
$client = new SRPC_Client($remove_url);
$client->debug=true;
// Run a query for PHP
if (!$client->call("http://feed.feedsky.com/fallseir")) {
die('Something went wrong - '.$client->getErrorCode().' : '.$client->getErrorMessage());
}

// Display the result
echo '
';
print_r($client->headers);
print_r($client->contents);
echo '
';

class SRPC_Client{
var $server;
var $port;
var $path;
var $useragent;
var $debug;
var $error;

var $contents;
var $headers;
function SRPC_Client($server, $path = false, $port = 80) {
if (!$path) {
// Assume we have been given a URL instead
$bits = parse_url($server);
$this->server = $bits['host'];
$this->port = isset($bits['port']) ? $bits['port'] : 80;
$this->path = isset($bits['path']) ? $bits['path'] : '/';
// Make absolutely sure we have a path
if (!$this->path) {
$this->path = '/';
}
} else {
$this->server = $server;
$this->path = $path;
$this->port = $port;
}
$this->useragent = 'The simple RPC PHP Library';
}
function Call($content){
$r="\r\n";
$length=strlen($content);
$request = "POST {$this->path} HTTP/1.0$r";
$request .= "Host: {$this->server}$r";
$request .= "Content-Type: text/xml charset=utf-8$r";
$request .= "User-Agent: {$this->useragent}$r";
$request .= "Content-length: {$length}$r$r";
$request .= $content;
// Now send the request
if ($this->debug) {
echo '
'.htmlspecialchars($request)."\n
\n\n";
}
$fp = @fsockopen($this->server, $this->port);
if (!$fp) {
$this->error = array(-32300, 'transport error - could not open socket');
return false;
}
fputs($fp, $request);
$contents = '';
$gotFirstLine = false;
$gettingHeaders = true;
$headers = '';
while (!feof($fp)) {
$line = fgets($fp, 4096);
if (!$gotFirstLine) {
// Check line for '200'
if (strstr($line, '200') === false) {
$this->error = array(-32300, 'transport error - HTTP status code was not 200');
return false;
}
$gotFirstLine = true;
}
if (trim($line) == '') {
$gettingHeaders = false;
}
if (!$gettingHeaders) {
$contents .= trim($line).$r;
}else{
$rawheaders .= trim($line).$r;
}
}
fclose($fp);
if ($this->debug) {
echo '
'.htmlspecialchars($contents)."\n
\n\n";
}

preg_match_all('/(.*?): (.*)\r/', $rawheaders, $matches);
$count = count($matches[1]);
for ( $i = 0; $i < $count; $i++) {
$key = strtolower($matches[1][$i]);
$headers["$key"] = $matches[2][$i];
}
preg_match('/.*([0-9]{3}).*/', $rawheaders, $return);
$headers['response'] = $return[1]; // HTTP response code eg 204, 200, 404
$code = $headers['response'];
/** if ( ('302' == $code || '301' == $code) && isset($headers['location']) ) **/
$this->rawheaders=$rawheaders;
$this->headers=$headers;
$this->contents=$contents;
return true;
}
}

星期五, 十月 27, 2006

摘录:Bash中对变量的操作&特殊字符

Bash中对变量的操作 原文
本文出自:http://www.ytht.org 作者:chenhao (2001-10-29 07:00:00)

1.条件变量替换:
Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换
条件放在{}中.
(1) ${value:-word}
当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值.
(2) ${value:=word}
与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将
word赋值给value
(3) ${value:?message}
若变量以赋值的话,正常替换.否则将消息message送到标准错误输出(若
此替换出现在Shell程序中,那么该程序将终止运行)
(4) ${value:+word}
若变量以赋值的话,其值才用word替换,否则不进行任何替换
(5) ${value:offset}
${value:offset:length}
从变量中提取子串,这里offset和length可以是算术表达式.
(6) ${#value}
变量的字符个数
(7) ${value#pattern}
${value##pattern}
去掉value中与pattern相匹配的部分,条件是value的开头与pattern相匹配
#与##的区别在于一个是最短匹配模式,一个是最长匹配模式.
(8) ${value%pattern}
${value%%pattern}
于(7)类似,只是是从value的尾部于pattern相匹配,%与%%的区别与#与##一样
(9) ${value/pattern/string}
${value//pattern/string}
进行变量内容的替换,把与pattern匹配的部分替换为string的内容,/与//的区
别与上同

注意:上述条件变量替换中,除(2)外,其余均不影响变量本身的值


2.变量的算术运算
在Bash Shell中,只能进行两个整数间的运算,其结果仍为整数.要进行算术
运算,需要使用let命令,语法为:
let expr
expr是一个包含项和操作符的表达式,项可以是一个变量或是一个整数常数,
当使用整数常数时,其默认为十进制整数,用户可以用radio#number来指定其它
形式的整数,其中radio定义了整数是几进制表示的,number是该整数的值.若
radio>10,那么数字字符可从0-9和A-Z.
在表达式中支持的操作符及其含义为:
+,-,*,/,% 加,减,乘,除,取模
>>,<<,&,^,| 左移,右移,位与,位异或,位或
?: 三元运算符.与C语言中的定义一致
~ 取补码
!,>=,<=,>,<,==,!=,&&,||
=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
表达式式中也可以使用括号.括号或运算优先级的定义与一般计算机语言中的
相同.
let命令具有返回值.当计算结果(若有多个表达式时,以最后一个为准)为0时,
返回值为1,否则为0.
当表达式中含有shell的特殊字符(如|)时,需要用引用符('或")将其引用起来.
使用let时还需要注意的时,对于let x+y这样的式子,shell虽然计算了x+y的值
但却将结果丢弃,若不想这样,可以使用let sum=x+y将x+y的结果保存在变量sum中
另外还可以使用((和))操作符取代let命令,而且这样的话,还可以省去对算术
表达式的引用,如果想返回表达式的值,则需用$(())的格式.

Bash中的特殊字符

Bash中的特殊字符 本文出自:http://www.ytht.org 作者:chenhao (2001-10-28 13:05:01)
1.通配符
* 匹配任何长度的任何串
? 匹配单个字符
[...] 匹配单个括号内的字符,[]中的-,!具有特殊含义,如:
$ echo [a-z]*
显示首字母在a-z范围内的文件或目录名
$ echo [a,b]*
显示首字母为a或b的文件或目录名
$ echo [!a]*
显示首字母不为a的文件或目录名(使用!时,!必须是[后的第一个字符)
!还可与-和,一起使用

在Bash 2.0以后的版本中,若用shopt打开了extglob选项(shopt -s extglob),
那么还可以扩展的模式表达式(模式表达式是指那些包含了一个或多个shell通配
符的字):
*(pattern [|pattern] ...) 匹配模式的零次或多次出现
+(pattern [|pattern] ...) 匹配模式的一次或多次出现
@(pattern [|pattern] ...) 匹配模式的一次出现
?(pattern [|pattern] ...) 匹配任何一个模式.与*不同的是它不匹配
多个模式或模式的重复出现
!(pattern [|pattern] ...) 与?类似,不过是不包括指定模式的串
应该注意到,模式表达式的定义是递归的,每个表达式都可以包含一个或多个
模式,而且模式表达式也是可以嵌套的.

2.数据或程序控制使用的特殊字符:
主要有:
< (file) 输出重定向到文件
>> (file) 输出重定向到文件,内容加到已存在的文件尾部
< (file) 输入重定向到文件
; 命令分隔符
| 管道符,把一条命令的输出重定向为另一命令的输入
& 放在命令之后强迫命令在后台执行
`` 命令替换,重定向一条命令的输出为另一命令的参数

3.用于引用和逃逸的特殊字符:
逃逸符\ 表示以后的字符不具有特殊的含义或不是Shell的函数,
除此之外,Bash还可以识别一些C语言中的转义序列,如:
\a 响伶
\b 回退
\e Escape
\n 换行
\r 回车
\t 制表
\v 制表
\\ 反斜线
\nnn 八进制的ASCII编码
\xnnn 十六进制的ASCII编码
但必须以如下方式进行引用:
$'string'
引用符'和" 将特殊字符或由空白分隔的字引用起来组成一个简单字符串
两者区别在与,双引号内的内容可以进行参数和变量替换

怎样通过shell解析文件中的变量
原文
[xyb@linux xyb]$ echo name=xyb > id.txt
[xyb@linux xyb]$ echo age=xx >> id.txt
[xyb@linux xyb]$ eval $(cat id.txt | grep name=)
[xyb@linux xyb]$ eval $(cat id.txt | grep age=)
[xyb@linux xyb]$ echo $name
xyb
[xyb@linux xyb]$ echo $age
xx
[xyb@linux xyb]$

#! /bin/sh
name=`grep -e '^name=' YOURFILE | sed -e 's/^name=//g'`

星期四, 十月 26, 2006

摘录:shell常用指令收集

shell常用指令收集

awk 是一种方便的面向行的文本处理语言。
cat 将指定为参数的文件内容打印到终端。作为管道的第一个命令,这是很方便的,例如,cat foo.txt | blah。
cut 从输入文件或流的每个行上抽取出由字符限定的字段。
expand 将输入制表符转换为空格。使用 -t 选项来指定制表符停止位。
fmt 对段落重新格式化以便在其边缘处进行换行。这个能力被构建到大多数文本编辑器中,但是应知道它仍是一个好工具。
head 打印出文件或流的前十行。使用 -n 选项来指定应显示的行数。
join 与 paste 类似,但它在每个输入行中使用一个字段(缺省情况下是第一个字段)来匹配一在单行上合并的字段。
nl 将行号添加到输入的每个行上。这对于打印输出很有用。
od 将输入流转换为八进制或十六进制的“转储”格式。
paste 获取两个或更多文件作为输入,连接输入文件上的每个后续行,并输出结果行。它对于创建文本的表或列是很有用的。
pr 将文件分解为多个页面的输出;通常用于打印。
sed 是一个功能强大的面向流的文本编辑器。
sort 按字母次序打印在命令行上指定的文件内容。当然,sort 也接受用管道传送的输入。输入 man sort 来熟悉控制排序行为的各种选项。
split 将较大的文件拆分成许多较小、更易处理的块。
csplit 也是拆分文件,和split不同的是,新文件的名字可以用pattern来控制
cat 可以将这些小文件合并为分割前的文件
tac 与 cat 类似,但它以逆向顺序打印所有行,换句话说,先打印最后一行。
tail 打印出文件或流的最后十行。使用 -n 选项来指定应显示的行数。
tee 将它的输入打印到文件和屏幕。当您想创建某些日志记录,但还想在屏幕上看时,这很有用。
tr 是字符转换工具;它用来将输入流中的某些字符映射成输出流中的某些其它字符。
unexpand 将输入空格转换为制表符。使用 -t 选项来指定制表符停止位。
uniq 获取已排序的文件或数据流(通过管道)并除去重复行。
wc 打印出指定文件或输入流(来自管道)中的行、字和字节的数量。输入 man wc 来学习如何精调显示的内容。
cmp -- 判断两个文件内容是否一样。
diff -- 详细输出两个不同文件的差别。
diff3,可以比较三个文件

comm 比较两个排好序的文件
fold 按指定的宽度把文本文件换行
basename 去处前导的目录后的文件或目录名
echo 打印字符串
env 打印环境变量
expr 数学表达式计算
expr 还可以在指定的字符串中查找特定的子串
false 设置返回值为1
true 设置返回值为0
pwd 打印当前目录名
seq 打印指定步进值的数字序列,整数浮点数都可以
sleep 让当前进程休息一会儿
uname 打印一些重要的内核信息
yes 不停打印指定字符串,缺省为y

grep is a very powerful search tool.
find / -name 'linux*' | grep -E 'linux'

echo "" > filename # 创建文件,文件中包含一个空行 echo默认输出一个换行符
echo -n "" >filename # 创建空文件
touch filename # 创建空文件 'touch' changes the timestamp of a file and creates one if it doesn't exist.
cat /dev/null >filename # 创建空文件
> file #创建空文件
cp /dev/null filename #创建空文件



--原文