Archive for ‘Unix/Linux’ Category

December 25, 2011

  场景是这样的。我在写一个Nginx模块,该模块使用了MySQL的C客户端接口库libmysqlclient,当然mysqlclient还引用了其他的库,比如libm, libz, libcrypto等等。对于使用mysqlclient的代码来说,需要关心的只是mysqlclient引用到的动态库。大部分情况下,不是每台机器都安装有libmysqlclient,所以我想把这个库静态链接到Nginx模块中,但又不想把mysqlclient引用的其他库也静态的链接进来。
  我们知道gcc的-static选项可以使链接器执行静态链接。但简单地使用-static显得有些’暴力’,因为他会把命令行中-static后面的所有-l指明的库都静态链接,更主要的是,有些库可能并没有提供静态库(.a),而只提供了动态库(.so)。这样的话,使用-static就会造成链接错误。
  在StackOverflow上面提了How to do partial linking这个问题,但两天都没人搭理我,大概那些哥们儿也像中国人一样,圣诞狂欢呢吧。但最后一个叫Employed Russian的哥们给了一个链接,和我的问题相似(你很少能遇到独一无二的问题)。这个帖子唯一的一个解答解决了问题。
  我之前的链接选项大致是这样的,

1
CORE_LIBS="$CORE_LIBS -L/usr/lib64/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/lib64 -lssl -lcrypto"
Tags: . 99 views
November 2, 2011

一个致命字符串

  传说中,存在这么一串神秘的字符,你把它们放到终端,然后回车,不消太久,你的机器就变植物人只能低电平复位重启了。这串神秘的字符看起来是这样的,

1
dutor@home: ~$ :(){ :|:; };:&

  这是神马玩意儿呢?好的,现在听我的,把你的脑袋面对显示器逆时针旋转四分之一圆周,像不像一个张着血盆大口的长袍老怪?
  严肃点,你看懂它的真相了吗?换种等价的写法,

1
dutor@home: ~$ foo(){ foo|foo; };foo&

  其实就是“声明”了一个函数,然后在后台执行这个函数。在函数体内部,以管道的形式调用递归调用自身。第一种写法只是把函数名换成”:”产生的怪胎。

Tags: . 165 views
June 11, 2011

  换了Arch Linux,感觉很清爽,但也有不少问题,但大多都能在Arch Wiki上面得到解决,但仍有一个问题。
  我使用slim登陆管理器,登陆后由.xinitrc启动openbox-session,没有问题。但在slim启动之前,会出现短暂的终端登陆界面,但slim登陆界面随即被启动。登陆后(slim),在命令行,who命令没有输出。执行halt命令关机时,桌面立即退出,立即显示一个终端的登陆界面(而不是关机时的相关信息),几秒钟后机器正常被关闭。
  可是为什么who命令没有输出呢?我觉得这可能是session的有关问题(但不确定),我对session的理解不是很清晰,希望知道事情真相的朋友能够帮到我,谢谢!

1
2
3
4
5
6
7
8
9
10
11
#! /bin/bash
 
xscreensaver &
rl=$(runlevel | grep -o [0-6])
 
case $rl in
	4) exec openbox-session;;
	5) exec gnome-session;;
#4) exec ck-lauch-session openbox-session;;
#5) exec ck-lauch-session gnome-session;;
esac
Tags: . 138 views
June 6, 2011

  从Ubuntu 7.04/7.10开始接触Linux,从Ubuntu 8.04开始使用Linux作为桌面,在一定程度上见证了Ubuntu的成长,更重要的是自己也在成长,感谢Ubuntu的陪伴,祝愿他一切顺利。从身边和网络上的朋友了解到,Ubuntu 11.04有了相对比较大的变化,于是我也选择了变化,即使近来本人的经历已经跌宕起伏。我选择了Arch Linux。不知Arch这个词大家是怎么是发音的,我念作/a:k/,因为Archlinux的Logo让我想到Architecture,更重要的是,我觉得这个发音很性感,像socket一样性感。嗯,我是个感官动物,我喜欢一切性感的事物,或者说我觉得我喜欢的东西都很性感。

  做为个人使用,没有X,没有桌面的系统是不食人间烟火的系统。下面要做的就是,安装Xorg, 显卡驱动(安装X时,开源驱动会被安装,没有特殊需求的话,可不用手动安装)。安装桌面环境,重量级如GNOME、KDE之流,轻量级如xfce、lxde等等。我没有直接现成的安装桌面环境,而是分别安装窗口管理器(openbox),登陆管理器(slim),文件管理器(Thunar),系统面板(tint2)等等。有了基本的桌面,还需要安装和配置系统的字体(ttf-ms-fonts, bitstream等等),中文输入法(ibus-sunpinyin), 无线网络管理利器(wicd)。

  再最后,就是安装最常用的应用程序了,虚拟终端(urxvt),浏览器(chromium),编辑器(vim/gvim/gedit),媒体播放器(mplayer, smplayer, audacious),pdf阅读器(evince, xpdf),图片查看/编辑器(eog, feh, Gimp),邮件客户端(mutt, Thunderbird),即时通讯工具(Pidgin),不啦不啦。

Tags: . 722 views
June 1, 2011
1
2
3
4
5
6
7
8
9
10
vpath % /home/dutor/
vpath rc /home/dutor/.lftp/
vpath vsftpd.conf /etc/
vpath openbox /home/dutor/.config/
vpath tint2 /home/dutor/.config/
 
BACKUP: .vimrc .vim .bashrc .Xresources .xbindkeysrc .gitconfig .bin .screenrc \
.wordump.txt vsftpd.conf openbox .tmux.conf .conkyrc tint2
	dcp $?
	touch BACKUP

  其中,vpath是make的命令,用于指定文件的搜索目录。BACKUP是一个空文件,每当完成备份时,使用touch命令更新其时间戳。dcp是一个脚本,将其参数指明的文件拷贝到Dotfiles目录,$?是make的自动变量,代表依赖关系中比目标更新的依赖。

Tags: ,. 113 views
May 5, 2011

  相信很多人经常遇到文件乱码,尤其是文本文件。如果你不是用编辑器打开一个二进制文件的话,这应该是一个编码问题,即文件的实际编码和编辑器查看该文件时所使用的编码不一致。这时候,咱们需要把文件的编码进行转化,或者修改使用该文件的程序采用的编码。后一种方法取决于咱们使用的具体的程序,无法一概而论。
  这里介绍一个工具,iconv,使用它可以将一个输入文件从一种编码转换到另一种编码,同时将转化结果输出。iconv的-f选项指定源编码,-t选项指定目标编码,-o指定输出文件:

$ iconv -f coding1 -t coding2 file1 -o file2

  若file1省略,则使用标准输入;若-o选项省略,则使用标准输出。
  例如,我想把所有GBK编码的.cue文件转化为utf8编码:

$ find . -name "*.cue" -exec iconv -f gbk -t utf8 {} -o {} \;
Tags: ,,. 127 views
March 10, 2011

  alias, 假名,别名,bash的一个内建命令,用来给常用的较长的命令定义个简短的名称。
  alias命令的基本格式为alias [word[='command']], []内为可选项。定义word为command的别名。若=’command’部分省略,则输出word之前的定义,未定义则报错。单独的alias列出当前环境中所有可用的别名。通常来讲,关于alias,知道这么多就行了。但在使用alias的过程中还有一些问题需要注意。
  如果bash的expand_aliases选项没有被设置,那么在非交互式shell中alias不会被执行展开。也就是说,在shell脚本中,使用alias会导致”command not found”的错误。使用shopt命令来设置expand_aliases选项:

1
shopt -s expand_aliases

设置这个选项,可以在bashrc中,也可以在需要使用alias的脚本中。

Tags: . 272 views
March 8, 2011

  什么是shell自己版本的echo呢?原来,shell中可以使用的命令有“内建命令”(built-in)和外部命令之分。内建命令有shell本身实现,即和shell进程同属于一个地址空间执行,比如echo可能是shell中的一个函数实现的。内置命令通常是无法或者不适以外部命令的形式实现的命令,比如cd, source, alias, bind, history, set等等。外部命令是一些独立的可执行文件,由shell以fork/exec的形式执行。
  使用type命令可以获取命令的类型。由type type可以知道type命令本身也是内建命令。

  知道这些,通过–help选项输出echo的帮助信息就不是什么难事了,

1
2
3
4
~$ which echo
/bin/echo
~$ /bin/echo --help
......
Tags: . 67 views
January 30, 2011

  列位,近来俺系统地学习了一下shell编程,好家伙,那可不是一般的纷繁琐碎啊,可谓陷阱重重,防不胜防。摸索中,遇到这个页面,总结了Bash编程中的很多陷阱及必要的解决技巧。在这里,结合这本GNU Bash Reference Manual,我有选择地简要地把这些个Pitfalls给您用百姓喜闻乐见的中文展示出来。由于能力有限,我也不是专职的系统管理员,肯定不能详尽地把所有问题都解释清楚,我本人也觉得没有这个必要。仅供参考而已,欢迎指正和补充。

1
2
3
4
5
6
for i in *.mp3
do
    COMMANDS
done
# 单行形式就是for i in *.mp3; do COMMANDS; done
# ;只是起到命令和关键字间的分割符的作用,完全可以用换行符来代替
Tags: . 646 views
September 14, 2010

  由于守护进程在后台运行,为系统或用户提供某种服务,因此通常只需要一个运行实例就可以了,而且在大部分情况下只能有一个实例在运行。例如cron进程,若有多个实例在运行,那么各个实例都会根据crontab执行一份用户指定的任务,岂不是乱了套了?还有其他很多守护进程是设备相关的,而这些设备有很可能是非共享的,所以这样的守护进程也不能运行多个。
  文件锁和记录锁机制是一种实现守护进程单例运行的方法。如果每一个守护进程创建一个文件,并且在整个文件上加上一把锁,那就只允许创建一把这样的写锁,所以在此之后试图再创建一把这样的写锁就会失败,以此向后续守护进程的副本指明已经存在一个正在运行的副本了。守护进程终止时,这把锁将被自动删除。

1
2
3
4
5
6
7
8
9
10
int
lockfile(int fd) //~ try to lock the file, affecting errno when it fails.
{
    struct flock fk;
    fk.l_type = F_WRLCK;
    fk.l_start = 0;
    fk.l_whence = SEEK_SET;
    fk.l_len = 0;
    return (fcntl(fd, F_SETLK, &fk));
}
Tags: . 175 views
Page 1 of 9123456789