Category: Linux

  • find命令

    linux里最重要的命令之一,可使用的选项之多令人无法记住,还好可以用man find来查询,下面以例子来学习,掌握最基础的先

    查找文件名为foobar

    find -name "foobar"

    查找不同文件后缀, 用 -o 连接

    find . -name "*.tf" -o -name "*.hcl" -exec cat {} \;

    不区分大小写查找 foobar

    find -iname "foobar"

    从 / 查找文件并限制查找的深度

    find / -maxdepth 2 -name passwd

    查找并计算 md5sum 值,后面参数不能省略

    find -iname "MyCprogram.c" -exec md5sum {} \;
    find -iname "MyCprogram.c" -exec md5sum {} +

    查到不包含某字符串的文件(反查)

    find -maxdepth 1 -not -iname "MyCProgram.c"

    根据 inode number 查找文件

    ls -li *
    find ./ -inum 17735

    对于乱码文件根据 inum 查找并删除

    find ./ -inum 17744 -exec rm {} +

    查找等于10KB的文件:

    find . -size 10k

    查找大于100KB的文件:

    find . -type f -size +100k
    查找大于100MB的文件:
    find . -type f -size +100M
    查找大于1GB的文件:
    find . -type f -size +1G

    查找空文件 并删除

    find ~ -empty
    find /path/to/dir -empty -type f -delete
    

    查找空目录 并删除

    find ~ -empty -type d
    find /path/to/dir -empty -type d -delete
    

    查找home目录中的所有文件

    find $HOME -print
    或
    find ~ -print

    查找当前目录中权限是644的文件

    find . -type f -perm 644 -exec ls -l {} \;

    查找系统中所有文件长度为0的普通文件,并列出它们的完整路径

    find / -type f -size 0 -exec ls -l {} \;

    查找/var/log/目录中更改时间在7日以前的普通文件(即保留最近7天的),并在删除之前询问

    find /var/log/ -type f -mtime +7 -ok rm {} \;

    查找/var/log目录中访问时间在7天以内的文件

    find /var/log/ -type f -mtime -7

    查找比某个文件更新的文件

    find -newer filename

    查找/var/log目录中messages.*.gz文件

    find /var/log/ -name "messages.*.gz"

    查找当前目录下,属组是root的文件

    find . -group root -exec ls -l {} \;

    对当前目录(包含子目录)进行排序

    find . -type d | sort

    与其他命令结合统计代码量

    find ./ -name '*' | xargs wc -l

    做一些漂亮的 alias 删除程序生成的临时文件或某种类型文件

    alias rmao="find . -iname a.out -exec rm {} \;"
    alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} \;"
    alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} \;"
    alias rm2g="find / -type f -name *.tar -size +2G -exec rm -i {} \;"
    alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} \;"
    
  • linux的分区格式化,挂载

    在服务器使用过程中,某分区不够用,服务器只有一个硬盘,当时装系统之时,有一个sda3分区未使用。

    现将其格式化为ext3格式,挂载到/data下面,并且开机要自动挂载。

    这里先使用parted,它是一个调整分区的工具,不过现在使用它的显示功能,并不对硬盘做修改。p 代表print ,查看当前分区情况:

    #parted

    GNU Parted 2.1
    Using /dev/sda
    Welcome to GNU Parted! Type ‘help’ to view a list of commands.

    (parted) p

    Model: ATA ST31000528AS (scsi)
    Disk /dev/sda: 1000GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos

    Number Start End Size Type File system Flags
    1 1049kB 211MB 210MB primary ext3 boot
    2 211MB 2358MB 2147MB primary linux-swap(v1)
    3 2358MB 1000GB 998GB primary

    (parted) quit

    可以发现sda3没有显示file system,说明未格式化,现使用mkfs.ext3来把sda3格式化

    mkfs.ext3 /dev/sda3

    mke2fs 1.41.12 (17-May-2010)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    60907520 inodes, 243614264 blocks
    12180713 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=4294967296
    7435 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
    102400000, 214990848

    Writing inode tables: done
    Creating journal (32768 blocks): done
    Writing superblocks and filesystem accounting information: done

    This filesystem will be automatically checked every 33 mounts or
    180 days, whichever comes first. Use tune2fs -c or -i to override.

    现在重新查看分区情况,已经是ext3

    3 2358MB 1000GB 998GB primary ext3

    创建目录/data,作为sda3的挂载点

    mkdir /data
    mount -v /dev/sda3 /data/

    为了之后开机挂载,在/etc/fstab写入如下一行

    /dev/sda3               /data                   ext3    defaults        1 1
  • mysql数据库空间用满时,巧用软链接转移

    参考:http://www.webhostingtalk.com/showthread.php?t=1086919

    对于一些做SEO的人来说,/var/lib/mysql 和 /var/www 是两个占用空间的大户,下面以数据库为例,将/var/lib/mysql下的数据库移动到较大的/home下,并使用软链接将/home/mysql 链接到/var/lib/mysql,实现充分利用空间的目的。

    在这些网站都不在使用的时候,停用mysql,apache

    /etc/init.d/mysqld stop
    /etc/init.d/httpd stop

    使用rsync完整的将数据拷贝(-a archive mode归档模式 -v verbos显示详细 )

    rsync -av /var/lib/mysql /home/

    这个过程根据数据量的不同时间不同,数据很大的话建议使用screen

    接下来看一下大小,如果以上命令都完全执行完的话,是不会出现什么问题的

    du -sh /var/lib/mysql
    du -sh /home/mysql

    将旧的/var/lib/mysql移走,随便移到什么地方,实再不需要删掉也行

    mv /var/lib/mysql /var/lib/mysql-bak

    创建软链接

    ln -s /home/mysql /var/lib/mysql

    之后一定要再次确认上面的软链接链接到对的地方,如果不正确mysql一启动就麻烦了。

     

    #######ubuntu用户注意 begin#######

    如果使用ubuntu下apt-get安装的mysql版本,还需如下操作

    vim /etc/apparmor.d/usr.sbin.mysqld

    将如下两行注释

    /var/lib/mysql/ r,
    /var/lib/mysql/** rwk,

    变更为(可能是因为apparmor不支持软链接)

    /home/mysql/ r,
    /home/mysql/** rwk,

    重启apparmor

    /etc/init.d/apparmor restart

    #######ubuntu用户注意 end#######

     

    之后启动mysql,apache

    /etc/init.d/mysqld start
    /etc/init.d/httpd start

    这样以后所有的mysql数据的位置就在/home/mysql里了。

    另一种解决方案:不用软链接而直接将数据库转移到目录/mnt/sx_disk

    rsync -av /var/lib/mysql /mnt/sx_disk/

    之后在/etc/my.cnf中,将[mysqld]中的如下参数改为

    [mysqld]
    datadir=/mnt/sx_disk/mysql
    socket=/mnt/sx_disk/mysql/mysql.sock

    只这样还不行,会出现

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

    另外需添加

    [client]
    port=3306
    socket=/mnt/sx_disk/mysql/mysql.sock

    这样数据库就存为了新的位置/mnt/sx_disk目录中。

    如果同是ubuntu下mysql的话,也需要按上面的方式修改/etc/apparmor.d/usr.sbin.mysqld

  • linux工具之iftop/bmon

    ubuntu下安装 apt-get install iftop

    此命令只有root才可以运行

    iftop -i eth0

    界面说明:

    TX发送的速度
    RX收到的速度
    Cumm:总流量
    peak:流量峰值
    rates:2s 10s 40s 的平均流量

     

    -B 以Bytes为单位显示流量(默认是bits),如:# iftop -B
    -n 使host信息默认直接都显示IP,如:# iftop -n
    -N 使端口信息默认直接都显示端口号,如: # iftop -N
    -F 显示特定网段的进出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0

    bmon

    按g显示动态的流量随时间变化

    按d显示详细的数据

  • wordpress备份策略

    参考:http://codex.wordpress.org/WordPress_Backups

    备份的方式

    我自己的方式是

    #!/bin/bash
    DBNAME=wordpress
    DBPASS=root
    DBUSER=root
    #Keep the " around your address
    EMAIL="[email protected]"
    #Change the 'wp_' to match your table_prefix in the database
    mysqldump --opt -u $DBUSER -p$DBPASS $DBNAME > backup.sql
    gzip backup.sql
    DATE=`date +%Y%m%d` ; mv backup.sql.gz $DBNAME-backup-$DATE.sql.gz
    echo 'Blog Name: Your mySQL Backup is attached' | /usr/bin/mutt $EMAIL -a $DBNAME-backup-$DATE.sql.gz -s "MySQL Backup"
    rm $DBNAME-backup-$DATE.sql.gz

    记录:通过上述方法在2012年10月31日yardvps挂掉换linode,恢复成功。

  • SSL证书安装检测

    这两天遇到问题:支付宝在https下不能正常返回支付成功的消息,几经周折,支付宝技术人员给出了日志

    unable to find valid certification path to requested target

    之后给出了SSL检测结果:The intermediate CA certificates cannot be found for the following certificate chain.

    ssl checker

    这才发现是CA证书没安好,回头去https://www.thawte.com重新找到了CA证书才安装检测通过。

    这个是SSL是否安装成功的检测页面,需安好java:

    https://search.thawte.com/support/ssl-digital-certificates/index?page=content&id=SO9555

    如果你的浏览器比较新如IE9,chrome,可以使用 https://ssl-tools.verisign.com/ 可以检测CSR请求和crt证书。