计时运行命令

见过好几个人问怎样可以计时运行某一个命令?比如我可能想运行某个交互式的命令(像fdisk),但我又不想让它一直永远等待输入,我就得给它指定一个时间,若没有输入则自动退出。

我之前也遇到过这个问题,当时找到的是timed-run。而最近我发现coreutils里面已经默默包含了一个等价的命令——timeout。

timed-run来自expect包,很明显是用expect脚本写的:

% cat /usr/bin/timed-run
#!/bin/sh
# 
exec expect -f "$0" ${1+"$@"}
# run a program for a given amount of time
# i.e. time 20 long_running_program

set timeout [lindex $argv 0]
eval spawn [lrange $argv 1 end]
expect

而timeout则来自coreutils,应该是用C写的。它们的用法都一样,后面第一个参数是指定的时间,在后面就是要运行的命令,比如:timeout 1 sleep 10。timeout还能接受一些选项,更强大一些。

有舍才有得

前一篇文章下面的留言我都看了,很感动,谢谢你们的关心和理解!

这些天也收到好些邮件,接到好几个电话,上网也有很多朋友和我聊天,收到了来自湖南长沙、四川成都、广东深圳、海南三亚的朋友的邀请,都说,你来吧,有你吃的也有你住的!也有上海和杭州的朋友给我介绍工作的。你们对我的好我都一一记得,有机会也一定要当面感谢!我想去的那个地方允许我暂时保密,等我到了那里你们自然就会知道了。:-)

这两天也和公司里我的两个经理聊了聊,他们都问我以后有什么打算。我说要是有机会肯定还是会找和Linux相关的工作,这是毋庸置疑的,但是找不到我也不担心,总会有别的工作我会喜欢,或者干脆就当一个自由职业者。以后挣得钱或许会少了,但是我本来就要求不多,能够我自己花的,还能给父母寄一些,对我来说就已经足够了。

你要是问我会不会放弃现在做的这些?当然不会。我很喜欢我现在做的东西,引以为豪,它们已经是我生活中的一部分了。而且这些东西都是开源的,并不会因为我的正式工作是什么而有太大的改变。

我觉得,既然我决定离开北京去寻找一种更好的生活,那么我同时也必须放弃些什么,有所舍才能有所得。这很公平,不是吗?所以我从不担心失去工作会怎么样,因为“上帝为你关上一扇窗时,就会为你开启另一扇窗。”离开北京未尝不是一种机会,一种希望。那首歌里唱得好:“之所以活得洒脱是因为懂得取舍!之所以淡漠是把一切都看破!”

我很喜欢ogmw的那句留言:

内心强大,坚定并且总能保持平静的人是美的,因为犹豫不定,懦弱而产生欺骗,躲闪,那样的人和事都很丑。
(请问这句话是吴虹飞说的吗?^_^)

我还要加上《恋爱的犀牛》里面那句:“上天会厚待那些勇敢的、坚强的、多情的人。

别的不敢说,做人方面咱绝对是很优秀的,说到做到,敢做敢当,从不亏欠别人什么。那些懦弱的,虚伪的人和咱一比,很丑,真的!

不过了!!!

考虑了很久,我决定要离开北京了。

这些日子憋了一肚子的委屈,都是生活上的事儿,付出那么多换来的只有误解和伤害。这些日子里见识了人的各种虚伪、狡猾、背信弃义,真是大开眼界。压抑了太久,我真的受够了,不过了!

来北京快两年了,在这里认识了很多的朋友,谢谢你们陪我度过这些日子。北京这种地方确实不适合生活,空气污染不说,四万一平不说,严重的物质化和城市化让我感到窒息,在这种环境里很容易迷失自己,所以我决定要走,去西部、去南方、去国外……去任何我想去的地方!世界之大,还能没有我一个容身之处?

给爸妈打了个电话,说我要离开北京,他们没有任何反对,只问了我为什么、怎么了,说心情不好就回家。在大街上我强忍住没哭出来。我知道,就算整个世界与我为敌他们也会站在我这边。对不起,儿子不孝,实在是不得以而为之!

给几个朋友打电话,说我要是没工作了去你那讨口饭吃给不给?都说没问题,看来这些人还是比较靠谱的!

我决定了,过完年回来就把工作上的事儿交接好之后就走,去南方的某个心仪已久小城市,先放松一下心情,然后或许再找一份工作,或许去探索另一种新的生活方式。

我只是像梵高那样渴望生活!

分享一些 shell 函数和 alias

省略掉公司内部用的一些东西。其中的calc()和isdigit()是从网上抄来的。:-) 希望对你有用。

[bash]
alias gts=”git send-email —cc-cmd=’./scripts/get_maintainer.pl —norolestats’ —to linux-kernel@vger.kernel.org —smtp-server XXXX”
alias v=”vim -O”
alias e=”emacs -q -nw”
alias wpas=”wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf -B”
alias mutt=”LC_ALL=zh_CN.UTF-8 mutt”
alias wget=”wget —no-check-certificate”

function calc () { awk “BEGIN{ print $* }” ;}

function isdigit ()
{
[ $# -eq 1 ] || return 1;

case $1 in
[!0-9]|””) return 1;;
*) return 0;;
esac
}

function errno ()
{
if [ “$#” -eq 0 ]
then
echo “Usage: errno [ERRNO | N]”
return 1
fi
pattern=$1
if isdigit “$pattern”
then
msg=”$(awk ‘$3~// {print $0}’ /usr/include/asm-generic/errno-base.h /usr/include/asm-generic/errno.h)”
else
msg=”$(awk ‘$2~// {print $0}’ /usr/include/asm-generic/errno-base.h /usr/include/asm-generic/errno.h)”
fi

if [ -z "$msg" ]
then
    echo "BAD ERRNO!"
else
    echo "$(echo "$msg" | sed -e 's#.*/* (.*) */#1#g')"
fi

}

function kcgrep ()
{
local dest
local str
if [ -z $2 ]
then
dest=”.”
else
dest=”$2”
fi
str=$(echo “$1” | sed -e ‘s/^CONFIG_//‘)
find “$dest” -iname ‘kconfig*’ -exec grep “$str” -nwH ‘{}’ ;
}
[/bash]

从 grep 的用法说起

我本不想写这篇文章,首先我觉得这些东西大家肯定都知道,其次就算真不知道还有手册。

直到那天面试的时候我碰到一个哥们,我问他grep你都知道哪些选项?他告诉我,只有-r。我当时就乐了,既然grep是你常用的命令,你凭什么只知道-r?他回答说,他只想把精力放到内核上,没有时间来学习这些东西。我笑,正是因为你没有时间,所以你才应该提高你的工作效率,而熟悉命令行显然是Linux上一种提高工作效率的方式。有句老话说得好:“磨刀不误砍柴功。”

有的同学可能觉得我在提倡死记硬背了,事实上我比你更反对中国教育的那种死记硬背。我的观点很简单:既然你用得多,那么有些东西,比如grep的一些选项,自然而然就应该记住了,无须刻意去背。

所以,我在这里以grep为例来展示一下。注意,以下内容没有参考一眼grep的手册。

grep最常用的选项可能是-i,-n和-r了,至少于我如此。-i是忽略大小写,-n可以告诉你找到的东西在文件的哪一行。-r或者-R(看你愿不愿意多按个shift键了),可以去递归一个目录。

-A和-B,你可能就用的比较少了,前者制定显示匹配到的那一行之后的几行,后者指定之前的,比如grep -A 3 -B 4就是说也要显示匹配到的那一行之前的4行和之后的3行,可见A是After,B是Before。用得着刻意去记嘛?显然不用。

-I(大写i)可能用得就更不多了,可惜啊,它非常有用。比如你编译出的内核二进制和你的源代码在同一个目录时,你grep一些字符串的时候会发现一些.o文件中也可以找到,很明显它不是我们想要的,这时候-I就派上用场啦!它告诉grep去忽略二进制文件。

这让我想到了另一个—exclude(我记得似乎没有短选项与之对应),顾名思义,它是用来排除一些文件。比如你编译的内核目录下还有.cmd这种文件的话,它不是二进制,所以-I排除不掉,这时候你就可以用—exclude “.cmd”了。

-H,这个用得更少了,你一般不会需要它,因为grep默认就会输出文件名。然而,当grep与find联手的时候就不会了(至于为什么,留给你作为课后作业),这时候你就要用到-H了。比如,我在内核源代码目录下查找CONFIG_DEBUG_KMEMLEAK定义在哪,我通常这么做:find . -iname ‘kconfig*’ -exec grep -Hwn DEBUG_KMEMLEAK ‘{}’ ;

我上面用到了另一个选项-w,看见了嘛?它可能是另外一个被严重忽视了的选项,仅次于-I啊!它的意思是告诉grep我所查找的是一个完整的单词,也就是说,当你找DEBUG_KMEMLEAK的时候它不会给你找出DEBUG_KMEMLEAK_EARLY_LOG_SIZE,你懂的。这可以省去你手工去加b了。

噢,我差点儿忘了亲爱的-e,多数情况下你也不需要它,因为grep后面接的就是一个regrex嘛!-e神马时候派上用场呢?我建议你在这里仔细想想,一个很特殊的情况——我要搜索的字符串以”-“开头时!比如我要搜索”-wangcong”这个字符串,直接grep “-wangcong”显然是不行滴!grep会认为那是”-w -a -n -g -c -o -n -g”,无论你怎么加引号!一种解决方法是加反斜线,而另一种方法就是-e “-wangcong”了。顺便说一句,使用多次-e就相当于进行一个“或”操作,所以grep “vmx|svm”就等价于grep -e vmx -e svm。

-o我估计用的人也不多,它的意思是只输出匹配到的东西,同一行的其它东西不输出。例如,我想搜索printk.c中全部的C语言字符串时,我会这么做:grep -o ‘“.*”‘ kernel/printk.c,有点儿类似于strings kernel/printk.o。

-b,知道这个人的灰常少了吧?如果你知道,恭喜你晋级grep高手级别了!我承认我只用过它一次,是在一个脚本中,我想知道某个“字符串”出现在文件的第几个字节。我印象中这里是有bug的,因为我当时总得不到正确的结果,当然也有可能是我理解不对,没看手册而且没有再次实验,所以这个问题就留给你了。:-)

-q嘛,大家都知道,脚本中常用。

-c嘛,比如统计CPU个数:grep -c ‘^processor’ /proc/cpuinfo,实在没必要多一个管道去 grep ‘^processor’ /proc/cpuinfo | wc -l。

好了,我就想起来这么多了,欢迎补充。我觉得一个好的Linux程序员应该对他/她敲出的每一行命令的每一个选项都精益求精,不多不少。

我知道有些人对此不屑一顾,嗤之以鼻,我只想告诉这些人一句话:“天下大事必做于细,天下难事必做于易。”你要是认为我这是在教育你,你就错大了,我对教育人,尤其是教育你这种人,没任何兴趣!你倒找给我钱我都不会稀罕去教育你!有他妈的多远给我滚他妈的多远!

附我窜改的《见与不见》:

你知,或者不知它/命令就在那里/不悲不喜

你看,或者不看它/手册就在那里/不来不去

你爱,或者不爱它/程序就在那里/不吵不闹

你用,或者不用它/二进制就在你的机器上/不亢不卑

去了解它们/或者/让它住进你的心里

人机合一/融为一体

我圆了一个环岛梦

每次旅行回来都积攒一堆未读的邮件,所以回来之后的首要任务是看邮件,而且一回来就有各种饭局,这就是导致我欠下那么多篇游记的原因。小公子说,这次必须写,我就简单写写吧。没仔细理什么头绪,想到什么写什么。

我自行调整了行程,实际行程如下:

12月24号,Day 1:接车子,装码表,休息
12月25号,Day 2:三亚——天涯——崖城——黄流——板桥 (约130公里)
12月26号,Day 3:板桥——东方——太坡——昌江 (约100公里)
12月27号,Day 4:昌江——雅星——儋州——中兴镇 (126公里)
12月28号,Day 5:中兴镇——澄迈——海口 (94公里)
12月29号,Day 6:海口——灵山——三江——大致坡——潭牛——文昌——清澜镇 (100公里)
12月30号,Day 7:清澜镇——迈号——会文——长坡——嘉积——博鳌——琼海 (105公里)
12月31号,Day 8:琼海——龙滚——万宁——兴隆——陵水 (130公里)
1月1号,Day 9:陵水——英州——亚龙湾——三亚 (约100公里)
1月2号,Day 10:返回北京

第4天之所以切到中线去中兴镇是因为西线的路太差了,到处在修路,看我拍的照片就知道。

码表是在三亚装的,回到三亚之后显示941公里,除去从琼海到官塘之间白骑的一个往返20公里,除去在三亚市内骑的20公里左右,实际总路程约为900公里。

第2天路上吃午饭时碰到两个湖南的大妈,都60多岁了,还在骑车环岛,而且她们是先东线从海口到三亚,再走中线北上,然后从西线回三亚,比我骑得还多呢!所以,年轻人啊,你怎么好意思说自己做不到呢?

前6天都是我自己一个人骑,出了海口之后遇到好几个和我反方向的,直到第7天上午,出了琼海之后才遇到3个同方向的哥们。他们是从广州过来的,从海口骑到三亚就回去了。

关于路况:西线正在修路,路况很差,包括高速。从板桥到东方一路基本上都是石子路,而且上坡,而且逆风。过了东方之后路就修好了,不过迎接你的是一个又一个的连续上下坡,这种情况一直持续到过了海口。其实后面一路也都有连续的上下坡,只是没前面那么多了。东线除了偶尔有几段不太好骑,总体是非常好的。

因为我出发之前看的攻略都是说顺时针环岛,但路上碰到不少逆时针骑的,所以我在想是不是逆时针会比较容易些?我感觉除了从天涯到东方那一段,其它的路基本上都是连续上下坡或者平路,不会容易多少。

出发之前听从了tanyp的建议,把车胎换成了光头胎,确实是一个正确的选择。一路上没有爆胎,车子也没出任何问题,运气不错。

一路都在住店,没带帐篷无法扎营。其实清澜镇附近有个叫东郊椰林的地方,非常漂亮,也非常适合扎营,而且第二天起来还可以看日出,有条件的可以考虑。

住宿花费:从三亚出发后,第一天住板桥,40¥;第二天住昌江,50¥;第三天住中兴,40¥;第四天住海口,45¥;第五天住清澜镇,50¥;第六天住琼海,40¥;第7天住陵水,40¥;第8天下午抵达三亚。在三亚住了两天,出发之前的那天是40¥,等回去之后正好赶上元旦,所有旅馆都涨价,最后只找到一个70¥的。总计:415¥。

至于吃嘛,路上那些小地方吃的真不多,估计当地人很少出来吃,有也多是那种大排档,所以吃一顿饭也就10~20块钱之间。

来到这里才知道,当地人把东方市叫作八所,它前面有个地方叫九所。澹州市的市中心当地人叫那大。问路请以当地人的叫法为准。

像我这种出门不带GPS的人,找路基本上靠问。而我遇到的海南人都很热心,不管是问路还是住宿,所以海南人给我的印象真的不错。不像某个要建设成为国际都市的城市,问个路都故意给我指反,我就不点名了,免得说我地域歧视。

记得在嘉积的时候,我向一个扫马路的老大爷问路,他自己不是很清楚又去帮我问别人,然后仔细给我解释,直到我弄明白为止;路过东方的时候,路边的西瓜摊的大姐,给我打开西瓜之后看到这个西瓜里面有一部分熟过了的(其实也不多),本来是2块钱的只收我1块钱;在琼海的时候,早上吃早饭,老板看到我一身骑行的打扮,主动和我聊起骑车的经验,告诉我他有三辆车子;其实一路上有不少人看到我这身打扮之后就问我是不是在环岛……

所以回来之后别人问我这一路上安全吗,我都肯定地回答,很安全。

海南到处都有卖椰子的,一般4块钱一个,每次喝得我都很撑,喝完还可以让老板给切开吃椰子肉。有的地方还有冰冻的椰子,中午热的时候喝一个很爽。

海南最好吃的是清补凉,里面放了好多东西,怪不得那么多姑娘喜欢吃。我也很喜欢吃。而且北京似乎没有卖的。

海南的小吃除了那四个有名的,还有抱罗粉,腌粉,我就知道这些了。

海南本地的烟是椰王,16块钱一包,其实也是红塔出的。

所有花费:石家庄往返三亚的机票加税1080¥;北京往返石家庄动车170¥;自行车装码表、装车头灯200¥;自行车从北京寄到三亚,285¥,寄回来175¥;住宿一共花费415¥;路上吃饭,以及在三亚时请别人吃饭大约600¥;买其它东西,包括门票等,约140¥。总计:3065¥。

一路上感觉最疲惫的时候是到达中兴镇的晚上,当天为了赶路骑了一个小时的夜路才到,孤独四面袭来……

从博鳌回琼海的时候遇到当地的一个骑车的哥们,和他聊了两句,我告诉他我是在自己骑车环岛,他向我伸出了大拇指,说:哥们你真是条汉子!

其实,只要你下定决心出发,就已经成功了一半了。

“我独自一人,感动了所有的风和日丽。”

(照片在这里。)

活在自己的梦里

我之前从没读过三毛的书,只是一个很偶然的机会发现了这一本。去海南的时候想带两本书上路,选来选去,发现只有这本最适合旅途上读,于是在飞机上就把它读完了。

我本并不喜欢三毛的文字,她的文字没有张爱玲那种华丽,可却多了几分朴素,多了几分不羁,让我边读边感慨:好一个疯女人!

书中最让我感到惊讶的是描写她幻想的自己的前世,原来她也相信人有今生前世的轮回。更让人吃惊的是,她竟然在厄瓜多尔找到了前世的那个自己!难怪她走遍了那么多国家,难怪她要那么执着地去南美洲!

读到后面描写她自己重返故乡时,她一直把自己当作是林妹妹。我以为她大抵是读红楼着了迷,才有如此娇揉造作的文字。其实我错了,读了她的生平介绍我才发现,她原来一直孤独地活在自己的梦里!疯疯癫癫,如痴如醉……突然有一天,梦醒了,发现自己身处一个陌生的世界,于是绝然离去,去做一个永远也醒不来的梦!

今天正好是三毛去世20周年,特写此文以作纪念。与君相见恨晚。

“红尘十丈,茫茫的人海,竟还是自己的来处。”

我只是比较拧巴

虽然有自吹自擂的嫌疑,我在很多朋友眼中都算是一个好人,用一个小姑娘的话说是“好人卡拿好”。就算是有时候我故意和你们开玩笑,显得我有多坏,但你们也应该能明白,我就是在严肃认真地逗你们玩儿,并不是真心那么想。我承认,有时候玩笑确实开得有点儿过分,希望你们不要介意,我只是想逗你们开心而已,无意冒犯。

可能有些人觉得我老爱请客吃饭,其实不是,我只是觉得你给我的帮助总得通过某种形式回报一下,请你吃饭是我想到的比较好的办法。其实,我可能比你们谁都勤俭节约,平时自己吃一顿饭基本上都控制在10块钱左右,钱包里经常剩下不到10元钱。这和挣钱多少没关系,就算是我哪天能有月薪10万,我还是会喜欢去路边麻辣烫,照样会去小摊上买3块钱一个的煎饼果子,依旧会在夏天光着膀子去吃路边的大排档。你要是真拉我去吃金钱豹,我还说不定享不了那福呢!虽然我平时吓唬你们的时候总是说“你请我们去吃金钱豹吧”。

哪个朋友说借钱,我几乎都不带犹豫的,只要有马上借给他/她。说到借钱,这是比较头疼的事儿。借给那些自己主动还的没问题,谁能没个需要钱的时候,做朋友帮你是我分内的。可是借给那些不主动还的人问题就来了。我要是不借给你吧,我一对不住你,二对不住我自己的良心;我借给你吧,你又不知道主动还。我跟你要吧,显得我跟黄世仁似的,而且还会破坏我们之间的友谊;我要是不跟你要吧,这钱好歹说也是我挣的,不是偷的不是抢的,而且我爸又不是李刚,直系亲属中又没有副省长,还没富到不在乎这些钱的程度。

除了开玩笑的时候,我是那种不善言辞的人,越是严肃的时候越是如此,因为我觉得说一百句好听的话也不如做一件实际的事儿顶用,所以有时候也会有人不理解我。其他人不理解也就罢了,我压根也不指望也不稀罕他们能理解,可是有些时候就连和我关系很不错的人也不理解我,我感到很委屈。我一赌气,干脆就想:这好人我当腻了,还不如他妈的当个坏人呢!当坏人起码做了坏事儿心安理得,内心不用受折磨。我就他妈的不借给你钱怎么的吧,我就他妈的不帮你怎么的吧!这只是气话,发泄发泄而已。

我觉得正是因为我对人坦诚,才会有那么多的朋友。比如这次要去海南岛,我就收到好几个朋友关心和帮助,尤其是tanyp,主动发邮件给我很多骑车的建议,非常感动。要知道我们素为谋面,只是在网上认识的都喜欢骑车的朋友。还有以前认识的一个驴友瓶子,仅见过一次面,好久没联系了,这次得知我要去海南,主动联系我,帮我打听那边的路况,告诉我西线在修路,路上尘土比较大,还留给我一个在海南的她的朋友的电话说有问题去找他。

所以我就在想,我到底何得何能值得这么多朋友关心?有时候感觉非常羞愧。你们对我的好我都一一记得,有机会也会一一去还。目前我能报答你们的就是,不让你们失望。:-)

我这个人不坏,基本无害,只是有时候比较拧巴。你们大抵不必和我较真。

kdump 介绍

今天在公司内部讲了一下自己工作中做的kdump,都是开源的东西,没什么机密,所以拿出来和大家分享一下。Slides可以在这里下载

准备这个slides没花费我多长时间,画里面那三张图倒是花费了我好几个小时。没有功劳也又苦劳啊。T_T

看完之后起码你能明白为啥我说这个工作是又脏又累了,整天修一些蛋疼的bug。每一个自己做initrd的人上辈子都是折翼天使!而做kdump的initrd的人连上上一辈子都是折翼天使!

以后我可能还会讲其它和Linux内核相关的一些有趣的东西,讲完之后会陆续在这里和大家分享。

你是我今生不死的欲望

在多数朋友眼中,我是一个乐观上进的好青年,嘻嘻哈哈没脾气,经常爱开各种玩笑,荤素搭配。就算是有人伤心难过,我通常也是充当安慰别人的角色。

你们都以为我就没有伤心没有难过的时候?我也有,只是你们没看到。我疲惫的时候未尝不想找个人坐一起说说话,聊聊天;我难过的时候也是想找个人诉说诉说,发泄点儿小私愤。可是身为一个纯爷们儿,我好面子,不好意思在你们面前表露出来,只能自己硬撑过去。所以你们大概一无所知。

这些时候,我也渴望身边能有一红颜知己相伴,“宜言饮酒,与子偕老。琴瑟在御,莫不静好。”可惜,那只是一种永无止境的欲望,是一种可望不可及梦想。杜拉斯说:“爱之于我,不是肌肤之亲,不是一蔬一菜,它是一种不死的欲望,是疲惫生活中的英雄梦想。”于我更是如此,而你便是我这辈子不死的欲望。

但曾相见便相知,今生今世,教人如何相忘?

你们都知道我仗义豪情,却不知我内心也是儿女情长。我想这定是我上辈子欠你的。想必我的前世也有那气势磅礴,轰轰烈烈的爱情。只是过了那座奈何桥,喝了那碗孟婆汤,一生爱恨情仇,一世浮沉得失,都已经烟消云散。前世的那个你,来世形同陌路,相见不相识,而前世欠你的,我今生今世一直在还!

要不然,我一纯爷们儿怎么能写出这么文艺得掉渣儿,秀气得像一个小姑娘似得的文章!要不然,我堂堂一男子汉怎么也为“庭有枇杷树,吾妻死之年所手植,今已亭亭如盖矣”这种诗句所动容!

可是,身为一凡夫俗子,要看破这滚滚红尘谈何容易。

还记得夜爬峨眉山的时候,晚上九点多,深山夜路,孤单疲惫,来到一处明亮的地方,抬头一看是万年寺,门旁题一副对联:“是谁将眼孔放开看得穿大千世界,到此要脚跟站定方许入不二法门。” 猛然惊醒,驻足良久不知该往何处,那种震撼你们谁也体会不到。

所以,倘若哪天我去除了那三千烦恼丝,入了那不二法门,做了那寺庙门前一扫地僧,你们大可不必惊讶!要么是我已经对这个世界彻底失望了,要么是我参透了记载我前生前世的三生石,不为超度不为来生,只为今生与你相见!

你们以为我走遍千山万水,踏遍天涯海角又是为了什么呢!

命中注定如此,我又可奈何!