Showing posts with label Linux. Show all posts
Showing posts with label Linux. Show all posts

为aMule设置缓存

最近发现服务器的声音很响,仔细一听,是硬盘在哗哗的转。一开始没有引起注意,后来发现这个声音就没有停止过,着手开始调查。nmon给出了明确的答案

│ Code Resource Stats Now Warn Danger │
│ OK -> CPU %busy 9.2% >80% >90% │
│ DANGER -> Top Disk sda %busy 98.9% >40% >60%

再看了一下vmstat

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 2 239672 87424 44 2688708 10 14 3500 586 1 26 9 8 13 71

最后明确,硬盘sda被长时间占用,而且,cpu的等待时间已经超过了71%,瓶颈出现在了硬盘上,第一个就想到最近开了aMule,很可能是这个东西在频繁的读写,上官网查了一下资料,尝试了下面的设置:

FileBufferSizePref=100

aMule使用buffer的机制是,每个碎片文件使用 FileBufferSizePref * 15000(bytes),会首先将内容缓存到ram,然后再写入硬盘。

类似的,使用rtorrent的朋友,可以尝试下面的缓存设置

# Send buffer per torrent
send_buffer_size = 10M

# Receive buffer per torrent
receive_buffer_size = 20M

... Read more!

解决Airvideo服务器在Linux下运行时,无法显示非英文目录的问题+中文方块问题

首先,来解决字母中文方块问题。
另外,在显示中文的时候,会遇到方块问题。一开始以为是Ubuntu的环境问题,调整了N次,没有得到解决。仔细考虑了一下,猜想有可能是java的字体问题,因为AirVideo的Linux服务器端是基于JAVA的。而且JAVA的中文字体问题由来已久。
假设你安装的JAVA目录为:/usr/lib/jvm/java-6-sun/

1,拷贝中文字体到JAVA虚拟机目录
/usr/lib/jvm/java-6-sun/jre/lib/fonts/fallback/
fallback目录可能需要自己建立一下。

你也可以将系统的中文字体的链接放到此目录下
$ sudo ln -s /usr/share/fonts/truetype/wqy/*.* /usr/lib/jvm/java-6-sun/jre/lib/fonts/fallback/

2,建立字体扫描文件
在目录/usr/lib/jvm/java-6-sun/jre/lib/fonts/fallback/下面执行如下命令
$ sudo mkfontscale

3,将fallback/fonts.scale的内容拷贝到/usr/lib/jvm/java-6-sun/jre/lib/fonts/fonts.dir
注意第一行的行数

ok,重新启动你的AirVideo服务器端,用你的iPhone/iPad尝试一下,应该是可以完美解决。

最后,来解决非英文目录无法显示问题
以下部分来自这里
编辑/etc/init/airvideo.conf文件,做如下修改:

start on runlevel [2345]
stop on shutdown
respawn

exec sudo -H -n -u env LANG=zh_CN.UTF-8 /usr/bin/java -jar /opt/AirVideoServer/AirVideoServerLinux.jar /opt/AirVideoServer/test.properties


然后重新启动你的服务看看。
... Read more!

LVM基本应用

Linux中,使用LVM来管理你的硬盘是非常方便的事情。特别是对于多硬盘,经常增减分区大小等需求来讲,非常的强大。LVM磁盘空间管理系统允许您在需要的时候重新调整大小, 这也就意味着在管理磁盘空间资源方面, 您将获得极大程度的自由。这边不介绍LVM的具体原理,以及各个命令的详细解释,只针对具体应用来进行描述。
试验环境:Ubuntu 10.04.1 LTS

LVM 术语:
PV - Physical Volume 物理卷,例如一个硬盘,或一个Software RAID设备;
VG - Volume Group 卷组,将一组物理卷收集为一个管理单元;
LV - Logical Volume 逻辑卷,等同于传统分区,可看作便准的块设备,以容纳文件系统;
PE - Physical Extent 物理块,划分物理卷的数据块;
LE - Logical Extent 逻辑块,划分逻辑卷的数据块;

1,列出当前所有LVM的物理卷
$ sudo pvscan
通常,你会得到类似如下的结果输出

PV /dev/sdc1 VG s0102 lvm2 [1.82 TiB / 0 free]
PV /dev/sdd1 VG s0102 lvm2 [931.51 GiB / 160.52 GiB free]
PV /dev/sde1 VG s0102 lvm2 [1.82 TiB / 0 free]
PV /dev/sdb1 VG s01 lvm2 [148.81 GiB / 31.73 GiB free]
Total: 4 [4.69 TiB] / in use: 4 [4.69 TiB] / in no VG: 0 [0 ]


2,增加一块硬盘到某卷组,然后增加到制定的分区
首先创建物理卷
$ sudo pvcreate /dev/sda1

然后我们列出所有的物理卷时,会看到哪个物理卷没有被加入到卷组中

PV /dev/sdc1 VG s0102 lvm2 [1.82 TiB / 0 free]
PV /dev/sdd1 VG s0102 lvm2 [931.51 GiB / 160.52 GiB free]
PV /dev/sde1 VG s0102 lvm2 [1.82 TiB / 0 free]
PV /dev/sdb1 VG s01 lvm2 [148.81 GiB / 31.73 GiB free]
PV /dev/sda1 lvm2 [465.76 GiB]
Total: 5 [5.15 TiB] / in use: 4 [4.69 TiB] / in no VG: 1 [465.76 GiB]


接下来讲未加入卷组的物理卷加入制定的卷组
$ sudo vgextend s0102 /dev/sda1

这时候我们在使用pvscan命令看一下,就会得到如下结果

PV /dev/sdb1 VG s01 lvm2 [148.81 GiB / 31.73 GiB free]
PV /dev/sdc1 VG s0102 lvm2 [1.82 TiB / 0 free]
PV /dev/sdd1 VG s0102 lvm2 [931.51 GiB / 160.52 GiB free]
PV /dev/sde1 VG s0102 lvm2 [1.82 TiB / 0 free]
PV /dev/sda1 VG s0102 lvm2 [465.76 GiB / 465.76 GiB free]
Total: 5 [5.15 TiB] / in use: 5 [5.15 TiB] / in no VG: 0 [0 ]


加入卷组后,可以给实际的分区扩展一下大小了
$ sudo lvextend -L +500G /dev/mapper/s0102-hd2

将实际分区增加大小后,要记住实际的文件系统必须要调整一下(否则重新启动后会找不到分区)
这边拿btrfs文件系统来做例子
$ sudo btrfsctl -r max /hd2

ok,到这边你就已经成功将一块硬盘加入卷组,并且将实际的分区增大了。
... Read more!

fdisk-cfdisk-sfdisk比较

在Linux中有好几个版本的*fdisk类程序。每一个都有自己的强项和缺点。基本上我使用过cfdisk,fdisk,sfdisk。
cfdisk
cfdisk是一个漂亮的程序,它只接受最严谨的分区表, 而且它能生成高质量的分区表。如果可能,你最好使用这个程序。最大的亮点就是使用方便,字符界面下的交互界面很好。

fdisk
这个是很多人一开始都会使用的工具,据说是一个有很多臭虫的分区工具软件(我用了很久,也没有发现过bug,或许现在已经完善了)。 它所做的操作是模糊不清的,通常在碰巧的情况下它才会正常的运行(据说)。 它唯一值得使用的地方是它对BSD的磁盘标签和非DOS的分区表有所支持, 尽量少用这个程序(据说,我没有任何证据正名它是不行的)。

sfdisk
是一个专为黑客提供的程序,它的用户界面很不友善,但它更精确,也比fdisk和cfdisk更有效。另外,它只能以非交互的方式运行。我基本上只用在使用它看分区表。
... Read more!

Linux查看内存、CPU、硬盘信息

1.查看CPU信息命令
cat /proc/cpuinfo

2.查看内存信息命令
cat /proc/meminfo

3.查看硬盘信息命令
fdisk -l
... Read more!

硬盘问题。

最近发现一块硬盘的工作有点不正常,拷贝文件时经常是100%被占用,此时外部通过samba就无法访问任何资源,不知如何解决。苦恼中。


... Read more!

Ubuntu下aMule的安装,以及相关设置。

OS:Ubuntu 10.04 LTS

1,安装

Ubuntu下安装东西一向非常简单
$ sudo aptitude install amule-daemon amule-utils

2,配置

amule的设置文件如下
/etc/default/amule-daemon
在此文件中,你需要设置的是如下两个变量
AMULED_USER
AMULED_HOME
其中AMULED_USER为运行amule的用户,你必须要设置这个,否则amule-daemon无法自动运行。
AMULED_HOME如果你不设置的话,会自动使用AMULED_USER下面的.aMule。
设置好此文件后,我们需要讲amule-daemon启动起来了,第一次启动后会在你设置的AMULED_HOME下面生成一个.aMule目录,并且生成一些必须的初始文件。

$ sudo /etc/init.d/amule-daemon restart

下面需要编辑$AMULED_HOME/.aMule/amule.conf文件,我一般采用以下配置(打开web服务)

[WebServer]
Enabled=1
Port=4711
UPnPWebServerEnabled=0
WebUPnPTCPPort=50001
PageRefreshTime=120
UseGzip=1
UseLowRightsUser=0
Password=e10adc3949ba59abbe56e057f20f883e
PasswordLow=
Template=litoral

密码可以通过一下命令行来取得
echo -n 你的密码 | md5sum | cut -d ' ' -f 1

如果要通过其它客户端远程管理,那么需要设置下面一行
AcceptExternalConnections=1

然后你可以使用amulecmd打开命令行看看,或者登录http://localhost:4711来web管理

好了,开始你的aMule之旅吧。:)


... Read more!

Ubuntu下Samba服务器的简单设置,只读,可读写等权限控制。

服务器:Ubuntu 10.04 LTS
Samba版本:3.4.7
注:本文不会对每个参数,设置的值具体是什么意思做深入的阐述,本文的目的是使用这些配置,立即可用。

1,samba的安装

Ubuntu下面安装samba服务器是很简单的。
$ sudo aptitude install samba

2,共享目录的创建

首先确定我们要提供共享的目录,比如我们在/hd1下面建立两个目录供远程用户访问,首先创建两个目录。
$ mkdir /hd1/landisk01
$ mkdir /hd1/landisk02
然后修改他们的权限,这步很重要,权限不对会直接影响远程用户可否访问
$ chmod 1777 /hd1/landisk01
$ chmod 1777 /hd1/landisk02

3,具体配置

安装完毕后,samba的服务就应该自动启动了。下面进行具体的配置。
samba配置文件位置:
/etc/samba/smb.conf
配置之前记得备份一下把。:)
我们的配置,是基于系统已经提供的smb.conf来进行的,有一些没有涉及到的地方,就默认的表示使用自动生成的smb.conf中的内容。
关于smb.conf的具体构成,以及每个设定变量详细的意思,可以参考samba的文档。
大体上有两段:[global]和[各共享资源名]

4,[global]段

首先来设置一下编码,好多朋友会遇到在Windows下面文件名出现乱码的情况。
我们添加如下设置:

   unix charset = UTF-8
   dos charset = CP936
   display charset = UTF-8

然后设置一下workgroup

   workgroup = WORKGROUP
   netbios name = s01

你还可以设置允许那些网段访问,比如

hosts allow = 10.0.1.0/24 10.0.10.0/24 127.0.0.1
它给出了10.0.1.x以及10.0.10.x网段,以及本机可以访问此samba服务

然后就到关于认证设置的地方了,我么使用以下设置

   security = user
   username map = /etc/samba/smbusers

   encrypt passwords = true

   passdb backend = tdbsam
关于/etc/samba/smbusers,我没有具体的看samba的手册,我启动服务器的时候提示我找不到这个文件,我就touch了一个,现在没有具体测试。先touch一个吧,记得用sudo
$ sudo touch /etc/samba/smbusers
回头看了准确的解释再补上:)

然后设置禁止root访问,以及不同步linux密码

   invalid users = root
   unix password sync = no

其它的地方保持默认吧,然后在往下,有关于打印机的设置,我是关闭打印机列表的。如下设置:

   load printers = no
   disable spoolss = yes

在进入资源定义区域之前,我追加了一个全局允许guest访问的。

   usershare allow guests = yes

到这里[global]定义就告一段落。下面进行各共享资源的定义。

5,共享资源定义

在默认自动生成的smb.conf文件中,你会看到默认的[share][home],这些就是共享名,意味着你在比如windows下面,你就会看到这些名字的共享盘一样。关于print***开头的,可以放在那边,即使有,也不会起作用,在客户端也看不到相关的打印机,在上面全局定义中已经关闭掉了。
然后我们开始自己的共享资源定义,先把[share][home]相关的内容都注释掉吧。我们将要定义两个共享资源,landisk01和landisk02,两个用户user01,user02,以及一个用户组group01。他们对于资源访问的权限如下。

------landisk01landisk02
user01读写只读
user02只读读写
group01只读只读
下面是对于landisk01资源的设定

[landisk01]
   comment = LanDisk 01, movies, musics and other.
   path = /hd1/landisk01
   browseable = yes
   writable = yes
   create mask = 0766
   force create mode = 0766
   directory mask = 0777
   force directory mode = 0777
   directory security mask = 0777
   force directory security mode = 0777
   guest ok = no

   # Users and Groups with access:
   valid users = user01 user02 @group01
   # Users and Groups with write access:
   write list = user01
   # Users and groups with read-only access:
   read list = user02 @group01

下面是对于landisk02的设置

[landisk02]
   comment = LanDisk 02
   path = /hd1/landisk02
   browseable = yes
   writable = yes
   create mask = 0766
   force create mode = 0766
   directory mask = 0777
   force directory mode = 0777
   directory security mask = 0777
   force directory security mode = 0777
   guest ok = no

   # Users and Groups with access:
   valid users = user01 user02 @group01
   # Users and Groups with write access:
   write list = user02
   # Users and groups with read-only access:
   read list = user01 @group01

如果你要对某个资源中,使用垃圾箱机制(删除文件时,不是完全删除,而是放入你指定的文件夹),你可以在某个资源中添加如下设置。

   # and recycle function
   # enable recycle
   vfs objects = recycle
   recycle:repository = .recycle
   # do not to keep the directory tree when move to recycle
   recycle:keeptree = no
   # change the name when file have same name
   recycle:versions = yes
   # do not to update the timestamp when move to recycle
   recycle:touch = no
   recycle:maxsize = 0
   recycle:exclude = *.tmp ~$*
会把你删除的文件,都放如到.recycle目录中,这个在客户机上看不到,你可以登陆到服务器看到.recycle中的内容。另外,这些仅仅对于你在客户端删除文件时起作用,你在服务器上使用rm操作,是不会起作用的。

好了,到这里为止,你的设置应该ok了,我们可以使用以下命令来check一下你的配置。
$testparm /etc/samba/smb.conf

6,重新启动一下你的samba服务器吧。

$ sudo service smbd restart
关于服务的名字是否一定叫smbd,我不敢肯定,我遇到过叫smb,也遇到过叫samba的,不知道为何。你可以使用tab来让系统给你提示吧。:)

7,添加相应用户

samba的用户,必须要基于一个linux用户,此linux用户是否可以实际登陆shell等,不受限制,通常我都是让samba的用户不具有登陆shell的权限。
首先,添加user01,user02,的Linux用户
$ sudo useradd -s /usr/sbin/nologin user01
$ sudo useradd -s /usr/sbin/nologin user02

然后使用pdbedit来追加相应的samba用户
$ sudo pdbedit -a -u user01
$ sudo pdbedit -a -u user02

要修改samba用户的用户密码,使用如下命令(实际Linux的密码并不会改变)
$ sudo smbpasswd user01
$ sudo smbpasswd user02

要删除一个samba用户(实际的linux用户并不会删除)
$ sudo pdbedit -x 用户名

OK,到此,你可以在远程用刚刚追加的用户尝试看看把。
END
... Read more!

偏门解决aMule下载文件名乱码问题+一次性添加多任务问题。

利用服务器空闲时间,慢慢的,勤勤恳恳的帮你下载东西,会是一种享受。:)
一直使用aMule,利用amule-daemon在后台下载,使用aMule-Web通过浏览器添加任务。本来是一件比较美好的事情,不过,由于某方面的原因,aMule-Web存在下面两点问题。
1,比较的不稳定,当你频繁的访问web页面的时候,可能动不动就会当掉。
2,虽然在web界面上那个添加连接上面加了Link(s),貌似可以一次性添加多连接,实际上只对第一条链接有效,我想这个应该算一个bug吧。

web页面的不稳定,尚可以忍受,若要添加20个链接,那么一条一条的添加,实在是麻烦。google了一下,有网友提供下面一个解决方法,在你aMule的HOME下面的.aMule里面,amule-daemon会自动侦测ED2KLinks文件,如果存在此文件,那么就处理里面的内容,然后删除。也就是说,我们可以一次性将多条连接放入此文件中,一个链接一行,然后后台会自动去下载他们。确实非常方便。当我尝试了一下,发现一个问题,下载出来的文件名如果含有非ASCII的话,那么全部变成乱码。这个令人非常头痛,看了一下ed2k的链接组成,查看了相关资料,找到了原因,这个是因为,从网站上拷贝ed2k链接的时候,非ASCII字符,都是被转换为了,基本上类似于被URIEndcode了,所以,你的到的这些乱码文件名用iconv,或者convmv都无法正确的转换出来。找到原因,那么就可以对症下药了,既然被URIEndcode了,那么我decode一下,不就的了,然后再加入到ED2KLinks文件中去。使用到了PHP-CLI,直接提供了decode命令。下面是详细的脚本。

                           
#!/bin/bash
ED2K_FILE=/home/aMule/.aMule/ED2KLinks
TMP=/tmp/$$.tmp
TMP2=/tmp/$$.tmp2

if [ "${EDITOR}" = "" ]; then
    EDITOR=/usr/bin/vim
fi

# accept input data from editor
${EDITOR} "$TMP"

while read line
do
    php -r "echo urldecode('${line}'.\"\n\");" >> "${TMP2}"
    # echo ${line}
done < "${TMP}"

cat ${TMP2} >> ${ED2K_FILE}

# remove temp file
rm -rf ${TMP}      rm -rf ${TMP2}


END
... Read more!

10 个最酷的 Linux 单行命令

下面是来自 Commandlinefu 网站由用户投票决出的 10 个最酷的 Linux 单行命令,希望对你有用。

  1. sudo !!

    以 root 帐户执行上一条命令。

  2. python -m SimpleHTTPServer

    利用 Python 搭建一个简单的 Web 服务器,可通过 http://$HOSTNAME:8000 访问。

  3. :w !sudo tee %

    在 Vim 中无需权限保存编辑的文件。

  4. cd -

    更改到上一次访问的目录。

  5. ^foo^bar

    将上一条命令中的 foo 替换为 bar,并执行。

  6. cp filename{,.bak}

    快速备份或复制文件。

  7. mtr google.com

    traceroute + ping。

  8. !whatever:p

    搜索命令历史,但不执行。

  9. $ssh-copy-id user@host

    将 ssh keys 复制到 user@host 以启用无密码 SSH 登录。

  10. ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg

    把 Linux 桌面录制为视频。


... Read more!

History(历史)命令用法 15 例 (from LinuxToy)

如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率。本文将通过实例的方式向你介绍 history 命令的 15 个用法。


使用 HISTTIMEFORMAT 显示时间戳
当你从命令行执行 history 命令后,通常只会显示已执行命令的序号和命令本身。如果你想要查看命令历史的时间戳,那么可以执行:


# export HISTTIMEFORMAT='%F %T '
# history | more
1  2008-08-05 19:02:39 service network restart
2  2008-08-05 19:02:39 exit
3  2008-08-05 19:02:39 id
4  2008-08-05 19:02:39 cat /etc/redhat-release
注意:这个功能只能用在当 HISTTIMEFORMAT 这个环境变量被设置之后,之后的那些新执行的 bash 命令才会被打上正确的时间戳。在此之前的所有命令,都将会显示成设置 HISTTIMEFORMAT 变量的时间。[感谢 NightOwl 读者补充]
使用 Ctrl+R 搜索历史
Ctrl+R 是我经常使用的一个快捷键。此快捷键让你对命令历史进行搜索,对于想要重复执行某个命令的时候非常有用。当找到命令后,通常再按回车键就可以执行该命令。如果想对找到的命令进行调整后再执行,则可以按一下左或右方向键。

# [Press Ctrl+R from the command prompt, which will display the reverse-i-search prompt]
(reverse-i-search)`red‘: cat /etc/redhat-release
[Note: Press enter when you see your command, which will execute the command from the history]
# cat /etc/redhat-release
Fedora release 9 (Sulphur)

快速重复执行上一条命令
有 4 种方法可以重复执行上一条命令:
  1. 使用上方向键,并回车执行。
  2. 按 !! 并回车执行。
  3. 输入 !-1 并回车执行。
  4. 按 Ctrl+P 并回车执行。
从命令历史中执行一个指定的命令
在下面的例子中,如果你想重复执行第 4 条命令,那么可以执行 !4:

# history | more
1  service network restart
2  exit
3  id
4  cat /etc/redhat-release
# !4
cat /etc/redhat-release
Fedora release 9 (Sulphur)

通过指定关键字来执行以前的命令
在下面的例子,输入 !ps 并回车,将执行以 ps 打头的命令:

# !ps
ps aux | grep yp
root     16947  0.0  0.1  36516  1264 ?        Sl   13:10   0:00 ypbind
root     17503  0.0  0.0   4124   740 pts/0    S+   19:19   0:00 grep yp

使用 HISTSIZE 控制历史命令记录的总行数
将下面两行内容追加到 .bash_profile 文件并重新登录 bash shell,命令历史的记录数将变成 450 条:

# vi ~/.bash_profile
HISTSIZE=450
HISTFILESIZE=450

使用 HISTFILE 更改历史文件名称
默认情况下,命令历史存储在 ~/.bashhistory 文件中。添加下列内容到 .bashprofile 文件并重新登录 bash shell,将使用 .commandline_warrior 来存储命令历史:

# vi ~/.bash_profile
HISTFILE=/root/.commandline_warrior

使用 HISTCONTROL 从命令历史中剔除连续重复的条目
在下面的例子中,pwd 命令被连续执行了三次。执行 history 后你会看到三条重复的条目。要剔除这些重复的条目,你可以将 HISTCONTROL 设置为 ignoredups:

# pwd
# pwd
# pwd
# history | tail -4
44  pwd
45  pwd
46  pwd [Note that there are three pwd commands in history, after executing pwd 3 times as shown above]
47  history | tail -4
# export HISTCONTROL=ignoredups
# pwd
# pwd
# pwd
# history | tail -3
56  export HISTCONTROL=ignoredups
57  pwd [Note that there is only one pwd command in the history, even after executing pwd 3 times as shown above]
58  history | tail -4

使用 HISTCONTROL 清除整个命令历史中的重复条目
上例中的 ignoredups 只能剔除连续的重复条目。要清除整个命令历史中的重复条目,可以将 HISTCONTROL 设置成 erasedups:

# export HISTCONTROL=erasedups
# pwd
# service httpd stop
# history | tail -3
38  pwd
39  service httpd stop
40  history | tail -3
# ls -ltr
# service httpd stop
# history | tail -6
35  export HISTCONTROL=erasedups
36  pwd
37  history | tail -3
38  ls -ltr
39  service httpd stop
[Note that the previous service httpd stop after pwd got erased]
40  history | tail -6

使用 HISTCONTROL 强制 history 不记住特定的命令
将 HISTCONTROL 设置为 ignorespace,并在不想被记住的命令前面输入一个空格:

# export HISTCONTROL=ignorespace
# ls -ltr
# pwd
#  service httpd stop [Note that there is a space at the beginning of service, to ignore this command from history]
# history | tail -3
67  ls -ltr
68  pwd
69  history | tail -3
使用 -c 选项清除所有的命令历史
如果你想清除所有的命令历史,可以执行:
# history -c
命令替换
在下面的例子里,!!:$ 将为当前的命令获得上一条命令的参数:

# ls anaconda-ks.cfg
anaconda-ks.cfg
# vi !!:$
vi anaconda-ks.cfg

补充:使用 !$ 可以达到同样的效果,而且更简单。[感谢 wanzigunzi 读者补充]
下例中,!^ 从上一条命令获得第一项参数:

# cp anaconda-ks.cfg anaconda-ks.cfg.bak
anaconda-ks.cfg
# vi -5 !^
vi anaconda-ks.cfg

为特定的命令替换指定的参数
在下面的例子,!cp:2 从命令历史中搜索以 cp 开头的命令,并获取它的第二项参数:

# cp ~/longname.txt /really/a/very/long/path/long-filename.txt
# ls -l !cp:2
ls -l /really/a/very/long/path/long-filename.txt

下例里,!cp:$ 获取 cp 命令的最后一项参数:

# ls -l !cp:$
ls -l /really/a/very/long/path/long-filename.txt
使用 HISTSIZE 禁用 history
如果你想禁用 history,可以将 HISTSIZE 设置为 0:

# export HISTSIZE=0
# history
# [Note that history did not display anything]
使用 HISTIGNORE 忽略历史中的特定命令
下面的例子,将忽略 pwd、ls、ls -ltr 等命令:

# export HISTIGNORE=”pwd:ls:ls -ltr:”
# pwd
# ls
# ls -ltr
# service httpd stop
# history | tail -3
79  export HISTIGNORE=”pwd:ls:ls -ltr:”
80  service httpd stop
81  history
[Note that history did not record pwd, ls and ls -ltr]


... Read more!

Shell中,命令行参数的遍历

一直以来对命令行输入的参数遍历处理的时候,我都是采用下面的代码。


for p in $#
do
echo "$p"
done


但是最近写了一个工具,用来批量处理视频文件,由于文件名中含有一些空格,中括号之类的特殊字符,使用上面的代码处理就经常会取不出来一个完整的文件名。google了一下,可以使用shift命令,如下面的代码。

while [ $# -gt 0 ]
do
echo "$1"
shift
done


参考44.17 Handling Arguments with while and shift
--END--
END
... Read more!

linux下的下载工具axel

linux下最常用的下载工具应该算wget了,但是不满足于wget的下载速度。axel是一个linux下的下载加速工具,它支持多线程下载,而且如果你愿意的话,它还可以到filesearching.com搜索镜像文件下载。
常用的参数:


-n xx 指定线程数为xx
-Sxx 指定从xx个镜像下载
-a 按不刷屏方式显示

例子:
axel ftp://ftp.{be,nl,uk,de}.kernel.org/pub/linux/kernel/v2.4/linux-2.4.17.tar.bz2
从 Belgian, Dutch, English 和 German 的kernel.org镜像下载linux-2.4.17内核

axel -S4 ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.17.tar.bz2
从filesearching.com搜索4个最快的镜像(如果有的话)下载linux-2.4.17内核

alex -n 10 -o /home/kennycx/ http://xxxx/jre.tar.gz

基本的用法如下: #axel [选项] [下载目录] [下载地址]

-s x Specify maximum speed (bytes per second)
-n x Specify maximum number of connections
-o f Specify local output file
-S [x] Search for mirrors and download from x servers
-N Just don't use any proxy server
-q Leave stdout alone
-v More status information
-a Alternate progress indicator
-h This information
-V Version information

--END--

... Read more!

zsh中使用nohup的问题

通常我们要让一个命令在后台运行,都是使用nohup加上&来进行的。但是昨天发现在zsh中,nohup竟然不起反应,随着我logout出shell,此后台任务也中止了。search了一下,可以使用下面的参数


unsetopt hup

来让zsh logout的时候不发送hup信号。

END
... Read more!

debian在VMWare下面,网卡的问题。

懒得重新安装,直接那以前安装过的旧版本的debian的vmware镜像来用了,但是发现启动的时候无法正常启动网卡,使用ifup eth的时候出现下面的错误:

# ifup eth0
SIOCSIFADDR: No such device
eth0: ERROR while getting interface flags: No such device
SIOCSIFADDR: No such device
SIOCSIFADDR: No such device
eth0: ERROR while getting interface flags: No such device
eth0: ERROR while getting interface flags: No such device
通过查找资料发现是迁移虚拟机导致虚拟机配置文件中的mac地址和debian系统的mac地址不一致导致。
解决办法:
在虚拟机目录中用文本编辑器打开*.vmx,找到ethernet0.generatedAddress字段,记下mac地址。(在osx下面,vmx文件被包起来了,用vim打开你就会看到.vmx文件)
启动debian,编辑/etc/udev/rules.d/z25_persistent-net.rules,用新的mac地址替换旧的mac地址,重启debian即可。打开上述文件的时候可能会发现存在一个eth1,它的mac地址就是你刚才看到的vmx中的新的mac的地址,注释掉eth1吧。
~END~
... Read more!

让你的manpages拥有丰富的色彩

在默认状态下man命令出来的page页都是单纯的黑白的。可以通过定制terminfo信息丰富其色彩。
在你的主目录中,


$ mkdir ~/.terminfo/ && cd ~/.terminfo
$ wget http://nion.modprobe.de/mostlike.txt
$ tic mostlike.txt

修改~/.bashrc,或者你对应的脚本文件,加上这行:alias man="TERMINFO=~/.terminfo/ LESS=C TERM=mostlike PAGER=less man"
END
... Read more!

htop - 一个交互的进程查看器

一直使用top命令查看系统状态,也总是觉得此命令的结果存在很多不足,今天终于挖出了一个top的豪华版。在这里http://linuxtoy.org/archives/htop.html发现了这个东东,看截图。
htop
转一下htop的优点吧
htop——一个可以让用户与之交互的进程查看器。作为文本模式的应用程序,主要用于控制台或 X 终端中。当前具有按树状方式来查看进程,支持颜色主题,可以定制等特性。
与 top 相比,htop 包含的优点有:
1. 可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行。
2. 在启动上,比 top 更快。
3. 杀进程时不需要输入进程号。
4. htop 支持鼠标操作。
5. top 已经很老了。

... Read more!

vmstat,top结果详解

1,vmstat介绍
Procs
-r: 运行的和等待(CPU时间片)运行的进程数,这个值也可以判断是否需要增加CPU(长期大于1)
-b: 处于不可中断状态的进程数,常见的情况是由I/O引起的。

MEMORY

-swap:切换到交换内存上的内存(默认以KB为单位)
如果SWAP的值不为0,或者还比较大,比如超过100M了,但是SI,SO的值长期为0,这种情况我们可以不用担心,不会影响系统性能。
-free:p空闲的物理内存
- buff:作为buffer cache的内存,对块设备的读写进行缓冲
-cache:作为page cache的内存,文件系统的cache
如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。

SWAP
-si:交换内存使用,由磁盘调入内存
-so:交换内存使用,由内存调入磁盘
内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。
我发现有些朋友看到空闲内存(FREE)很少的或接近于0时,就认为内存不够用了,实际上不能光看这一点,还要结合si,so,如果free很少,但是si,so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

IO
-bi:从块设备读入的数据总量(读磁盘)(KB/S)
-bo:写入到块设备的数据总量(写磁盘)(KB/S)
随机磁盘读写的时候,这2个值越大(如超出1M),能看到CPU在IO等待的值也会越大

SYSTEM
--in:每秒产生的中断次数
--cs:每秒产生的上下文切换次数
上面2个值越大,会看到由内核消耗的CPU时间会越大

CPU
-us:用户进程消耗的CPU时间百分
us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速(比如PHP/PERL)
-sy:内核进程消耗的CPU时间百分比(sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因)
-wa:IO等待消耗的CPU时间百分比
wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
-id:CPU处于空闲状态时间百分比
情景分析:
vmstat的输出哪些信息值得关注?
--proc r:运行的进程比较多,系统很繁忙
--IO bo:磁盘写的数据量稍大,如果大文件的写,10以内基本不用担心,如果是小文件2M以前基本正常,
--CPU us:持续大于50,服务高峰期可以接受
--CPU wa:稍微有些同
--CPU id:持续小于50,服务高峰期可以接受

2,TOP命令:

这个命令可以查看系统中运行的进程的状况,CPU使用状况,系统负载,内存使用等。它是检查系统进程运行状况最方便的工具了。它默认显示部分活动的进程,并按照进程使用CPU的多少排序,
top参数:
-D 不可中断休眠,通常是IO操作处的状态
-R 正在执行的或者处在等街待的进程队列中
-S 休眠中
-T 暂停刮起的
-Z 僵尸进程,进程执行完成,但由于其父进程没有销毁该进程,而被INIT进程接管进行销毁。
-W 没有使用物理内存,所占用的物理内存被切换到交换内存
-N 低优先级

... Read more!

Linux中内存占有率高的问题,以及如何查看当前内存使用情况。

Linux在内存管理上和Windows有很大的不同。在Windows中,通常会通过任务管理器去看当前系统使用了多少内存,以此来判断内存是否充足。但是在Linux中就不一样,如果你用top命令来看当前系统进程情况,你可能会看到例如下面的内存使用结果:

Mem:   1555040k total,  1509124k used,    45916k free,    13280k buffers

used值几乎达到了100%。但是,这个并不是意味着真正的内存使用量。很多人特别是Linux的初级使用者,包括我刚刚接触Linux的时候也提过这样的问题:为何我的内存占有率这么高?
记住内存是拿来用的!不是拿来看的,不象windows,无论你的真实物理内存有多少,他都要拿硬盘交换文件来读。这也就是windows为什么常常提示虚拟空间不足的原因。Linux 优先使用物理内存,当物理内存还有空闲时,linux是不会释放内存的。即使占用内存的程序已经被关闭了(这部分内存就用来做缓存了)。
但是,如何才能得知目前的物理内存是够用的呢?我们可以通过vmstat命令来查看当前虚拟内存的使用情况。
比如下面的vmstat的结果

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 0 23776 50568 13280 948680 0 0 12 28 17 182 1 0 99 0

简单的我们可以看swap的si和so,内存够用的时候,这2个值都是0。如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。空闲内存(FREE)很少或接近于0时,不代表内存不够用了,还要结合si,so,如果free很少,但是si,so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。
你可以用 free 指令查看一下输出,用 used 减去 buffer 和 cache,才是你运行中的程序所占用的空间。

... Read more!

Linux内核全图

类似于一个map一样,你可以只有缩放,点击查看详细信息等等。
http://www.makelinux.net/kernel_map

... Read more!