您的位置:首页 > 运维架构 > Linux

Linux应用心得

2008-02-15 14:57 323 查看

Linux应用心得

写这篇文章是为了方便自己,也同时为了方便他人。
目前的开源软件盛行,很多的README文档都是以英文的形式出现,很多懒人不愿意去读此类的文章,所以遇到问题也不会知道怎么去解决。
在这之前,《linux宝库》的站长陈绪先生的《linux一句话》已经概括得很经典,而我追求的是linux中的FAQ形式,只要你有心,没有解决不了的问题。

Q00001:
当修改/etc/fstab文件时,因为修改错误而无法启动,这时进入的急救模式只是可读状态,该怎么解决此类问题?
A00001:
使用mount重载系统分区,使其挂载为可写状态,然后修改/etc/fstab文件,具体挂载方式为:

fdisk -l
mount -o mount,rw /dev/hda1 /mnt

Q00002:
有时候换了环境或者网络,发现sendmail与sm_client邮件发送系统启动很慢,虽然能启动成功,但是启动的速度实在让人受不了,怎么sendmail和sm_client服务解决启动慢的问题?
A00002:
类似这样的应该是/etc/hosts文件出现解析问题,不排除其他文件有问题,这里/etc/hosts文件的原始内容如下:

# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost localhost.localdomain

Q00003:
在有些播放器上,有时候发现播放列表上的字符是乱码,解决播放列表乱码的问题是否有统一的格式呢?
A00003:

计各个播放器的字符编码方式不一样,目前很难有统一的字符编码方式来处理这类问题,比如常见的xmms可以采用加载windows字体的方式获取汉字编码
解决,具体方法把WINDOWS目录Fonts目录下的simsun这种字体拷贝到LINUX的这个目录下
/usr/share/fonts/zh_CN/TrueType,然后重起字体服务,fedora8版本以下解决方案如下:

service xfs restart
fc-cache -f -v
如果没有xfs服务,请先安装xfs:

yum install xfs xfs-devel
再用右键单击xmms播放工具的任何地方
会看到一个"选项",然后选择"功能设定"选择"fonts"
然后设置刚才考过来的字体,注销系统再播放机即可正常使用,对于高版本的xmms记得设置字符编码。
对于音质比较好的amarok,需要进行下载一个软件包,具体方法如下:
安装必要的软件

>sudo apt-get install python-mutagen
or

>yum install python-mutagen -y
把存在NTFS分区上的音乐文件软连接到ext2或ext3分区,

>ln -s /u/music /sun/music
转换标签格式

>cd /u/music
>find . -iname "*.mp3" -execdir mid3iconv -e GBK {} \;

Q00004:
不知道有人使用过在linux下的无线上网"业务"没有?在以前,还没有GUI
的界面驱动的时候,常常使用./configure来make
install,而随着rpm和deb的盛行,安装变简单了,虽然简单,但是无线仍然不好使,老是激活不了,针对IPW2200的网卡和FC系列的操作系
统,我这里给几种解决办法:
A00004:
首先在ipw2200.sourceforge.net下载相关驱动:
使用shell激活:

#!/bin/bash
iwlist=('Cnangel');
iwpasslist=('1234567890');
dev='eth1';
n=1;
i=0;
while [ $i -lt $n ];
do
iwname=${iwlist[$i]};
iwpass=${iwpasslist[$i]};
if [ "`ps -ef |grep dhclient|grep $dev`" != "" ];then
echo "$dev is up";
break;
fi
if [ "`iwlist $dev scanning|grep $iwname`" ];then
/sbin/iwconfig $dev essid $iwname
/sbin/iwconfig $dev key $iwpass
echo > /var/lib/dhcp/dhclient-$dev.leases
echo > /var/run/dhclient-$dev.pid
/sbin/dhclient -1 -q -lf /var/lib/dhcp/dhclient-$dev.leases -pf /var/run/dhclient-$dev.pid $dev
fi
((i++))
done
注意:目前的无线密钥驱动好像不支持WPA-PSK和WPA2,如,仅仅支持WEP,所以选择密钥的时候一定要注意。
另外,驱动也可以找NetworkManager来进行更加方便的GUI管理,安装方法如下:

yum install NetworkManager -y
yum install NetworkManager-gnome -y

Q00005:
Eugene M. Minkovskii wrote:
> I'm use vim on FreeBSD 5.3 now. I trying bouth vim6.3 whitout
> patchs and vim6.3 whith patch 1-62.
> I type:
>
> bash-3.00$ export EDITOR=vim
> bash-3.00$ crontab -e
>
> and after saving crontab changes, I'll get following error:
>
> crontab: temp file must be edited in place
>
> About this we see in man crontab following:
>
> -e Edit the current crontab using the editor specified by the VISUAL
> or EDITOR environment variables. The specified editor MUST edit
> the file in place; any editor that unlinks the file and recreates
> it cannot be used. After you exit from the editor, the modified
> crontab will be installed automatically.
>
> Hmm. I'll try to remove my .vimrc and crontab install correctly,
> but when I use empty .vimrc, crontab broken again.
>
> Have you any ideas?
A00005:
Set 'backupcopy' to "yes". ":help crontab".
--
You can tune a file system, but you can't tuna fish
-- man tunefs
Cnangel注:希望能看明白,主要针对crontab用的时候发生"crontab: temp file must be edited in place"错误的时候的解决办法。

Q00006:
当vim一个文件内容显示一团乱码的时候,你会不知所措,根本不知道采用了什么编码,这时候我们利用我们聪慧的头脑去大胆尝试,一切问题会迎刃而解。
A00006:
首先,判断Vim的默认打开编码,进入命令行模式:

:echo &enc
发现为utf8,把终端的字符编码和vim编码格式弄成一种类型;
vim文件,发现内容仍然是一团糟,尝试使用:

:set encoding=utf8
然后,vim文件,文件内容仍然是乱码,强制指定:

:edit ++enc=utf8
vim文件发现一切明了。
fileencodings 参数是告诉 vim 尝试解码的多种可能编码,vim 会一个一个试着解码,直到试对为止,然后会将试出来的编码记录到 fileencoding 里面,可以显示 fileencoding 就能知道现在 vim 用什么来解码这个文件了。如果想将文件用另外一种编码"另存为",可以修改 fileencoding 然后 :w 。
termencoding 参数是Vim 所工作的终端(或者Windows 的Console 窗口) 的字符编码方式。
注意:freebsd中文一般使用cp936,而linux部分机器可使用gbk字符集
我目前使用的vim配置如下:(~/.vimrc)

" multi-encoding setting, MUST BE IN THE BEGINNING OF .vimrc!
"
if has("multi_byte")
" When 'fileencodings' starts with 'ucs-bom', don't do this manually
"set bomb
set fileencodings=ucs-bom,utf-8,chinese,taiwan,japan,korea,latin1
" CJK environment detection and corresponding setting
if v:lang =~ "^zh_CN"
" Simplified Chinese, on Unix euc-cn, on MS-Windows cp936
set encoding=chinese
set termencoding=chinese
if &fileencoding == ''
set fileencoding=chinese
endif
elseif v:lang =~ "^zh_TW"
" Traditional Chinese, on Unix euc-tw, on MS-Windows cp950
set encoding=taiwan
set termencoding=taiwan
if &fileencoding == ''
set fileencoding=taiwan
endif
elseif v:lang =~ "^ja_JP"
" Japanese, on Unix euc-jp, on MS-Windows cp932
set encoding=japan
set termencoding=japan
if &fileencoding == ''
set fileencoding=japan
endif
elseif v:lang =~ "^ko"
" Korean on Unix euc-kr, on MS-Windows cp949
set encoding=korea
set termencoding=korea
if &fileencoding == ''
set fileencoding=korea
endif
endif
" Detect UTF-8 locale, and override CJK setting if needed
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
endif
else
echoerr 'Sorry, this version of (g)Vim was not compiled with "multi_byte"'
endif
"环境变量 LANG(使用的语言)
"环境变量 LC_CTYPE(使用的内部编码)
"Vim 选项 encoding(Vim 的内部编码)
"Vim 选项 termencoding(Vim 在与屏幕/键盘交互时使用的编码)
"Vim 选项 fileencoding(Vim 当前编辑的文件在存储时的编码)
"Vim 选项 fileencodings(Vim 打开文件时的尝试使用的编码)
"Vim 选项 ambiwidth(对"不明宽度"字符的处理方式;Vim 6.1.455 后引入)
syntax on
set fileencodings=ucs-bom,utf-8,gbk,big5,latin1
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
"缩进
set backspace=2
set autoindent
"set expandtab
"set cindent shiftwidth=2
"set autoindent shiftwidth=2
"空格代替tab
set shiftwidth=4
set softtabstop=4
set tabstop=4
set cindent shiftwidth=4
"行号
set number
"标尺
set ruler
set incsearch
set showmode
"打开文件时自动回到上次编辑位置
set showcmd
"置粘贴模式,这样粘贴过来的程序代码就不会错位了。
"set paste
"设置帮助信息
set helplang=cn
"界面字体
set gfn=Courier_New:h10:cANSI
"set guifont=SimSun 12
"搜索关键字高亮
set hls
"搜索是对不全区分大小写
"set ic
"但现在要区分
"set noic
"设置不备份
"set nobackup
"set nowritebackup
"默认备份文件目录
"set backupdir=/usr/local/backup
"设置配色方案,colorscheme可以设置,但我总提示找不到
"source $VIMRUNTIME/colors/slate.vim
"colorscheme nightflight
"colorscheme desert
"默认是插入模式
"set insertmode
"设置Crontab为可用状态
set backupcopy=yes
map <F6> a<C-R>=strftime("%c")<CR><Esc>
map <F7> :w<CR>:!sh -x %<CR>
map <F8> :w<CR>:!perl -c %<CR>
map <F9> :w<CR>:!perl %<CR>

最后谢谢谢宇恒同学给予的帮助。
后补:关于vim编译
建议使用vim7.0或以上版本,源码编译时参数可以选择,比如:

./configure --prefix=/usr --enable-multibyte

配置选项的含义:
--enable-multibyte
我们强烈推荐你启用该选项(虽然它是可选的),因为它使得 Vim 可以支持使用多字节字符编码的文件,在一个使用多字节字符集的 locale 上,这是必需的

Q00007:
利用mail命令发送附件,真的很难么?
A00007:
不难,需要你的服务器端支持uuencode编码就可以。比如利用mail命令发送一个压缩包

tar cf - Hash.lst | gzip | uuencode Hash.lst.tar.Z | mail -s 'sdas' [email]xxxx@xxxxc.com[/email]即可完成.
可以man uuencode,发现有这么一条:

tar cf - src_tree | compress | uuencode src_tree.tar.Z | mail sys1!sys2!user

Q00008:
怎么利用date获得昨天的日期?
A00008:
在BSD平台上:

date -v-1d "+%Y%m%d %T"
在Linux平台上:

date -d "-1 day" "+%Y%m%d %T"
其他方法,并不一定通用,只是一些有特色思路

date +%Y%m%d -d "-1 day"
date -d yesterday +%C%y%m%d
export TZ="TAIST+16" && date|awk '{print $2,$3}' && export TZ="TAIST-8"
echo |gawk ' {print strftime("%Y%m%d" ,systime()-86400*4) ;exit }'
date -r $(($(date "+%s")-86400))
date -d "3 days ago" +%Y%m%d

Q00009:
怎么使用ssh密钥而不用输入密码登陆远程机器?
A00009:
假如本地机器是localhost,远程机器是remotehost,要访问远程机器,使用ssh-keygen来生成密钥,一般以 rsa key为例 :
Linux上的sh-keygen:

ssh-keygen -t rsa
FreeBSD上的sh-keygen:

ssh-keygen -P '' -t rsa1
早期的sh-keygen:

ssh-keygen -f id_rsa -P ''
原文如下:

If your version of ssh-keygen does not understand the -t option, try: ssh-keygen -f keyname-identity -p ''
然后将id_rsa.pub放到远程机器的~/.ssh/目录下,运行:

chmod 644 ~/.ssh/authorized_keys
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

这样,在localhost上使用scp以及ssh可以直接登陆remotehost,而不用输入密码了。
注意:
1,.ssh权限最好设置为0711权限,而密钥所在文件是0400权限。
2,如果指定要freebsd不使用identity.pub的公钥,而要使用id_dsa.pub的公钥,除了 -i 指定私钥办法解决外,还可以使用 -oProtocol=2 来解决问题,特别scp的时候。

Q00010:
我在linux下可以使用命令查看通讯进程,如果发现有死锁的进程,我可以使用kill命令杀掉,但是我如果不得不工作的windows平台下,怎么杀掉一个进程呢?比如我想杀掉占用80端口的进程怎么办呢?
A00010:

期在linux下工作的朋友,对Windows也非常陌生,对于刚接触到windows的朋友来说,不知道什么进程是占用了什么端口是个非常痛苦的事情,
尽管windows任务管理器提供了比较丰富的功能,但是习惯于命令式的人实在是觉得“拗手”吧!查看80端口PID号码:

netstat -ano
查出Local Address列的80端口对应的PID是多少

Active Connections
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 3880
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1880
TCP 0.0.0.0:2804 0.0.0.0:0 LISTENING 956
TCP 0.0.0.0:3260 0.0.0.0:0 LISTENING 1640
TCP 0.0.0.0:3261 0.0.0.0:0 LISTENING 1640
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 520
TCP 0.0.0.0:8000 0.0.0.0:0 LISTENING 3804
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 2676
从上面我们运行命令(不会不知道windows的命令从哪入口吧?msdos)知道80端口的PID是3880,于是杀掉这个端口,也就是关闭80这个端口号,运行命令:

ntsd -c q -p 3880
即可以关闭80端口了。

Q00011:
经常使用Linux机器,发现mail功能不好使,进入/etc/init.d目录,发现根本没有此目录,使用:

which sendmail
确定系统已经安装上mail,但是我怎么将mail作为守护进程运行呢?
A00011:
如果要sendmail处理发送来的信件,必须有一个守护进程在运行。sendmail守护进程就是带有特殊标志位的sendmail程序。这个守护进程是被/etc/init.d/mail脚本在系统启动的时候自动启动的。
在此脚本中用来启动sendmail的命令如下:

/usr/lib/sendmail -bd -q15m
  -bd标志是使sendmail作为一个守护程序运行。-q15m标志使sendmail fork出一个子守护进程来每隔15分钟处理一次消息队列。
如果没有对应的目录,我相信写一个mail的守护进程应该不成问题了吧。

Q00012:
我的本子的显卡型号是ATI MOBILITY RADEON X700,每次尝试一个Linux发行版,都为显卡驱动的安装伤脑筋,这里整理笔记如下,希望能给遇到类似的同学一点点小帮助。
A00012:
首先是去http://www.ati.com下载你计算机专用显卡型号的驱动,比如我的显卡驱动为:ati-driver-installer-8.40.4-x86.x86_64.run,32位机器或者64位机器通用这个显卡驱动,所以不必要担心自己下错了。
再次,需要xorg和相关驱动,一般发行版本自带,老的发行版本没有的话,自己google一下。
接着,安装ati驱动,直接运行可能会找不到相关的内核,所以需要以下形式安装:

./ati-driver-installer-8.40.4-x86.x86_64.run --listpkg
找到我的对应的发行版本:Fedora/F7
紧接着:

./ati-driver-installer-8.40.4-x86.x86_64.run --buildpkg Fedora/F7
若没有错误,则ati驱动安装完成了。
检测阶段:startx,发现黑屏,按Ctrl+Alt+F1,看到提示错误,libstdc++5.0.0不存在,不能装载flgrx.so文件,这个很容易,找一个compat-libstdc++-33包安装就可以了。

yum install compat-libstdc++-33 -y
如果还有错误,根据错误信息处理就ok了。

Q00013:
在Linux下使用了Windows的丰富的字体,发现在宽屏下,用
firefox使用windows的字体看英文字体比较虚,我选择的是宋体,16号大小,如果选择12号,倒是看上去不是很虚,但是字体太小了,有点累眼
睛 :) 怎么使用好看一点的字体又不会影响效果呢?
A00013:
对于独立显卡的机器,首先配置好机器显示的分辨率,我这里宽屏配置的分辨率是1280x800,首先在gnome下字体并没有问题,只是我以前改动过firefox的配置,针对firefox的问题解决如下:
1,打开firefox首选项,选择内容项,找到“字体&颜色”;
2,默认字体选择“sans-serif”,大小选择合适的高度,我选择16号大小,其实“Courier New”也不错,根据情况选择;
3,高级选项可以自己选择,比如serif字体,Times New Roman以及Arial字体也不错。
当然这些都是在windows字体点阵足够的情况下,如果仍然看上去虚,把字体由16号变小,直到看清楚为止,也可以找一些比较高点阵的字体,google一下,注意有些字体是要收费的哟。

Q00014:
在unix下运行perl程序时,发现错误提示为“: bad interpreter: No such file or directory",而程序没有任何错误,解释器路径也正确,为何会出现这种没有这个文件或者目录的情况呢?
A00014:
这种原因一般是由于0x10和0x13,简单点说是windows系统的换行和回车导致问题,一般在linux或者unix下的换行不包括回车符,所以需要使用dos2unix工具将perl程序转换成为unix可识别的文字就可以了。

Q00015:
怎么在Linux下使用Windows下的字体呢?例如:Fedora8
A00015:
在Fedora官方的FAQ上,写得很清楚,这里不累述了,原文如下:

Yes, you can. Here's how you install fonts:
1. Under the "System" menu in the tray, choose "Preferences" and then "Fonts."
2. Click on the "Details..." button.
3. Click on "Go to font folder."
Now simply drag & drop your fonts into the "Fonts" window to add
them. You may have to log out and log in again to see them actually
show up in that folder.
If you have any programs open, you will need to close then and then
open them again, to have the new fonts show up in those programs.
By the way, there's also a very easy way to install all of the
common Windows fonts on Linux. This can sometimes make web pages
display more nicely:
1. Open a Terminal.
2. Become root:
su -
3. Download the MS Core Fonts Smart Package File:
wget http://corefonts.sourceforge.net/msttcorefonts-2.0-1.spec
4. Make sure that the rpm-build and cabextract packages are installed:
yum install rpm-build cabextract
5. Build the Core Fonts package:
rpmbuild -ba msttcorefonts-2.0-1.spec
6. Install the Core Fonts package:
yum localinstall --nogpgcheck /usr/src/redhat/RPMS/noarch/msttcorefonts-2.0-1.noarch.rpm

Q00016:
针对Fedora8(这里又说F8,@_@ ),为什么和以前安装Fedora7、fedora6等等不一样了呢,在插入启动光盘的时候一直sbin\loader... ...中或者一直halt,或者无缘无故的怪毛病?
A00016:

者在安装fedora8的时候也出现过这样的问题,刚开始以为自己的可擦写盘坏掉了,后来又用dvd刻了一个dvd盘,依旧loader,去官方查没有结
果,后来还是搜索给出了答案,原来是硬件配置和现有版本冲突的问题,不知道为什么fedora8这么仓促发布?不把一些环境测试好了在发布,这个问题后来
已经反应到redhat的官方网站并且提交上去。笔者机器是acpi冲突,安装时,编辑安装选项(按”e"编辑),后面加上

clocksource=acpi_pm

由于笔者本本的驱动在fedora8中没有集成,所以得自己从官方ati中下载驱动,不过官方的ati驱动又出现了bug,不过整整还能用,安装时候只能在后面加上:

text
这样安装完成了。不过现在笔者已经很满意了,在fc3的时候,官方还没有成型的
ati显卡驱动,fedora
core3没有自己集成ati驱动,每次都是和flgrx以及xorg重新编译,然后再和内核一起加载,这样才解决,现在方便多了,关于怎么去安装显卡看
Q00012。
Q00017:
关于rpm安装的mysql,在日志文件/var/log/mysqld.log会出现:

[ERROR] Fatal error: Can't open privilege tables: Can't find file: './mysql/host.frm' (errno: 13)
或者:

[ERROR] Fatal error: Can't open privilege tables: Table 'mysql.host' doesn't exist
的字样,而自己编译的mysql没有这个方面的问题(除非你不按照INSTALL文件的说明去做),究竟该怎么解决呢?
A00017:
这个问题来源于操作系统安装mysql时,都是以root身份安装rpm,实际上是mysql的rpm包的bug,导致数据存放目录权限是root权限导致,正确的解决方法是把mysql_install_db的数据库目录更改所属权限即可,以默认安装的路径为例:

chown -R mysql:root /var/lib/mysql/mysql

Q00018:
在x64位机器编译GD库时,发现在编译freetype源码时出现如下错误:

/usr/bin/ld: /usr/local/lib/libz.a(compress.o): relocation
R_X86_64_32can not be used when making a shared object; recompile with
-fPIC
/usr/local/lib/libz.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
其中zlib版本为:zlib-1.2.2
libpng版本为:libpng-1.2.23
libjpeg版本为:jpeg-6b
freetype版本为:freetype-2.3.5
GD版本为:2.0.34
不能通过编译。
A00018:
错误原因:zlib安装问题
解决方法:重新编译zlib文件,步骤如下:

# tar -zxvf zlib-1.2.3.tar.gz
# cd zlib-1.2.3
#./configure
#vi Makefile
找到 CFLAGS=-O3 -DUSE_MMAP
在后面加入-fPIC,即变成CFLAGS=-O3 -DUSE_MMAP -fPIC

#make
# make install
及可正确完成zlib在x64位机器上的安装。
注意:在x64位机器上编译一些软件,其实很多都需要在优化编译选项上加上 -fPIC 这个参数,否则编译会通不过,笔者在这里吃过很大的亏。

Q00019:
为什么我编译PHP时出现如下错误:

checking for MySQL support… yes
checking for specified location of the MySQL UNIX socket… no
checking for MySQL UNIX socket location… /tmp/mysql.sock
checking for mysql_close in -lmysqlclient… no
checking for mysql_error in -lmysqlclient… no
configure: error: mysql configure failed. Please check config.log for more information.

已经安装了mysqlclient10-3.23.58-4.RHEL4.1、mysqlclient10-3.23.58-4.RHEL4.1、
mysql-4.1.12-3.RHEL4.1、mysql-server-4.1.12-3.RHEL4.1、mysql-bench-4.1.12-
3.RHEL4.1、mysqlclient10-devel-3.23.58-4.RHEL4.1和mysql-devel-4.1.12-
3.RHEL4.1,并不缺少任何依赖了,为什么出现这种错误呢?怎么样解决这个错误?
A00019:
关于这个问题,我google了很多地方,个人认为是环境支持性问题,也许是php的bug或者是mysql的bug,关于网上所说“安装PHP的时候没有指定一下mysql的安装目录。但是我已经指定了,所以这个说法是错误的,其实主要原因是 mysql-level没有装,也就是mysql的版本不对,应该换 mysql-max-5.0.21版本(包含所有mysql相关内容的软件包)”云云是无可奈何的解法,另外一种解决办法就是将mysql中的libmysqlclient库移到lib库目录下解决问题,以x64位机器为例,假设mysql编译时--prefix=/usr:

# cd /usr/lib64
# ln -s /usr/lib64/mysql/libmysqlclient.so
# ldconfig

然后对PHP进行编译:

./configure --prefix=/usr/share \
--datadir=/usr/share/php \
--with-apxs=/usr/sbin/apxs \
--libdir=/usr/share --includedir=/usr/include \
--bindir=/usr/bin \
--with-config-file-path=/etc \
--enable-mbstring --enable-mbregex \
--with-mysql --enable-bcmath \
--with-gd --enable-calendar \
--with-bz2 --with-zlib --enable-zip \
--enable-gd-imgstrttf \
--enable-gd-native-ttf \
--with-ttf-dir=/usr/lib \
--with-freetype-dir=/usr/lib \
--with-zlib-dir=/usr/lib \
--with-png-dir=/usr/lib \
--with-jpeg-dir=/usr/lib \
--with-xpm-dir=/usr/X11R6 \
--with-tiff-dir=/usr/lib \
--enable-memory-limit --enable-safe-mode \
--bindir=/usr/bin \
--enable-bcmath -enable-calendar \
--enable-ctype --with-ftp \
--enable-magic-quotes \
--enable-inline-optimization \
--with-iconv --enable-ftp \
--enable-debug \
--enable-sqlite-utf8 \
--enable-soap \
--enable-zend-multibyte
一切安装顺利完成。

Q00020:
声卡驱动alsa安装上了怎么就是没有声音阿?用alsamixergui或者alsamixer配置alsa时,出现:

*** PULSEAUDIO: Unable to connect: Connection refused
alsamixer: function snd_ctl_open failed for default: Connection refused
或者使用alsa的驱动播放时,出现:

*** PULSEAUDIO: Unable to connect: Connection refused
[AO_ALSA] Playback open error: Connection refused
Could not open/initialize audio device -> no sound.
当然,完全可以使用其他的声卡驱动来代替,比如oss,或者转换alsa-oss以及其他方式,总之也很完美,但是有没有更完美的解决,我只想使用alsa方式来进行播放呢?
A00020:
完美的解决方案是有的,这里是alsa的一个bug,当新的驱动应用上的时候,/tmp/pulse-*这个目录下面的配置信息没有更新,导致声卡驱动不能正常使用,只要删除这个目录,就可以了,原文如下:
Ma pulseaudio è avviato?
# ps -eaf | grep pulseaudio
Ti risponde qualcosa?

Se non lo è eseguilo con il tuo utente:

$ pulseaudio -D &
e se da errore verifica se la directory /tmp/pulse-tuoutente ha i permessi corretti:

$ ls -ld /tmp/pulse*
drwx------ 2 tuoutente tuoutente 4096 27 nov 14:26 /tmp/pulse-tuoutente
Se appartiene invece a "root" elimina quella directory prima di riavviare pulse-audio:

$ su

# rm -r /tmp/pulse-tuoutente
# exit
$ pulseaudio -D &
Se non va ancora...

...se lanci mplayer con una di queste opzioni:

$ mplayer -ao nosound blablabla.avi
o
$ mplayer -ao sdl blablabla.avi
o
$ mplayer -ao alsa blablabla.avi
o
$ mplayer -ao oss blablabla.avi另外,保证alsa驱动相关有这些相关的包:
alsa-utils alsa-lib alsa-lib-develalsa-driver似乎可以不需要 :)

Q00021:
Linux下我建立了.bash_profile文件作为用户的配置文件,怎么不生效呢?
A00021:

类Unix系统里,有几种格式的文件配置,.bash_profile只是其中的一种,比如BSD系统,常用.profile文件作为用户基础配置文件,
而Linux家族里面,常用.bash_profile和.bashrc作为配置文件,这些配置文件与主shell有关,比如BSD系统经常用
csh,而linux系统常用bash。
除了以上,注意.bash_profile等配置文件必须写正确,检查正确是否,可以直接在命令行上运行,或者
sh -x .bash_profile或者
source .bash_profile来运行。

Q00022:
怎么在BSD下和Linux下的top命令打印出来的内容输出到一个文件,但是我只想几分钟来监测一次?
A00022:

#!/bin/bash
os=`uname -s`
logpath=/home/Cnangel
topdate=`date "+%Y%m%d %T"`
topfile=$logpath/`date "+%Y_%m_%d_%H_%M_%S"`.top
export TERM=linux;
case "$os" in
FreeBSD)
# cpulevel=`vmstat|awk 'END{print $19}'`
/usr/bin/top -b -d 3 | awk '{if (NF == 0) { line ++;} if (line >= 6){print $0;} }' > $topfile
id=`grep idle $topfile | awk -F "," '{print $5}'`
id=${id#*[ ]}
cpulevel=${id%.*}
if [ "$cpulevel" -le "50" ]
then
/bin/awk
'{if ($9 ~ /^%/) { ss = 1; next; } if (ss == 1) { print "'"$topdate"'"
"\t" $9 "\t" $12; ss = 0; } }' $topfile >>
$logpath/cpu.log
fi
;;
Linux)
# cpulevel=`vmstat|awk 'END{print $15}'`
/usr/bin/top -b -n 3 | awk '{if (NF == 0) { line ++;} if (line >= 6){print $0;} }' > $topfile
id=`grep "id," $topfile | awk -F "," '{print $4}'`
id=${id#*[ ]}
wa=`grep "id," $topfile | awk -F "," '{print $5}'`
wa=${wa#*[ ]}
cpulevel=${id%.*}
iolevel=${wa%.*}
if [ "$cpulevel" -le "50" -o "$iolevel" -ge "60" ]
then
/bin/awk '{if ($9 ~ /^%/) { ss = 1; next; } if (ss == 1) { print "'"$topdate"'" "\t" $9 "\t" $12; ss = 0; } }' $top
file >> $logpath/cpu.log
fi
;;
esac

注意BSD与linux不同,为了稳定起见,top更新是1秒钟一次,所以开始2秒是不准确的,一般从第三秒开始记。
另外,类Unix下有一个命令是sar(System Activity Reporter),主要将系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态,关于其用法可以参考其手册,这里不再累述。

Q00023:
在Windows下怎么将postgresql安装成服务?postgresql.conf 中的 tcpip_socket选项 怎么没有呢?另外,我创建一个大写的"QQ"用户该怎么操作呢?
A00023:
其实安装办法和mysql差不多,postgresql提供一个pg_ctl.exe程序来完成安装windows的服务:

F:/usr/local/pgsql/bin/pg_ctl.exe runservice -N "PGSQL" -D "F:/usr/local/pgsql/data"
然后启动PGSQL服务:

net start PGSQL
但是直接使用psql时候出现

D:\>psql
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

样子是类似unix的socket的接口没有接上,那我们就接上吧,但是从postgresql.conf
中没有发现tcpip_socket字样的接口,去官方一查,原来是postgresql从8.24版本以后抛弃了这个参数,一切使用
listen_addresses来控制。于是修改postgresql.conf文件,将listen_addresses修改成
'localhost',并去掉前面的“#”号,然后使用客户端程序psql进行连接:

D:\>psql -h localhost -U root -d cnangel
Welcome to psql 8.0.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
cnangel=# \l
List of databases
Name | Owner | Encoding
-----------+---------+-----------
MTOS | root | SQL_ASCII
QQ | cnangel | SQL_ASCII
cnangel | cnangel | SQL_ASCII
postgres | root | SQL_ASCII
root | root | SQL_ASCII
template0 | root | SQL_ASCII
template1 | root | SQL_ASCII
(7 rows)
cnangel=# alter database "QQ" owner to "QQ";

这样解决了我们的问题,其实发现很多windows下的东西都可以模仿类Unix,另外,遇到问题多看文档,多动脑筋,做一个自己的OS也不成问题了。

Q00024:
Mysql数据库中的表出现了错误,查询和插入的时候都会出错,查询错误显示:

mysql> SELECT id, ybg FROM querylog_discrepant WHERE keyword LIKE BINARY '宰相刘罗锅在线观看';
ERROR 1030 (HY000): Got error 127 from storage engine
使用mysqlcheck修复也无法修复,显示错误信息如下:

warning : Table is marked as crashed
warning : 1 client is using or hasn't closed the table properly
error : Size of datafile is: 214 Should be: 220
error : Corrupt
该怎么办呢?
A00024:
使用该命令来强制修复,但是会丢失一些数据,但是总比你这个表不能用好一些吧,建议重要性的表进行一些调度性的备份。命令如下:

mysqlcheck -uroot -S /tmp/mysql.sock --force --auto-repair querylog querylog_discrepant;

Q00025:
类Unix环境里,A主机能够ping通B主机但是由于防火墙等策略限制不能使用B主机中其中一个3206端口的服务,怎么才能访问这个服务呢?
A00025:
找一台C主机,虽然A主机不能ssh到C主机,但C主机必须能够ssh到A主机,且C主机能够使用B主机中3206端口的服务,然后可以使用screen命令放置ssh“隧道”,命令如下:

screen ssh -q -x -R 2008:www.B.com:3206 user@www.A.com vmstat 45
注意以下几点:
1,保证A主机的2008端口没有被占用,这个端口可以随意指定,不一定是2008;
2,www.A.com这个主机名称可以使用IP来代替,当然这不是好的方案,因为IP经常变化。

Q00026:
在使用screen vim时候,终端的屏幕经常因为错误按键会闪烁不停,影响视觉感官,该怎么办才能让它不进行闪烁呢?
A00026:
在终端输入:

screen vim test.c
然后输入:

:help 'visualbell'
回车后发现一些关于vim bell的帮助,然后根据需解决问题再输入

set vb t_vb=
回车一下,看看连续按几次ESC,是否还会闪烁屏幕呢?呵呵,一切正常了。

Q00027:
当服务器设置了ssh登陆超时时间(一般为30秒),即当终端用户30秒内没有反应(数据包的传递),则ssh自动断开,若我一直想ssh连接着,并不想断开;但是服务器已经设置了,我并不想改动服务器配置,该怎么解决这个问题呢?
A00027:
这里提供给使用putty的朋友一个好的办法(适合Windows和Linux环境),如图:



将0设置为15秒左右即可。
对于Linux用户另外有一种解决办法,首先:
在$HOME/.ssh目录更改config文件,若没有该配置文件,则创建一个,里面内容添加一句:

ServerAliveInterval 15
这样也不会因为服务器的ssh超时配置导致ssh断开了。该配置的意思就是每隔15秒内送数据包给服务器,保证持久性连接。

Q00028:
使用pietty或Putty的人,经常不小心按到Ctrl+s,导致终端挂起,看上去跟机器死了似的,这时候唤醒机器该怎么办?
A00028:

实这个是一种使用经验,在putty里面,无论使用screen或者vim等模式下按ctrl+s都会出现这种挂起情况,一般人认为是无可救药了,直接
kill这个进程的pid,尤其是screen或者vim等模式时,正在编辑文档,导致数据丢失,到底怎么解决这个办法呢?其实这个方法非常简单:
按住
Ctrl+q即可唤醒机器。

Q00029:
怎么直接从mysql导出xml的数据?
A00029:
很简单,使用-X选项即可

mysql -X -u root -e "use mysql; show processlist;"
输出内容如下:

<?xml version="1.0"?>
<resultset statement="show processlist" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<field name="Id">97</field>
<field name="User">root</field>
<field name="Host">localhost</field>
<field name="db">mysql</field>
<field name="Command">Query</field>
<field name="Time">0</field>
<field name="State" xsi:nil="true" />
<field name="Info">show processlist</field>
</row>
</resultset>

Q00030:
sqlite与sqlite2有什么关系,其中若想从sqlite升级到sqlite2升级,该怎么办?
A00030:
sqlite2是sqlite的升级版本,sqlite2不兼容以前sqlite的数据库,如果需要转换,可以使用如下命令:

sqlite2 mydb.db .dump | sqlite3 mydb-new.db

们常把sqlite2.x版本说成sqlite,而把sqlite3.x以上说成sqlite2,只是习惯而已,sqlite2实现了一些优化算法,如
btree,使速度更快于sqlite,网上有人说sqlite2快于mysql,我看不尽然,其实任何东西有利有弊,看怎么用才能体验出它的好处和优
点。
Q00031:
sudo可不可以不输入密码?
A00031:
改一下/etc/sudoers
加上一句

[用户] ALL=(ALL) NOPASSWD: ALL

但是不建议直接编辑/etc/sudoers文件,可以使用visudo,格式:

用户名 主机名=NOPASSWD:/sbin/bash
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux 职场 心得