计算这篇短文的字符数(含dnf空白字符)共有多少

 上传我的文档
 上传文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
java面向对象 实验十一 文件处理
下载积分:2000
内容提示:java面向对象 实验十一 文件处理
文档格式:DOC|
浏览次数:18|
上传日期: 12:17:35|
文档星级:
全文阅读已结束,如果下载本文需要使用
 2000 积分
下载此文档
该用户还上传了这些文档
java面向对象 实验十一 文件处理
关注微信公众号JAVA第八次实验:异常处理_中华文本库
第5页/共10页
有下面的文本文件“Early-Precaution.txt”,
(1)计算这篇短文的字符数(含空白)共有多少? import java.io.*;
public class f{
public static void main(String[]args){ FileInputStream s=
s=new FileInputStream("D:\\java\\ss.txt");
}catch(FileNotFoundException e){
System.out.println("找不到指定文件");}
int b=0,num=0;
while((b=s.read())!=-1){
s.close();
System.out.println("共读取了"+num+"字节");
}catch(IOException ee){
System.out.println("文件读取错误");
import java.io.*;
public class f{
第5页/共10页
寻找更多 ""Posts - 282,
Articles - 0,
Comments - 0
18:15 by kingshow, ... 阅读,
写英语作文的时候,常常要求满足一定的字数,在以往,要么,我们一个一个地数,要么,我们估算一行的单词数,然后用行数进行估算。第一种方法太费时,如果要是写个长篇大论,那几乎是mission imposible,而第二种方法有不太准确。这就给我们留下了一个问题:如何又快又准确地统计一篇英文文章中的单词数?
程序,就是用来帮助人们完成这些看起来枯燥繁琐但是带有一定规律性的事情的。
要解决这个问题,最自然的想法是,读取文章的所有内容(用fopen()和fgets()),然后一个单词一个单词地统计,然而,我们在这里遇到了一个难题:程序看不懂英文,他如何知道什么是一个单词,什么不是一个单词呢?我们似乎在这里遇到了障碍,可是,如果我们换个角度思考问题,也许会柳暗花明又一村:我们注意到,文章中的单词都是用空格间隔开的,那么换句话说,也就是
单词数=空格数+1
程序不认识单词,但是程序认识空格啊。这样,整个问题实际上转换为了统计文章中的空格数。
有了这样的问题转换,整个问题就简单多了。你可以先按照这个思路自己实现,先来看看这个小例子代码实现:
* wordcounts1.c
Created on: 日17:15:00
Author: Bruce
#include &stdio.h&
#include &string.h&
int main()
//假设需要统计的字符串都保存在str字符数组中
char str[128] = "This is a C program!";
//用于保存空格字符数的变量
int numWhiteSpace = 0;
//循环遍历整个字符数组,统计空格字符数
int i = 0;
while('\0' != str[i])
//判断当前字符是否是空格
if(' ' == str[i]){
++numWhiteS
//空格数加1
++i; //检查下一个字符
//输出字符串中的单词数,也就是空格数加1.
printf("There are %d words in \"%s\"",numWhiteSpace+1,str);
&&&& 简单的29行代码,就可以帮我们数出一个字符串中的单词数, 学了C语言,解决问题就是这么简单啦。 这里,我们只是简单地统计了一个简单字符串中的单词数,那么,如何对一篇英文文章中的单词数进行统计呢? 如何对这个程序进一步优化使其更加合理呢?欲知后事如何,且看下面。 学了C语言,如何写一个程序统计一篇英文文章中的单词数?(续)
&&&& 要在原程序的基础上进行扩展,实现对文章中单词数的统计,我们有两个工作要做:
将原来全部放在main()函数中进行的单词统计功能抽取出来,单独成一个独立的函数countword(),它可以接受一个char*类型的参数,返回的是这个指针所指向的字符串中的单词数。这里需要注意的是,因为在文章中,换行也会分割单词,所以我们也应将换行字符&\n&统计在内。
单独地利用fopen()以及fgets()等操作文件的函数,将文件中的字符串读取到一个字符数组中,供上一步完成的countword()函数进行统计。这些工作都提取到read()函数中完成。
经过这样的分析我们程序在main()函数中要完成的工作也就清晰了,首先用read()函数读取文件到一个字符数组,然后用countword()函数对读取得到的字符串中的单词数进行统计。
经过这样的分析,再结合我们在《C程序设计伴侣》中学到的文件读写,字符串处理,main()函数的参数等知识,整个程序的实现就很简单了。
* wordcounts2.c
Created on: 日17:15:00
Author: Bruce
#include &stdio.h&
#include &string.h&
#include &stdbool.h&
//读取文件到字符数组中
bool read(const char * file,char * str)
if(NULL == file || NULL == str)
return false;
//以只读方式打开文件
FILE * fp = fopen(file,"r");
if(NULL != fp)
//用fgets()函数读取文件
char line[128] = "";
while(fgets(line,128,fp) != NULL)
//将读取得到的字符串保存到目标数组中
strcat(str,line);
//关闭文件
fclose(fp);
fp = NULL;
return true;
printf("Cannot open %s.",file);
return false;
int countWord(char * text)
if(NULL != text)
//循环遍历整个字符数组,统计空格字符以及换行字符数
int i = 0;
int num = 0; //空格或换行字符数
while('\0' != text[i])
//判断当前字符是否是空格或者换行字符,如果是,则统计
if(' ' == text[i] || '\n' == text[i])
++i; //检查下一个字符
return num+1; // 返回单词数目
int main( int argc, char * argv[])
if(argc != 2)
puts("ARGUMENS ERROR. eg. count demo.txt");
char text[1028*10] = "";
if(read(argv[1],text))
int n = countWord(text);
// 输出字符串中的单词数,也就是空格数加1
printf("there is(are) %d word(s) in the \"%s\"",n,argv[1]);
gcc countword.c &o countword.exe
将其编译成countword.exe应用程序,并用下面的命令统计一篇文章的单词数:
countword.exe demo.txt
这样,我们就可以用这个程序统计一篇英文文章中的单数了,再也不用一个个数的头晕眼花了。这正是体现了程序的作用,帮助人类又快又好地完成一些繁琐而有规律的工作。
可是,当用过一段时间后,我们却发现程序统计的结果并不是那么准确,有时会多统计几个单词,这又是为什么呢?这个新问题又该如何解决呢?欲知后事如何,在往下看。
&&&&& 上面说到我们对字符数实现简单扩展,使其可以统计一整片文章中的单词数。然而在使用的时候,我们却发现其统计的单词数并不是很准确,有时候多统计了,有时候又少统计了。当程序的执行结果与我们的预期相左时,这就意味着我们的程序中出现了臭虫,也就是传说中的Bug。
&&&&& 那么这个臭虫在哪儿呢?如何找到具体的位置并把他消灭呢?这时就需要用到我们的调试技术了。所谓调试,也就是在程序中设置断点(程序执行过程中暂停的位置,在Visual Studio中,可以使用F9在光标当前行设置断点,当在调试模式下,即用F5调试运行程序时,程序会在此暂停,这样我们就可以观察程序的中间运行情况。),然后用F10单步运行程序,观察程序的执行情况同算法的预想情况有什么差别,当出现差别的地方,就是Bug所在的地方。通过调试,我们发现在原来的程序中有这样两个问题:
错误地对连续的多个空格字符进行了统计。连续的多个空格字符,也只是起一次分割作用,但是程序却不管这些,只要遇到空格就统计在内,将多个空格分隔的两个单词统计成了多个单词,所以产生了多统计的情况。
没有统计标点符号。除了空格之外,在文章中起分割作用的还有标点符号,比如逗号,句号等等,这些分割符号都没有统计在内,所以用逗号分割的两个单词被统计成了一个单词,因而出现了少统计的情况。
我们找到了产生Bug的原因,那么如何解决呢?
&&&& 很自然的想法就是见招拆招。对第一个bug,一种方式是对文章进行预处理,删除其中的冗余的空格,另一种方法是将冗余的连续多个空格字符替换为有效字符,这两种方法都是为了达到只保留一个空格字符的目的。
面对第二个bug,解决办法就是将其他分割字符也统计在内,包括逗号,句号,问号,感叹号,冒号,省略号,破折号,前引号,后引号,斜杠,反斜杠,等等等等。
这样的解决方法虽然简单直观,可是却比较难以实现:第一个,需要对文章进行预处理,找到并删除其中的冗余空格不是一件容易的事情,需要遍历整个字符串。第二个,文章中的分割符号种类举不胜举,如何保证所有分割符号都统计在内了?看来,上面的方法行不太通,我们只好另辟蹊径了。
回到问题的原点,我们要统计的是一篇文章中的单词数,我们注意到单词有这样一个简单的特征:总是以非字母字符(比如,空格,逗号)后的字母字符开始,并用字母字符一直延续,直到再次遇到非字母字符作为结束,利用这个特征,我们就可以定义确定一个单词了。
&&&& 另外,我们还注意到这样一个规律:整篇文章的单词数等于已经找到的单词数加上剩余部分的单词数,像这种可以把一个大问题拆分成多个相似的小问题来解决的情况,最自然的解决方法就是递归(参考的7.6 函数的递归调用&&统计字符串出现的次数 函数的递归调用)这种思路来解决。
按照上面的简单分析,我们可以将整个程序改写如下:
* wordcounts3.c
Created on: 日17:15:00
Author: Bruce
#include &stdio.h&
#include &string.h&
#include &stdbool.h&
//读取文件到字符数组中
bool read(const char * file,char * str)
if(NULL == file || NULL == str)
return false;
//以只读方式打开文件
FILE * fp = fopen(file,"r");
if(NULL != fp)
//用fgets()函数读取文件
char line[128] = "";
while(fgets(line,128,fp) != NULL)
//将读取得到的字符串保存到目标数组中
strcat(str,line);
//关闭文件
fclose(fp);
fp = NULL;
return true;
printf("Cannot open %s.",file);
return false;
//统计字符串中单词数
int countWord(char * text)
//开始寻找开始位置
//一直从字符串开始位置向后寻找
//直到遇到一个字母字符
while(!isalpha(*text))
// 如果找到了字符串结束位置,
// 意味着整个字符串寻找完毕,
// 结束整个递归
if('\0' == *text)
++ // 查找下一个字符
while(isalpha(*text))
// 如果当前字符是字母字符
// 则继续查找下一个字符
return 1 + countWord(text);
int main( int argc, char * argv[])
if(argc != 2)
puts("ARGUMENS ERROR. eg. count demo.txt");
char text[1028*10] = "";
if(read(argv[1],text))
int n = countWord(text);
// 输出字符串中的单词数,也就是空格数加1
printf("there is(are) %d word(s) in the \"%s\"",n,argv[1]);
&&& 经过这样的改进,这个程序就可以处理比较复杂混乱的文章了,例如,下面这么神经分裂的文章,他都能够正确处理:
tought is a seed,d ? and action i,& s a tree .
&&&& 到这里,整个统计文章中单词数的问题算是比较圆满地解决了。这里只是简单地分析了一下解决问题的思路,要想完全理解并掌握,还需要进一步深入的学习C语言的知识并熟练运用。这是中的一个实际例子的改变,书中还有很多其他类似的有趣的例子,有兴趣的同学可以参考。
最后发现,学了C语言,还是可以做很多事情的,农民用镰刀改变世界,工人用斧头改变世界,我们用代码改变世界。自豪吧,程序员!
转自:好知网干货!一篇文章集合所有Linux基础命令,适合所有菜鸟学习和老手回顾!
时间: 14:33:44
&&&& 阅读:1125
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&1 文件{
# 按时间倒叙列出所有目录和文件 ll -rt
touch file
# 创建空白文件
rm -rf 目录名
# 不提示删除非空目录(-r:递归删除 -f强制)
# windows文本转linux文本
# linux文本转windows文本
enca filename
# 查看编码
安装 yum install -y enca
# 查看md5值
ln 源文件 目标文件
ln -s 源文件 目标文件
# 符号连接
readlink -f /data
# 查看连接真实目录
cat file | nl |less
# 查看上下翻页且显示行号
# 查看文件开头内容
head -c 10m
# 截取文件中10M内容
split -C 10M
# 将文件切割大小为10M -C按行
tail -f file
# 查看结尾 监视日志文件
tail -F file
# 监视日志并重试, 针对文件被mv的情况可以持续读取
# 检查文件类型
# 更改默认权限
# 删除重复的行
# 重复的行出现次数
# 只显示不重复行
# 将两个文件合并用tab键分隔开
paste -d‘+‘ a b
# 将两个文件合并指定‘+‘符号隔开
paste -s a
# 将多行数据合并到一行用tab键隔开
chattr +i /etc/passwd
# 不得任意改变文件或目录 -i去掉锁 -R递归
# 向下分面器
locate 字符串
wc -l file
# 查看行数
cp filename{,.bak}
# 快速备份一个文件
# 拷贝不提示 既不使用别名 cp -i
# 将行中的字符逆序排列
comm -12 2 3
# 行和行比较匹配
iconv -f gbk -t utf8 原.txt & 新.txt
# 转换编码
rename 原模式 目标模式 文件
# 重命名 可正则
watch -d -n 1 ‘ ls -FlAt /path‘
# 实时某个目录下查看最新改动过的文件
/rhel4.6.iso9660
# 制作镜像
diff suzu.c suzu2.c
& sz.patch
# 制作补丁
patch suzu.c & sz.patch
# 安装补丁
# 指定排序时所用的栏位分隔字符
# 依照数值的大小排序
# 以相反的顺序来排序
# 排序时,将小写字母视为大写字母
# 排序时,处理英文字母、数字及空格字符外,忽略其他的字符
# 检查文件是否已经按照顺序排序
# 忽略每行前面开始处的空格字符
# 前面3个字母依照月份的缩写进行排序
# 将几个排序好的文件进行合并
# 指定临时文件目录,默认在/tmp
+&起始栏位&-&结束栏位&
# 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
# 将排序后的结果存入指定的文
# 按数字排序
# 按数字倒叙
# 过滤重复行
sort -m a.txt c.txt
# 将两个文件内容整合到一起
sort -n -t‘ ‘ -k 2 -k 3 a.txt
# 第二域相同,将从第三域进行升降处理
sort -n -t‘:‘ -k 3r a.txt
# 以:为分割域的第三域进行倒叙排列
sort -k 1.3 a.txt
# 从第三个字母起进行排序
sort -t" " -k 2n -u
# 以第二域进行排序,如果遇到重复的,就删除
# linux文件无创建时间
# Access 使用时间
# Modify 内容修改时间
# Change 状态改变时间(权限、属主)
# 时间默认以24小时为单位,当前时间到向前24小时为0天,向前48-72小时为2天
# -and 且 匹配两个条件 参数可以确定时间范围 -mtime +2 -and -mtime -4
# -or 或 匹配任意一个条件
find /etc -name "*http*"
# 按文件名查找
find . -type f
# 查找某一类型文件
find / -perm
# 按照文件权限查找
find / -user
# 按照文件属主查找
find / -group
# 按照文件所属的组来查找文件
find / -atime -n
# 文件使用时间在N天以内
find / -atime +n
# 文件使用时间在N天以前
find / -mtime +n
# 文件内容改变时间在N天以前
find / -ctime +n
# 文件状态改变时间在N天前
find / -mmin +30
# 按分钟查找内容改变
find / -size +1000000c -print
# 查找文件长度大于1M字节的文件
find /etc -name "*passwd*" -exec grep "xuesong" {} \;
# 按名字查找文件传递给-exec后命令
find . -name ‘t*‘ -exec basename {} \;
# 查找文件名,不取路径
find . -type f -name "err*" -exec
rename err ERR {} \; # 批量改名(查找err 替换为 ERR {}文件
find 路径 -name *name1* -or -name *name2*
# 查找任意一个关键字
vim编辑器{
gconf-editor
# 配置编辑器
/etc/vimrc
# 配置文件路径
vim +24 file
# 打开文件定位到指定行
vim file1 file2
# 打开多个文件
vim -O2 file1 file2
# 垂直分屏
vim -on file1 file2
# 水平分屏
sp filename
# 上下分割打开新文件
vsp filename
# 左右分割打开新文件
Ctrl+W [操作]
# 多个文件间操作
# 操作: 关闭当前窗口c
屏幕高度一样=
移动光标所在屏 右l 左h 上k 下j 中h
# 编辑下一个文件
# 编辑下二个文件
# 编辑前一个文件
# 回到首文件
# 打开行号
# 取消行号
# 跳转到200
# 取消高亮
:set autoindent
# 设置自动缩进
# 查看文本格式
:set binary
# 改为unix格式
# 向前翻页
# 向后翻页
%s/字符1/字符2/g
# 全部替换
# 文档加密
归档解压缩{
tar zxvpf gz.tar.gz -C 放到指定目录 包中的目录
# 解包tar.gz 不指定目录则全解压
tar zcvpf /$path/gz.tar.gz * # 打包gz 注意*最好用相对路径
tar zcf /$path/gz.tar.gz *
# 打包正确不提示
tar ztvpf gz.tar.gz
tar xvf 1.tar -C 目录
tar -cvf 1.tar *
tar tvf 1.tar
tar -rvf 1.tar 文件名
# 给tar追加文件
tar --exclude=/home/dmtsai --exclude=*.tar -zcvf myfile.tar.gz /home
# 打包/home, /etc ,但排除 /home/dmtsai
tar -N "" -zcvf home.tar.gz /home
# 在 /home 当中,比
新的文件才备份
tar -zcvfh home.tar.gz /home
# 打包目录中包括连接目录
tar zcf - ./ | ssh root@IP "tar zxf - -C /xxxx"
# 一边压缩一边解压
zgrep 字符 1.gz
# 查看压缩包中文件字符行
-dv 1.tar.bz2
# 解压bzip2
bzip2 -v 1.tar
# bzip2压缩
# 查看bzip2
# 直接压缩文件 # 压缩后源文件消失
gunzip A.gz
# 直接解压文件 # 解压后源文件消失
gzip -dv 1.tar.gz
# 解压gzip到tar
gzip -v 1.tar
# 压缩tar到gz
unzip zip.zip
zip zip.zip *
# rar3.6下载:
http://www.rarsoft.com/rar/rarlinux-3.6.0.tar.gz
rar a rar.rar *.jpg
# 压缩文件为rar包
unrar x rar.rar
# 解压rar包
7z a 7z.7z *
7z e 7z.7z
文件ACL权限控制{
getfacl 1.test
# 查看文件ACL权限
setfacl -R -m u:xuesong:rw- 1.test
# 对文件增加用户的读写权限 -R 递归
svn更新代码{
--force # 强制覆盖
/usr/bin/svn --username user --password passwd co
${SvnPath}src/
# 检出整个项目
/usr/bin/svn --username user --password passwd up
${SvnPath}src/
# 更新项目
/usr/bin/svn --username user --password passwd export
$Code$File ${SvnPath}src/$File
# 导出个别文件
/usr/bin/svn --username user --password passwd export -r 版本号 svn路径 本地路径 --force # 导出指定版本
# 编译安装git-1.8.4.4
./configure --with-curl --with-expat
make install
git clone git@10.10.10.10:gittest.git
./gittest/
# 克隆项目到指定目录
# 更新项目 需要cd到项目目录中
# 更新所有文件
git commit -m "gittest up"
# 提交操作并添加备注
# 正式提交到远程git服务器
git reset --hard
# 本地恢复整个项目
git rm -r -n --cached
# -n执行命令时,不会删除任何文件,而是展示此命令要删除的文件列表预览
git rm -r --cached
# 执行删除命令 需要commit和push让远程生效
git init --bare smc-content-check.git
# 初始化新git项目
需要手动创建此目录并给git用户权限 chown -R git:git smc-content-check.git
git config --global credential.helper store
# 记住密码
恢复rm删除的文件{
# debugfs针对 ext2
# ext3grep针对 ext3
# extundelete针对 ext4
# 首先查看磁盘分区格式
umount /data/
# 卸载挂载,数据丢失请首先卸载挂载,或重新挂载只读
ext3grep /dev/sdb1 --ls --inode 2
# 记录信息继续查找目录下文件inode信息
ext3grep /dev/sdb1 --ls --inode 131081
# 此处是inode
ext3grep /dev/sdb1 --restore-inode 49153
# 记录下inode信息开始恢复目录
openssl rand 15 -base64
# 口令生成
openssl sha1 filename
# 哈希算法校验文件
openssl md5 filename
# MD5校验文件
openssl base64
filename.txt
# base64编码/解码文件(发送邮件附件之类功能会可以使用)
openssl base64 -d
filename.bin
# base64编码/解码二进制文件
openssl enc -aes-128-cbc
filename.aes-128-cbc
# 加密文档
# 推荐使用的加密算法是bf(Blowfish)和-aes-128-cbc(运行在CBC模式的128位密匙AES加密算法),加密强度有保障
openssl enc -d -aes-128-cbc -in filename.aes-128-cbc & filename
# 解密文档
<span style="color: # 软件{
rpm -ivh lynx
rpm -e lynx
rpm -e lynx --nodeps
# 强制卸载
# 查看所有安装的rpm包
rpm -qa | grep lynx
# 查找包是否安装
# 软件包路径
rpm --test lynx
# 软件包配置文档
rpm --import
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
# 导入rpm的签名信息
rpm --initdb
# 初始化rpm 数据库
rpm --rebuilddb
# 重建rpm数据库
在rpm和yum无响应的情况使用 先 rm -f /var/lib/rpm/__db.00* 在重建
# 所有软件列表
yum install 包名
# 安装包和依赖包
yum -y update
# 升级所有包版本,依赖关系,系统版本内核都升级
yum -y update 软件包名
# 升级指定的软件包
yum -y upgrade
# 不改变软件设置更新软件,系统版本升级,内核不改变
yum search mail
# yum搜索相关包
yum grouplist
# 软件包组
yum -y groupinstall "Virtualization"
# 安装软件包组
repoquery -ql gstreamer
# 不安装软件查看包含文件
yum clean all
# 清除var下缓存
yum使用epel源{
# 包下载地址: http://download.fedoraproject.org/pub/epel
# 选择版本5\6\7
http://mirrors.hustunique.com/epel//6/x86_64/epel-release-6-8.noarch.rpm
自定义yum源{
find /etc/yum.repos.d -name "*.repo" -exec mv {} {}.bak \;
vim /etc/yum.repos.d/yum.repo
baseurl=http://10.0.0.1/centos5.5
#mount -o loop CentOS-5.8-x86_64-bin-DVD-1of2.iso /data/iso/
#baseurl=file:///data/iso/
rpm --import
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
./configure --help
# 查看所有编译参数
./configure
--prefix=/usr/local/
# 配置参数
# make -j 8
# 多线程编译,速度较快,但有些软件不支持
make install
make clean
# 清除编译结果
perl程序编译{
perl Makefile.PL
make install
python程序编译{
python file.py
# 源码包编译安装
python setup.py build
python setup.py install
编译c程序{
gcc -g hello.c -o hello
<span style="color: # 系统{
# 给其它用户发消息
whereis ls
# 查找命令的目录
# 查看当前要执行的命令所在的路径
# 清空整个屏幕
# 重新初始化屏幕
# 显示月历
echo -n 123456 | md5sum
# 随机生成密码
-l位数 -C大小 -c小写 -d数字 -s特殊字符
netstat -anlp | grep port
# 是否打开了某个端口
ntpdate stdtime.gov.hk
# 同步时间
# 选择时区 #+8=(5 9 1 1) # (TZ=‘Asia/Shanghai‘; export TZ)括号内写入 /etc/profile
/sbin/hwclock -w
# 时间保存到硬件
/etc/shadow
# 账户影子文件
# 修改语言
vim /etc/sysconfig/i18n
# 修改编码
LANG="en_US.UTF-8"
export LC_ALL=C
# 强制字符集
vi /etc/hosts
# 查询静态主机名
watch uptime
# 监测命令动态刷新
# 查看Linux系统当前单个共享内存段的最大值
# 动态链接库管理命令
ldd `which cmd`
# 查看命令的依赖库
dist-upgrade
# 会改变配置文件,改变旧的依赖关系,改变系统版本
/boot/grub/grub.conf
# grub启动项配置
ps -mfL &PID&
# 查看指定进程启动的线程 线程数受 max user processes 限制
ps uxm |wc -l
# 查看当前用户占用的进程数 [包括线程]
max user processes
# 查看指定PID进程及线程
lsof |wc -l
# 查看当前文件句柄数使用数量
open files
lsof |grep /lib
# 查看加载库文件
# 查看当前所有系统内核参数
# 修改内核参数/etc/sysctl.conf,让/etc/rc.d/rc.sysinit读取生效
strace -p pid
# 跟踪系统调用
ps -eo "%p %C
%a"|sort -k3 -n
# 把进程按内存使用大小排序
strace uptime 2&&1|grep open
# 查看命令打开的相关文件
grep Hugepagesize /proc/meminfo
# 内存分页大小
mkpasswd -l 8
-C 2 -c 2 -d 4 -s 0
# 随机生成指定类型密码
echo 1 & /proc/sys/net/ipv4/tcp_syncookies
# 使TCP SYN Cookie 保护生效
# "SYN Attack"是一种拒绝服务的攻击方式
/proc/25151/smaps |awk ‘{a+=$2}END{print a}‘
# 查询某pid使用的swap大小
开机启动脚本顺序{
/etc/profile
/etc/profile.d/\*.sh
~/bash_profile
/etc/bashrc
# 查看所有进程
kill -9 PID
# 强制终止某个PID进程
kill -15 PID
# 安全退出 需程序内部处理信号
# 命令后台运行
nohup cmd &
# 后台运行不受shell退出影响
# 将前台放入后台(暂停)
# 查看后台运行程序
# 启动后台暂停进程
# 调回后台进程
vmstat 1 9
# 每隔一秒报告系统性能信息9次
# 查看cpu等状态
# 显示打开指定文件的所有进程
lsof -i:32768
# 查看端口的进程
renice +1 180
# 把180号进程的优先级加1
ps aux |grep -v USER | sort -nk +4 | tail
# 显示消耗内存最多的10个运行中的进程,以内存使用量排序.cpu +3
PID %CPU %MEM
STAT START
TIME COMMAND
# 进程的cpu占用率
# 进程的内存占用率
# 进程虚拟大小,单位K(即总占用内存大小,包括真实内存和虚拟内存)
# 进程使用的驻留集大小即实际物理内存大小
# 进程启动时间和日期
占用的虚拟内存大小 = VSZ - RSS
ps -eo pid,lstart,etime,args
# 查看进程启动时间
前五行是系统整体的统计信息。
第一行: 任务队列信息,同 uptime 命令的执行结果。内容如下:
01:06:48 当前时间
up 1:22 系统运行时间,格式为时:分
1 user 当前登录用户数
load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。
三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
第二、三行:为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:
Tasks: 29 total 进程总数
1 running 正在运行的进程数
28 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
Cpu(s): 0.3% us 用户空间占用CPU百分比
1.0% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id 空闲CPU百分比
0.0% wa 等待输入输出的CPU时间百分比
第四、五行:为内存信息。内容如下:
Mem: 191272k total 物理内存总量
173656k used 使用的物理内存总量
17616k free 空闲内存总量
22052k buffers 用作内核缓存的内存量
Swap: 192772k total 交换区总量
0k used 使用的交换区总量
192772k free 空闲交换区总量
123988k cached 缓冲的交换区总量。
内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,
该数值即为这些内容已存在于内存中的交换区的大小。
相应的内存再次被换出时可不必再对交换区写入。
进程信息区,各列的含义如下:
# 显示各个进程的详细信息
Real user name
进程所有者的用户id
进程所有者的用户名
进程所有者的组名
启动进程的终端名。不是从终端启动的进程则显示为 ?
nice值。负值表示高优先级,正值表示低优先级
最后使用的CPU,仅在多CPU环境下有意义
上次更新到现在的CPU时间占用百分比
进程使用的CPU时间总计,单位秒
进程使用的CPU时间总计,单位1/100秒
进程使用的物理内存百分比
进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
进程使用的虚拟内存中,被换出的大小,单位kb。
进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
可执行代码占用的物理内存大小,单位kb
可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
共享内存大小,单位kb
页面错误次数
最后一次写入到现在,被修改过的页面数。
进程状态。
D=不可中断的睡眠状态
T=跟踪/停止
Z=僵尸进程 父进程在但并不等待子进程
命令名/命令行
若该进程在睡眠,则显示睡眠中的系统函数名
任务标志,参考 sched.h
列出正在占用swap的进程{
#!/bin/bash
echo -e "PID\t\tSwap\t\tProc_Name"
# 拿出/proc目录下所有以数字为名的目录(进程名是数字才是进程,其他如sys,net等存放的是其他信息)
for pid in `ls -l /proc | grep ^d | awk ‘{ print $9 }‘| grep -v [^0-9]`
# 让进程释放swap的方法只有一个:就是重启该进程。或者等其自动释放。放
# 如果进程会自动释放,那么我们就不会写脚本来找他了,找他都是因为他没有自动释放。
# 所以我们要列出占用swap并需要重启的进程,但是init这个进程是系统里所有进程的祖先进程
# 重启init进程意味着重启系统,这是万万不可以的,所以就不必检测他了,以免对系统造成影响。
if [ $pid -eq 1 ];fi
grep -q "Swap" /proc/$pid/smaps 2&/dev/null
if [ $? -eq 0 ];then
swap=$(grep Swap /proc/$pid/smaps \
| gawk ‘{ sum+=$2;} END{ print sum }‘)
proc_name=$(ps aux | grep -w "$pid" | grep -v grep \
| awk ‘{ for(i=11;i&=NF;i++){ printf("%s ",$i); }}‘)
if [ $swap -gt 0 ];then
echo -e "${pid}\t${swap}\t${proc_name}"
done | sort -k2 -n | awk -F‘\t‘ ‘{
pid[NR]=$1;
size[NR]=$2;
name[NR]=$3;
for(id=1;id&=length(pid);id++)
if(size[id]&1024)
printf("%-10s\t%15sKB\t%s\n",pid[id],size[id],name[id]);
else if(size[id]&1048576)
printf("%-10s\t%15.2fMB\t%s\n",pid[id],size[id]/1024,name[id]);
printf("%-10s\t%15.2fGB\t%s\n",pid[id],size[id]/1048576,name[id]);
linux操作系统提供的信号{
# 查看linux提供的信号
trap "echo aaa"
# shell使用 trap 捕捉退出信号
# 发送信号一般有两种原因:
内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号
通过系统调用kill来向指定进程发送信号
# 进程结束信号 SIGTERM 和 SIGKILL 的区别:
SIGTERM 比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。
# 如果一个进程收到一个SIGUSR1信号,然后执行信号绑定函数,第二个SIGUSR2信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。
# 终端挂起或者控制进程终止
# 键盘终端进程(如control+c)
# 键盘的退出键被按下
# 非法指令
# 由abort(3)发出的退出指令
# 浮点异常
# Kill信号
SIGSEGV 11
# 无效的内存引用
SIGPIPE 13
# 管道破裂: 写一个没有读端口的管道
SIGALRM 14
# 闹钟信号 由alarm(2)发出的信号
SIGTERM 15
# 终止信号,可让程序安全退出 kill -15
SIGUSR1 30,10,16
# 用户自定义信号1
SIGUSR2 31,12,17
# 用户自定义信号2
SIGCHLD 20,17,18
# 子进程结束自动向父进程发送SIGCHLD信号
SIGCONT 19,18,25
# 进程继续(曾被停止的进程)
SIGSTOP 17,19,23
# 终止进程
SIGTSTP 18,20,24
# 控制终端(tty)上按下停止键
SIGTTIN 21,21,26
# 后台进程企图从控制终端读
SIGTTOU 22,22,27
# 后台进程企图从控制终端写
缺省处理动作一项中的字母含义如下:
缺省的动作是终止进程
缺省的动作是忽略此信号,将该信号丢弃,不做处理
缺省的动作是终止进程并进行内核映像转储(dump core),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。
缺省的动作是停止进程,进入停止状况以后还能重新进行下去,一般是在调试的过程中(例如ptrace系统调用)
信号不能被捕获
信号不能被忽略
系统性能状态{
vmstat 1 9
# 等待执行的任务数。当这个值超过了cpu线程数,就会出现cpu瓶颈。
# 等待IO的进程数量,表示阻塞的进程。
# 虚拟内存已使用的大小,如大于0,表示机器物理内存不足,如不是程序内存泄露,那么该升级内存。
# 空闲的物理内存的大小
# 已用的buff大小,对块设备的读写进行缓冲
# cache直接用来记忆我们打开的文件,给文件做缓冲,(把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
# 非活跃内存大小,即被标明可回收的内存,区别于free和active -a选项时显示
active # 活跃的内存大小 -a选项时显示
# 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露,要查找耗内存进程解决掉。
# 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
# 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte
# 块设备每秒发送的块数量,例如读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
# 每秒CPU的中断次数,包括时间中断。in和cs这两个值越大,会看到由内核消耗的cpu时间会越多
# 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用。
# 用户进程执行消耗cpu时间(user time)
us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施
# 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
# 空闲 CPU时间,一般来说,id + us + sy = 100,一般认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
# 等待IOCPU时间。Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。
如果 r 经常大于4,且id经常少于40,表示cpu的负荷很重。
如果 pi po 长期不等于0,表示内存不足。
如果 b 队列经常大于3,表示io性能不好。
# 历时命令默认1000条
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
# 让history命令显示具体时间
# 清除记录命令
cat $HOME/.bash_history
# 历史命令记录文件
# 列出登录系统失败的用户相关信息
清空二进制日志记录文件 echo & /var/log/btmp
# 查看登陆过的用户信息
清空二进制日志记录文件 echo & /var/log/wtmp
默认打开乱码
who /var/log/wtmp
# 查看登陆过的用户信息
# 用户最后登录的时间
tail -f /var/log/messages
# 系统日志
tail -f /var/log/secure
sestatus -v
# 查看selinux状态
getenforce
# 查看selinux模式
setenforce 0
# 设置selinux为宽容模式(可避免阻止一些操作)
semanage port -l
# 查看selinux端口限制规则
semanage port -a -t http_port_t -p tcp 8000
# 在selinux中注册端口类型
vi /etc/selinux/config
# selinux配置文件
SELINUX=enfoceing
# 关闭selinux 把其修改为
SELINUX=disabled
查看剩余内存{
#-/+ buffers/cache:
#6458M为真实使用内存
1649M为真实剩余内存(剩余内存+缓存+缓冲器)
#linux会利用所有的剩余内存作为缓存,所以要保证linux运行速度,就需要保证内存的缓存大小
# 查看Linux内核版本信息
cat /proc/version
# 查看内核版本
cat /etc/issue
# 查看系统版本
lsb_release -a
# 查看系统版本
需安装 centos-release
# 列出所有语系
# 当前环境变量中所有编码
# 查看时间
# 当前在线用户
# 当前在线用户
# 查看当前用户名
# 查看初始登陆用户名
# 查看服务器启动时间
sar -n DEV 1 10
# 查看网卡网速流量
# 显示开机信息
# 查看内核模块
more /proc/cpuinfo
# 查看cpu信息
# 查看cpu信息
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
# 查看cpu型号和逻辑核心数
getconf LONG_BIT
# cpu运行的位数
cat /proc/cpuinfo | grep ‘physical id‘ |sort| uniq -c
# 物理cpu个数
cat /proc/cpuinfo | grep flags | grep ‘ lm ‘ | wc -l
# 结果大于0支持64位
cat /proc/cpuinfo|grep flags
# 查看cpu是否支持虚拟化
pae支持半虚拟化
IntelVT 支持全虚拟化
more /proc/meminfo
# 查看内存信息
# 查看全面硬件信息
dmidecode | grep "Product Name"
# 查看服务器型号
dmidecode | grep -P -A5 "Memory\s+Device" | grep Size | grep -v Range
# 查看内存插槽
cat /proc/mdstat
# 查看软raid信息
cat /proc/scsi/scsi
# 查看Dell硬raid信息(IBM、HP需要官方检测工具)
# 查看硬件信息
lspci|grep RAID
# 查看是否支持raid
lspci -vvv |grep Ethernet
# 查看网卡型号
lspci -vvv |grep Kernel|grep driver
# 查看驱动模块
modinfo tg2
# 查看驱动版本(驱动模块)
ethtool -i em1
# 查看网卡驱动版本
ethtool em1
# 查看网卡带宽
终端快捷键{
# 终端锁屏
开机启动模式{
vi /etc/inittab
id:3:initdefault:
# 3为多用户命令
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# 注释此行 禁止 ctrl+alt+del 关闭计算机
终端提示显示{
# 环境变量控制提示显示
PS1=‘[\u@ \H \w \A \@#]\$‘
PS1=‘[\u@\h \W]\$‘
at 5pm + 3 days /bin/ls
# 单次定时任务 指定三天后下午5:00执行/bin/ls
crontab -e
# 编辑周期任务
命令或脚本
命令或脚本
&& file.log 2&&1
echo "40 7 * * 2 /root/sh"&&/var/spool/cron/root
# 直接将命令写入周期任务
crontab -l
# 查看自动周期性任务
crontab -r
# 删除自动周期性任务
cron.deny和cron.allow
# 禁止或允许用户使用周期任务
service crond start|stop|restart
# 启动自动周期性服务
星期日[SUN] 星期一[MON] 星期二[TUE] 星期三[WED] 星期四[THU] 星期五[FRI] 星期六[SAT]
一月[JAN] 二月[FEB] 三月[MAR] 四月[APR] 五月[MAY] 六月[JUN] 七月[JUL] 八月[AUG] 九月[SEP] 十月[OCT] 十一月[NOV] 十二月[DEC]
date -s 18:30:50
date -d "7 days ago" +%Y%m%d
# 7天前日期
date -d "5 minute ago" +%H:%M
# 5分钟前时间
date -d "1 month ago" +%Y%m%d
# 一个月前
date -d ‘1 days‘ +%Y-%m-%d
date -d ‘1 hours‘ +%H:%M:%S
# 一小时后
date +%Y-%m-%d -d ‘‘
# 日期格式转换
date +%Y-%m-%d_%X
# 日期和时间
date -d " 14:00:23" +%s
# 换算成秒计算(1970年至今的秒数)
date -d "@" +%Y-%m-%d-%T
# 将时间戳换算成日期
date -d " UTC
seconds" +%Y-%m-%d-%T
# 将时间戳换算成日期
date -d "`awk -F. ‘{print $1}‘ /proc/uptime` second ago" +"%Y-%m-%d %H:%M:%S"
# 格式化系统启动时间(多少秒前)
limits.conf{
ulimit -SHn 65535
# 临时设置文件描述符大小 进程最大打开文件柄数 还有socket最大连接数, 等同配置 nofile
ulimit -SHu 65535
# 临时设置用户最大进程数
/etc/security/limits.conf
# 文件描述符大小
open files
# lsof |wc -l
查看当前文件句柄数使用数量
* soft nofile 16384
# 设置太大,进程使用过多会把机器拖死
* hard nofile 32768
# 用户最大进程数
max user processes
# echo $((`ps uxm |wc -l`-`ps ux |wc -l`))
查看当前用户占用的进程数 [包括线程]
user soft nproc 16384
user hard nproc 32768
# 如果/etc/security/limits.d/有配置文件,将会覆盖/etc/security/limits.conf里的配置
# 即/etc/security/limits.d/的配置文件里就不要有同样的参量设置
/etc/security/limits.d/90-nproc.conf
# centos6.3的默认这个文件会覆盖 limits.conf
user soft nproc 16384
user hard nproc 32768
# 修改配置文件后让系统生效
百万长链接设置{
# 内存消耗需要较大
vim /root/.bash_profile
# 添加如下2行,退出bash重新登陆
& /proc/sys/fs/nr_open
libc.so故障修复{
# 由于升级glibc导致libc.so不稳定,突然报错,幸好还有未退出的终端
grep: error while loading shared libraries: /lib64/libc.so.6: ELF file OS ABI invalid
# 看看当前系统有多少版本 libc.so
ls /lib64/libc-[tab]
# 更改环境变量指向其他 libc.so 文件测试
export LD_PRELOAD=/lib64/libc-2.7.so
# 如果不改变LD_PRELOAD变量,ln不能用,需要使用 /sbin/sln 命令做链接
# 当前如果好使了,在执行下面强制替换软链接。如不好使,测试其他版本的libc.so文件
ln -f -s /lib64/libc-2.7.so /lib64/libc.so.6
echo myPassword | sudo -S ls /tmp
# 直接输入sudo的密码非交互,从标准输入读取密码而不是终端设备
# sudo命令权限添加
/etc/sudoers
别名(可用all)=NOPASSWD:命令1,命令2
ALL=NOPASSWD:/bin/su
# 免root密码切换root身份
wangming linuxfan=NOPASSWD:/sbin/apache start,/sbin/apache restart
UserName ALL=(ALL) ALL
UserName ALL=(ALL) NOPASSWD: ALL
NOPASSWD:/sbin/service
Defaults requiretty
# sudo不允许后台运行,注释此行既允许
Defaults !visiblepw
# sudo不允许远程,去掉!既允许
grub开机启动项添加{
vim /etc/grub.conf
title ms-dos
rootnoverify (hd0,0)
chainloader +1
#stty时一个用来改变并打印终端行设置的常用命令
stty iuclc
# 在命令行下禁止输出大写
stty -iuclc
# 恢复输出大写
stty olcuc
# 在命令行下禁止输出小写
stty -olcuc
# 恢复输出小写
# 打印出终端的行数和列数
stty eof "string"
# 改变系统默认ctrl+D来表示文件的结束
stty -echo
# 禁止回显
# 打开回显
stty -read
# 测试禁止回显
stty igncr
# 忽略回车符
stty -igncr
# 恢复回车符
stty erase ‘#‘
# 将#设置为退格字符
stty erase ‘^?‘
# 恢复退格字符
timeout_read(){
timeout=$1
old_stty_settings=`stty -g`  # save current settings
stty -icanon min 0 time 100  # set 10seconds,not 100seconds
eval read varname  
# =read $varname
stty "$old_stty_settings"  
# recover settings
read -t 10 varname
# 更简单的方法就是利用read命令的-t选项
检测用户按键{
#!/bin/bash
old_tty_settings=$(stty -g)
# 保存老的设置(为什么?).
stty -icanon
Keypress=$(head -c1)
# 或者使用$(dd bs=1 count=1 2& /dev/null)
echo "Key pressed was \""$Keypress"\"."
stty "$old_tty_settings"
# 恢复老的设置.
内建三个表:nat mangle 和 filter
filter预设规则表,有INPUT、FORWARD 和 OUTPUT 三个规则链
vi /etc/sysconfig/iptables
# 配置文件
# 将封包放行
# 拦阻该封包
# 丢弃封包不予处理
# 在所选择的链(INPUT等)末添加一条或更多规则
# 删除一条
# tcp、udp、icmp
0相当于所有all
# 设置缺省策略(与所有链都不匹配强制使用此策略)
主机名、网络名和清楚的IP地址 !取反
# 目标跳转,立即决定包的命运的专用内建目标
# 进入的(网络)接口 [名称] eth0
# 输出接口[名称]
# 目标端口
iptables -F
# 将防火墙中的规则条目清除掉
# 注意: iptables -P INPUT ACCEPT
iptables-restore & 规则文件
# 导入防火墙规则
/etc/init.d/iptables save
# 保存防火墙设置
/etc/init.d/iptables restart
# 重启防火墙服务
iptables -L -n
# 查看规则
iptables -t nat -nL
# 查看转发
iptables实例{
iptables -L INPUT
# 列出某规则链中的所有规则
iptables -X allowed
# 删除某个规则链 ,不加规则链,清除所有非内建的
iptables -Z INPUT
# 将封包计数器归零
iptables -N allowed
# 定义新的规则链
iptables -P INPUT DROP
# 定义过滤政策
iptables -A INPUT -s 192.168.1.1
# 比对封包的来源IP
# ! 192.168.0.0/24
! 反向对比
iptables -A INPUT -d 192.168.1.1
# 比对封包的目的地IP
iptables -A INPUT -i eth0
# 比对封包是从哪片网卡进入
iptables -A FORWARD -o eth0
# 比对封包要从哪片网卡送出 eth+表示所有的网卡
iptables -A INPUT -p tcp
# -p ! tcp 排除tcp以外的udp、icmp。-p all所有类型
iptables -D INPUT 8
# 从某个规则链中删除一条规则
iptables -D INPUT --dport 80 -j DROP
# 从某个规则链中删除一条规则
iptables -R INPUT 8 -s 192.168.0.1 -j DROP
# 取代现行规则
iptables -I INPUT 8 --dport 80 -j ACCEPT
# 插入一条规则
iptables -A INPUT -i eth0 -j DROP
# 其它情况不允许
iptables -A INPUT -p tcp -s IP -j DROP
# 禁止指定IP访问
iptables -A INPUT -p tcp -s IP --dport port -j DROP
# 禁止指定IP访问端口
iptables -A INPUT -s IP -p tcp --dport port -j ACCEPT
# 允许在IP访问指定端口
iptables -A INPUT -p tcp --dport 22 -j DROP
# 禁止使用某端口
iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP
# 禁止icmp端口
iptables -A INPUT -i eth0 -p icmp -j DROP
# 禁止icmp端口
iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP
# 阻止所有没有经过你系统授权的TCP连接
iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
# IP包流量限制
iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT
# 除192.168.62.1外,禁止其它人ping我的主机
iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m recent --update --seconds 5 --hitcount 20 --rttl --name WEB --rsource -j DROP
# 可防御cc攻击(未测试)
iptables配置实例文件{
# Generated by iptables-save v1.2.11 on Fri Feb
9 12:10:37 2007
:INPUT ACCEPT [637:58967]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT []
# 允许的IP或IP段访问 建议多个
-A INPUT -s 127.0.0.1 -p tcp -j ACCEPT
-A INPUT -s 192.168.0.0/255.255.0.0 -p tcp -j ACCEPT
# 开放对外开放端口
-A INPUT -p tcp --dport 80 -j ACCEPT
# 指定某端口针对IP开放
-A INPUT -s 192.168.10.37 -p tcp --dport 22 -j ACCEPT
# 拒绝所有协议(INPUT允许)
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP
# 允许已建立的或相关连的通行
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 拒绝ping
-A INPUT -p tcp -m tcp -j REJECT --reject-with icmp-port-unreachable
# Completed on Fri Feb
9 12:10:37 2007
iptables配置实例{
# 允许某段IP访问任何端口
iptables -A INPUT -s 192.168.0.3/24 -p tcp -j ACCEPT
# 设定预设规则 (拒绝所有的数据包,再允许需要的,如只做WEB服务器.还是推荐三个链都是DROP)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 注意: 直接设置这三条会掉线
# 开启22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 如果OUTPUT 设置成DROP的,要写上下面一条
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
# 注:不写导致无法SSH.其他的端口一样,OUTPUT设置成DROP的话,也要添加一条链
# 如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
# 做WEB服务器,开启80端口 ,其他同理
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 做邮件服务器,开启25,110端口
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
# 允许icmp包通过,允许ping
iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)
iptables -A INPUT -p icmp -j ACCEPT
(INPUT设置成DROP的话)
# 允许loopback!(不然会导致DNS无法正常关闭等问题)
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
centos6的iptables基本配置{
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 222.186.135.61 -p tcp -j ACCEPT
-A INPUT -p tcp
--dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
添加网段转发{
# 例如通过vpn上网
echo 1 & /proc/sys/net/ipv4/ip_forward
# 在内核里打开ip转发功能
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
# 添加网段转发
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.0.0.0 -o eth0 -j SNAT --to 192.168.10.158
# 原IP网段经过哪个网卡IP出去
iptables -t nat -nL
# 查看转发
# 内网通过有外网IP的机器映射端口
# 内网主机添加路由
route add -net 10.10.20.0 netmask 255.255.255.0 gw 10.10.20.111
# 内网需要添加默认网关,并且网关开启转发
# 网关主机
echo 1 & /proc/sys/net/ipv4/ip_forward
# 在内核里打开ip转发功能
iptables -t nat -A PREROUTING -d 外网IP
-p tcp --dport 9999 -j DNAT --to 10.10.20.55:22
iptables -t nat -A POSTROUTING -s 10.10.20.0/24 -j SNAT --to 外网IP
# 转发回去
iptables -t nat -nL
# 查看转发
/etc/init.d/sendmail start
# 启动服务
/etc/init.d/sendmail stop
# 关闭服务
/etc/init.d/sendmail status
# 查看服务当前状态
/date/mysql/bin/mysqld_safe --user=mysql &
# 启动mysql后台运行
vi /etc/rc.d/rc.local
# 开机启动执行
可用于开机启动脚本
/etc/rc.d/rc3.d/S55sshd
# 开机启动和关机关闭服务连接
# S开机start
55级别 后跟服务名
ln -s -f /date/httpd/bin/apachectl /etc/rc.d/rc3.d/S15httpd
# 将启动程序脚本连接到开机启动目录
ipvsadm -ln
# lvs查看后端负载机并发
ipvsadm -C
# lvs清除规则
# 查看xen虚拟主机列表
# 虚拟化(xen\kvm)管理工具
yum groupinstall Virtual*
./bin/httpd -M
# 查看httpd加载模块
httpd -t -D DUMP_MODULES
# rpm包httpd查看加载模块
echo 内容| /bin/mail -s "标题" 收件箱 -f 发件人
# 发送邮件
"`echo "内容"|iconv -f utf8 -t gbk`" | /bin/mail -s "`echo "标题"|iconv -f utf8 -t gbk`" 收件箱
# 解决邮件乱码
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
# 检测nagios配置文件
chkconfig{
chkconfig 服务名 on|off|set
# 设置非独立服务启状态
chkconfig --level 35
# 让服务不自动启动
chkconfig --level 35
# 让服务自动启动 35指的是运行级别
chkconfig --list
# 查看所有服务的启动状态
chkconfig --list |grep httpd
# 查看某个服务的启动状态
chkconfig –-list [服务名称]
# 查看服务的状态
yum install -y make gcc
openssl-devel pcre-devel
bzip2-devel libxml2 libxml2-devel curl-devel libmcrypt-devel libjpeg libjpeg-devel libpng libpng-devel openssl
groupadd nginx
useradd nginx -g nginx -M -s /sbin/nologin
mkdir -p /opt/nginx-tmp
wget http://labs.frickle.com/files/ngx_cache_purge-1.6.tar.gz
tar fxz ngx_cache_purge-1.6.tar.gz
# ngx_cache_purge 清除指定url缓存
# 假设一个URL为 http://192.168.12.133/test.txt
# 通过访问
http://192.168.12.133/purge/test.txt
就可以清除该URL的缓存。
tar zxvpf nginx-1.4.4.tar.gz
cd nginx-1.4.4
# ./configure --help
# 默认不加载 需指定编译此参数才使用
# --without
# 默认加载,可用此参数禁用
# --add-module=path
# 添加模块的路径
# --add-module=/opt/ngx_module_upstream_check \
# nginx 代理状态页面
# ngx_module_upstream_check
编译前需要打对应版本补丁 patch -p1 & /opt/nginx_upstream_check_module/check_1.2.6+.patch
# --add-module=/opt/ngx_module_memc \
# 将请求页面数据存放在 memcached中
# --add-module=/opt/ngx_module_lua \
# 支持lua脚本 yum install lua-devel lua
./configure \
--user=nginx \
--group=nginx \
--prefix=/usr/local/nginx \
--pid-path=/usr/local/nginx/nginx.pid \
--lock-path=/usr/local/nginx/nginx.lock \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--add-module=/opt/ngx_cache_purge-1.6 \
--http-client-body-temp-path=/opt/nginx-tmp/client \
--http-proxy-temp-path=/opt/nginx-tmp/proxy \
--http-fastcgi-temp-path=/opt/nginx-tmp/fastcgi \
--http-uwsgi-temp-path=/opt/nginx-tmp/uwsgi \
--http-scgi-temp-path=/opt/nginx-tmp/scgi
make && make install
/usr/local/nginx/sbin/nginx –t
# 检查Nginx配置文件 但并不执行
/usr/local/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf
# 检查Nginx配置文件
/usr/local/nginx/sbin/nginx
# 启动nginx
/usr/local/nginx/sbin/nginx -s reload
# 重载配置
/usr/local/nginx/sbin/nginx -s stop
# 关闭nginx服务
# so模块用来提供DSO支持的apache核心模块
# 如果编译中包含任何DSO模块,则mod_so会被自动包含进核心。
# 如果希望核心能够装载DSO,但不实际编译任何DSO模块,则需明确指定"--enable-so=static"
./configure --prefix=/usr/local/apache --enable-so --enable-mods-shared=most --enable-rewrite --enable-forward
# 实例编译
--with-mpm=worker
# 已worker方式运行
--with-apxs=/usr/local/apache/bin/apxs
# 制作apache的动态模块DSO rpm包 httpd-devel
#编译模块 apxs -i -a -c mod_foo.c
--enable-so
# 让Apache可以支持DSO模式
--enable-mods-shared=most # 告诉编译器将所有标准模块都动态编译为DSO模块
--enable-rewrite
# 支持地址重写功能
--enable-module=most
# 用most可以将一些不常用的,不在缺省常用模块中的模块编译进来
--enable-mods-shared=all
# 意思是动态加载所有模块,如果去掉-shared话,是静态加载所有模块
--enable-expires
# 可以添加文件过期的限制,有效减轻服务器压力,缓存在用户端,有效期内不会再次访问服务器,除非按f5刷新,但也导致文件更新不及时
--enable-deflate
# 压缩功能,网页可以达到40%的压缩,节省带宽成本,但会对cpu压力有一点提高
--enable-headers
# 文件头信息改写,压缩功能需要
--disable-MODULE
# 禁用MODULE模块(仅用于基本模块)
--enable-MODULE=shared
# 将MODULE编译为DSO(可用于所有模块)
--enable-mods-shared=MODULE-LIST
# 将MODULE-LIST中的所有模块都编译成DSO(可用于所有模块)
--enable-modules=MODULE-LIST
# 将MODULE-LIST静态连接进核心(可用于所有模块)
# 上述 MODULE-LIST 可以是:
1、用引号界定并且用空格分隔的模块名列表
--enable-mods-shared=‘headers rewrite dav‘
2、"most"(大多数模块)
--enable-mods-shared=most
3、"all"(所有模块)
#针对非80端口的请求处理
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^/(.*)
http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R]
RewriteCond %{HTTP_HOST} ^ss.aa.com [NC]
RewriteRule
http://www.aa.com/so/$1/0/p0?
#RewriteRule 只对?前处理,所以会把?后的都保留下来
#在转发后地址后加?即可取消RewriteRule保留的字符
#R的含义是redirect,即重定向,该请求不会再被apache交给后端处理,而是直接返回给浏览器进行重定向跳转。301是返回的http状态码,具体可以参考http rfc文档,跳转都是3XX。
#L是last,即最后一个rewrite规则,如果请求被此规则命中,将不会继续再向下匹配其他规则。
mysql源码安装{
groupadd mysql
useradd mysql -g mysql -M -s /bin/false
tar zxvf mysql-5.0.22.tar.gz
cd mysql-5.0.22
./configure
--prefix=/usr/local/mysql \
--with-client-ldflags=-all-static \
--with-mysqld-ldflags=-all-static \
--with-mysqld-user=mysql \
--with-extra-charsets=all \
--with-unix-socket-path=/var/tmp/mysql.sock
# 生成mysql用户数据库和表文件,在安装包中输入
scripts/mysql_install_db
--user=mysql
vi ~/.bashrc
export PATH="$PATH: /usr/local/mysql/bin"
# 配置文件,有large,medium,small三个,根据机器性能选择
cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chmod 700 /etc/init.d/mysqld
cd /usr/local
chmod 750 mysql -R
chgrp mysql mysql -R
chown mysql mysql/var -R
/usr/local/mysql/libexec/mysqld mysqld.old
ln -s /usr/local/mysql/bin/mysql /sbin/mysql
ln -s /usr/local/mysql/bin/mysqladmin /sbin/mysqladmin
ln -s -f /usr/local/mysql/bin/mysqld_safe /etc/rc.d/rc3.d/S15mysql5
ln -s -f /usr/local/mysql/bin/mysqld_safe /etc/rc.d/rc0.d/K15mysql5
mysql常用命令{
./mysql/bin/mysqld_safe --user=mysql &
# 启动mysql服务
./mysql/bin/mysqladmin -uroot -p -S ./mysql/data/mysql.sock shutdown
# 停止mysql服务
mysqlcheck -uroot -p -S mysql.sock --optimize --databases account
# 检查、修复、优化MyISAM表
mysqlbinlog slave-relay-bin.000001
# 查看二进制日志(报错加绝对路径)
mysqladmin -h myhost -u root -p create dbname
# 创建数据库
# 显示所有数据库
# 打开数据库
# 显示选中数据库中所有的表
# 查看表结构
# 删除数据库
# 创建数据库
select 列名称 from 表名称;
# 查看用户权限
# 查看mysql进程
select user();
# 查看所有用户
show slave status\G;
# 查看主从状态
# 查看所有参数变量
# 运行状态
show table status
# 查看表的引擎状态
drop table if exists user
# 表存在就删除
create table if not exists user
# 表不存在就创建
select host,user,
# 查询用户权限 先use mysql
create table ka(ka_id varchar(6),qianshu int);
SHOW VARIABLES LIKE ‘character_set_%‘;
# 查看系统的字符集和排序方式的设定
show variables like ‘%timeout%‘;
# 查看超时(wait_timeout)
delete from user where user=‘‘;
# 删除空用户
delete from user where user=‘sss‘ and host=‘localhost‘ ;
# 删除用户
drop user ‘sss‘@‘localhost‘;
# 使用此方法删除用户更为靠谱
ALTER TABLE mytable ENGINE = MyISAM ;
# 改变现有的表使用的存储引擎
SHOW TABLE STATUS from
where Name=‘表名‘;
# 查询表引擎
CREATE TABLE innodb (id int, title char(20)) ENGINE = INNODB
# 创建表指定存储引擎的类型(MyISAM或INNODB)
grant replication slave on *.* to ‘用户‘@‘%‘ identified by ‘密码‘;
# 创建主从复制用户
ALTER TABLE player ADD INDEX weekcredit_faction_index (weekcredit, faction);
# 添加索引
alter table name add column accountid(列名)
int(11) NOT NULL(字段不为空);
# 插入字段
update host set monitor_state=‘Y‘,hostname=‘xuesong‘ where ip=‘192.168.1.1‘;
# 更新数据
create table oldBoy
(id INTEGER
PRIMARY KEY AUTO_INCREMENT, name CHAR(30) NOT NULL, age integer , sex CHAR(15) );
# 创建自增表
insert into oldBoy(name,age,sex) values(%s,%s,%s)
# 自增插入数据
登录mysql的命令{
# 格式: mysql -h 主机地址 -u 用户名 -p 用户密码
mysql -h110.110.110.110 -P3306 -uroot -p
mysql -uroot -p -S /data1/mysql5/data/mysql.sock -A
--default-character-set=GBK
shell执行mysql命令{
mysql -u root -p‘123‘ xuesong & file.sql
# 针对指定库执行sql文件中的语句,好处不需要转义特殊符号,一条语句可以换行.不指定库执行时语句中需要先use
mysql -u$username -p$passwd -h$dbhost -P$dbport -A -e "
delete from data where date=(‘$date1‘);
# 执行多条mysql命令
mysql -uroot -p -S mysql.sock -e "alter table gift add column accountid
int(11) NOT NULL;"
# 不登陆mysql插入字段
备份数据库{
mysqldump -h host -u root -p --default-character-set=utf8 dbname &dbname_backup.sql
# 不包括库名,还原需先创建库,在use
mysqldump -h host -u root -p --database --default-character-set=utf8 dbname &dbname_backup.sql
# 包括库名,还原不需要创建库
/bin/mysqlhotcopy -u root -p
# mysqlhotcopy只能备份MyISAM引擎
mysqldump -u root -p -S mysql.sock --default-character-set=utf8 dbname table1 table2
& /data/db.sql
mysqldump -uroot -p123
-d database & database.sql
# 备份数据库结构
innobackupex --user=root --password="" --defaults-file=/data/mysql5/data/my_3306.cnf --socket=/data/mysql5/data/mysql.sock --slave-info --stream=tar --tmpdir=/data/dbbackup/temp /data/dbbackup/ 2&/data/dbbackup/dbbackup.log | gzip 1&/data/dbbackup/db50.tar.gz
# xtrabackup备份需单独安装软件 优点: 速度快,压力小,可直接恢复主从复制
还原数据库{
mysql -h host -u root -p dbname & dbname_backup.sql
source 路径.sql
# 登陆mysql后还原sql文件
# 指定IP: $IP
本机: localhost
所有IP地址: %
# 通常指定多条
grant all on zabbix.* to user@"$IP";
# 对现有账号赋予权限
grant select on database.* to user@"%" Identified by "passwd";
# 赋予查询权限(没有用户,直接创建)
grant all privileges on database.* to user@"$IP" identified by ‘passwd‘;
# 赋予指定IP指定用户所有权限(不允许对当前库给其他用户赋权限)
grant all privileges on database.* to user@"localhost" identified by ‘passwd‘
# 赋予本机指定用户所有权限(允许对当前库给其他用户赋权限)
grant select, insert, update, delete on database.* to user@‘ip‘identified by "passwd";
# 开放管理操作指令
revoke all on *.* from user@
# 回收权限
update user set password=password(‘passwd‘) where user=‘root‘
mysqladmin -u root password ‘xuesong‘
mysql忘记密码后重置{
cd /data/mysql5
/data/mysql5/bin/mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
update user set password=password(‘123123‘) where user=‘root‘;
mysql主从复制失败恢复{
change master to master_host=‘10.10.10.110‘,master_port=3306,master_user=‘repl‘,master_password=‘repl‘,master_log_file=‘master-bin.000010‘,master_log_pos=107,master_connect_retry=60;
sql语句使用变量{
set @a=concat(‘my‘,weekday(curdate()));
# 组合时间变量
set @sql := concat(‘CREATE TABLE IF NOT EXISTS ‘,@a,‘( id INT(11) NOT NULL )‘);
# 组合sql语句
# 查看语句
prepare create_tb from @
execute create_
检测mysql主从复制延迟{
1、在从库定时执行更新主库中的一个timeout数值
2、同时取出从库中的timeout值对比判断从库与主库的延迟
mysql慢查询{
开启慢查询日志{
# 配置文件 /etc/my.conf
log-slow-queries=/var/lib/mysql/slowquery.log
# 指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log
long_query_time=5
# 记录超过的时间,默认为10s
log-queries-not-using-indexes
# log下来没有使用索引的query,可以根据情况决定是否开启
log-long-format
# 如果设置了,所有没有使用索引的查询也将被记录
# 直接修改生效
show variables like "%slow%";
# 查看慢查询状态
set global slow_query_log=‘ON‘;
# 开启慢查询日志 变量可能不同,看上句查询出来的变量
mysqldumpslow慢查询日志查看{
# 是order的顺序,包括看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序
# 是top n的意思,即为返回前面多少条的数据
# 后边可以写一个正则匹配模式,大小写不敏感的
mysqldumpslow -s c -t 20 host-slow.log
# 访问次数最多的20个sql语句
mysqldumpslow -s r -t 20 host-slow.log
# 返回记录集最多的20个sql
mysqldumpslow -t 10 -s t -g "left join" host-slow.log # 按照时间返回前10条里面含有左连接的sql语句
show global status like ‘%slow%‘;
# 查看现在这个session有多少个慢查询
show variables like ‘%slow%‘;
# 查看慢查询日志是否开启,如果slow_query_log和log_slow_queries显示为on,说明服务器的慢查询日志已经开启
show variables like ‘%long%‘;
# 查看超时阀值
desc select * from wei where text=‘xishizhaohua‘\G;
# 扫描整张表 tepe:ALL
没有使用索引 key:NULL
create index text_index on wei(text);
# 创建索引
mysql操作次数查询{
select * from information_schema.global_
com_select
com_delete
com_insert
com_update
# 不启动认证
./mongod --port 27017 --fork --logpath=/opt/mongodb/mongodb.log --logappend --dbpath=/opt/mongodb/data/
# 启动认证
./mongod --port 27017 --fork --logpath=/opt/mongodb/mongodb.log --logappend --dbpath=/opt/mongodb/data/ --auth
# 配置文件方式启动
cat /opt/mongodb/mongodb.conf
port=27017
# 以守护进程的方式运行,创建服务器进程
# 开启用户认证
logappend=true
# 日志采用追加方式
logpath=/opt/mongodb/mongodb.log # 日志输出文件路径
dbpath=/opt/mongodb/data/
# 数据库路径
shardsvr=true
# 设置是否分片
maxConns=600
# 数据库的最大连接数
./mongod -f /opt/mongodb/mongodb.conf
# 其他参数
使用mongo登录需要指定对应IP
# 开启日志功能,降低单机故障的恢复时间,取代dur参数
# 系统同步刷新磁盘的时间,默认60秒
directoryperdb
# 每个db单独存放目录,建议设置.与mysql独立表空间类似
repairpath
# 执行repair时的临时目录.如果没开启journal,出现异常重启,必须执行repair操作
# mongodb没有参数设置内存大小.使用os mmap机制缓存数据文件,在数据量不超过内存的情况下,效率非常高.数据量超过系统可用内存会影响写入性能
# 方法一:登录mongodb
db.shutdownServer()
# 方法:kill传递信号
kill -2 pid
kill -15 pid
三、开启认证与用户管理{
# 切换到admin库
db.addUser("root","123456")
# 创建用户
db.addUser(‘zhansan‘,‘pass‘,true)
# 如果用户的readOnly为true那么这个用户只能读取数据,添加一个readOnly用户zhansan
./mongo 127.0.0.1:27017/mydb -uroot -p123456
# 再次登录,只能针对用户所在库登录
#虽然是超级管理员,但是admin不能直接登录其他数据库,否则报错
#Fri Nov 22 15:03:21.886 Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" } at src/mongo/shell/db.js:228
show collections
# 查看链接状态 再次登录使用如下命令,显示错误未经授权
db.system.users.find();
# 查看创建用户信息
db.system.users.remove({user:"zhansan"})
# 删除用户
#恢复密码只需要重启mongodb 不加--auth参数
192.168.1.5:28017
# http登录后可查看状态
# 默认登录后打开 test 库
./mongo 192.168.1.5:27017/databaseName
# 直接连接某个库 不存在则创建
启动认证需要指定对应库才可登录
五、查看状态{
#登录后执行命令查看状态
db.runCommand({"serverStatus":1})
globalLock
# 表示全局写入锁占用了服务器多少时间(微秒)
# 包含服务器内存映射了多少数据,服务器进程的虚拟内存和常驻内存的占用情况(MB)
indexCounters
# 表示B树在磁盘检索(misses)和内存检索(hits)的次数.如果这两个比值开始上升,就要考虑添加内存了
backgroudFlushing
# 表示后台做了多少次fsync以及用了多少时间
opcounters
# 包含每种主要擦撞的次数
# 统计了断言的次数
#状态信息从服务器启动开始计算,如果过大就会复位,发送复位,所有计数都会复位,asserts中的roolovers值增加
#mongodb自带的命令
./mongostat
#每秒插入量
#每秒查询量
#每秒更新量
#每秒删除量
#客户端查询排队长度(读|写)
#活跃客户端量(读|写)
六、常用命令{
db.listCommands()
# 当前MongoDB支持的所有命令(同样可通过运行命令db.runCommand({"listCommands" : `1})来查询所有命令)
db.runCommand({"buildInfo" : 1})
# 返回MongoDB服务器的版本号和服务器OS的相关信息。
db.runCommand({"collStats" : 集合名})
# 返回该集合的统计信息,包括数据大小,已分配存储空间大小,索引的大小等。
db.runCommand({"distinct" : 集合名, "key" : 键, "query" : 查询文档})
# 返回特定文档所有符合查询文档指定条件的文档的指定键的所有不同的值。
db.runCommand({"dropDatabase" : 1})
# 清空当前数据库的信息,包括删除所有的集合和索引。
db.runCommand({"isMaster" : 1})
# 检查本服务器是主服务器还是从服务器。
db.runCommand({"ping" : 1})
# 检查服务器链接是否正常。即便服务器上锁,该命令也会立即返回。
db.runCommand({"repaireDatabase" : 1})
# 对当前数据库进行修复并压缩,如果数据库特别大,这个命令会非常耗时。
db.runCommand({"serverStatus" : 1})
# 查看这台服务器的管理统计信息。
# 某些命令必须在admin数据库下运行,如下两个命令:
db.runCommand({"renameCollection" : 集合名, "to":集合名})
# 对集合重命名,注意两个集合名都要是完整的集合命名空间,如foo.bar, 表示数据库foo下的集合bar。
db.runCommand({"listDatabases" : 1})
# 列出服务器上所有的数据库
七、进程控制{
db.currentOp()
# 查看活动进程
db.$cmd.sys.inprog.findOne()
# 查看活动进程 与上面一样
# 操作进程号
# 操作类型(查询\更新)
# 命名空间,指操作的是哪个对象
# 如果操作类型是查询,这里将显示具体的查询内容
# 锁的类型,指明是读锁还是写锁
db.killOp(opid值)
# 结束进程
db.$cmd.sys.killop.findOne({op:opid值})
# 结束进程
八、备份还原{
./mongoexport -d test -c t1 -o t1.dat
# 导出JSON格式
# 指明导出集合
./mongoexport -d test -c t1 -csv -f num -o t1.dat
# 导出csv格式
# 指明导出csv格式
# 指明需要导出那些例
db.t1.drop()
# 登录后删除数据
./mongoimport -d test -c t1 -file t1.dat
# mongoimport还原JSON格式
./mongoimport -d test -c t1 -type csv --headerline -file t1.dat
# mongoimport还原csv格式数据
--headerline
# 指明不导入第一行 因为第一行是列名
./mongodump -d test -o /bak/mongodump
# mongodump数据备份
./mongorestore -d test --drop /bak/mongodump/*
# mongorestore恢复
#恢复前先删除
db.t1.find()
# mongodump 虽然能不停机备份,但市区了获取实时数据视图的能力,使用fsync命令能在运行时复制数据目录并且不会损坏数据
# fsync会强制服务器将所有缓冲区的数据写入磁盘.配合lock还阻止对数据库的进一步写入,知道释放锁为止
# 备份在从库上备份,不耽误读写还能保证实时快照备份
db.runCommand({"fsync":1,"lock":1})
# 执行强制更新与写入锁
db.$cmd.sys.unlock.findOne()
db.currentOp()
# 查看解锁是否正常
# 当停电或其他故障引起不正常关闭时,会造成部分数据损坏丢失
./mongod --repair
# 修复操作:启动时候加上 --repair
# 修复过程:将所有文档导出,然后马上导入,忽略无效文档.完成后重建索引。时间较长,会丢弃损坏文档
# 修复数据还能起到压缩数据库的作用
db.repairDatabase()
# 运行中的mongodb可使用 repairDatabase 修复当前使用的数据库
{"repairDatabase":1}
# 通过驱动程序
十、python使用mongodb{
原文: http://blog.nosqlfan.com/html/2989.html
easy_install pymongo
# 安装(python2.7+)
import pymongo
connection=pymongo.Connection(‘localhost‘,27017)
# 创建连接
db = connection.test_database
# 切换数据库
collection = db.test_collection
# 获取collection
# db和collection都是延时创建的,在添加Document时才真正创建
文档添加, _id自动创建
import datetime
post = {"author": "Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
posts = db.posts
posts.insert(post)
ObjectId(‘...‘)
new_posts = [{"author": "Mike",
"text": "Another post!",
"tags": ["bulk", "insert"],
"date": datetime.datetime(, 11, 14)},
{"author": "Eliot",
"title": "MongoDB is fun",
"text": "and pretty easy too!",
"date": datetime.datetime(, 10, 45)}]
posts.insert(new_posts)
[ObjectId(‘...‘), ObjectId(‘...‘)]
获取所有collection
db.collection_names()
# 相当于SQL的show tables
获取单个文档
posts.find_one()
查询多个文档
for post in posts.find():
加条件的查询
posts.find_one({"author": "Mike"})
posts.find({"date": {"$lt": "d"}}).sort("author")
posts.count()
from pymongo import ASCENDING, DESCENDING
posts.create_index([("date", DESCENDING), ("author", ASCENDING)])
查看查询语句的性能
posts.find({"date": {"$lt": "d"}}).sort("author").explain()["cursor"]
posts.find({"date": {"$lt": "d"}}).sort("author").explain()["nscanned"]
chmod 744 jdk-1.7.0_79-linux-i586.bin
./jdk-1.7.0_79-linux-i586.bin
vi /etc/profile
# 添加环境变量
JAVA_HOME=/usr/java/jdk1.7.0_79
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH CLASSPATH
. /etc/profile
# 加载新的环境变量
# 查看java进程
redis动态加内存{
./redis-cli -h 10.10.10.11 -p 6401
# 保存当前快照
config get *
# 列出所有当前配置
config get maxmemory
# 查看指定配置
config set maxmemory
# 动态修改最大内存配置参数
# 依赖rpc服务通信 portmap[centos5] 或 rpcbind[centos6]
yum install nfs-utils portmap
# centos5安装
yum install nfs-utils rpcbind
# centos6安装
vim /etc/exports
# 配置文件
# 同步写入
# 暂存并非直接写入
# no_root_squash
# 开放用户端使用root身份操作
# root_squash
# 使用者身份为root则被压缩成匿名使用,即nobody,相对安全
# all_squash
# 所有NFS的使用者身份都被压缩为匿名
/data/images 10.10.10.0/24(rw,sync,no_root_squash)
portmap restart
# 重启centos5的nfs依赖的rpc服务
rpcbind restart
# 重启centos6的nfs依赖的rpc服务
nfs restart
# 重启nfs服务
确保依赖 portmap 或 rpcbind 服务已启动
nfs reload
# 重载NFS服务配置文件
showmount -e
# 服务端查看自己共享的服务
showmount -a
# 显示已经与客户端连接上的目录信息
showmount -e 10.10.10.3
# 列出服务端可供使用的NFS共享
客户端测试能否访问nfs服务
mount -t nfs 10.10.10.3:/data/images/
如果延迟影响大加参数 noac
# 服务端的 portmap 或 rpcbind 被停止后,nfs仍然工作正常,但是umout财会提示: not found / mounted or server not reachable
重启服务器的portmap 或 rpcbind 也无济于事。 nfs也要跟着重启,否则nfs工作仍然是不正常的。
# 同时已挂载会造成NFS客户端df卡住和挂载目录无法访问。请先用 mount 查看当前挂载情况,记录挂载信息,在强制卸载挂载目录,重新挂载
umount -f /data/img/
# 强制卸载挂载目录
如还不可以
umount -l /data/img/
nfsstat -c
# 客户机发送和拒绝的RPC和NFS调用数目的信息
nfsstat -cn
# 显示和打印与客户机NFS调用相关的信息
nfsstat -r
# 显示和打印客户机和服务器的与RPC调用相关的信息
nfsstat –s
# 显示关于服务器接收和拒绝的RPC和NFS调用数目的信息
hdfs --help
# 所有参数
hdfs dfs -help
# 运行文件系统命令在Hadoop文件系统
hdfs dfs -ls /logs
hdfs dfs -ls /user/
# 查看用户
hdfs dfs -cat
hdfs dfs -df
hdfs dfs -du
hdfs dfs -rm
hdfs dfs -tail
hdfs dfsadmin -help
# hdfs集群节点管理
hdfs dfsadmin -report
# 基本的文件系统统计信息
# 通过ssh上传小文件
# 通过ssh下载小文件
ifconfig eth0 down
# 禁用网卡
ifconfig eth0 up
# 启用网卡
ifup eth0:0
# 启用网卡
mii-tool em1
# 查看网线是否连接
traceroute www.baidu.com
# 测试跳数
vi /etc/resolv.conf
nameserver IP 定义DNS服务器的IP地址
nslookup www.moon.com
# 解析域名IP
dig -x www.baidu.com
# 解析域名IP
dig +short txt hacker.wp.dg.cx
# 通过 DNS 来读取 Wikipedia 的hacker词条
host -t txt hacker.wp.dg.cx
# 通过 DNS 来读取 Wikipedia 的hacker词条
tcpdump tcp port 22
# 文本上网
wget -P 路径 -O 重命名 http地址
包名:wgetrc
dhclient eth1
# 自动获取IP
mtr -r www.baidu.com
# 测试网络链路节点响应时间 # trace ping 结合
ipcalc -m "$ip" -p "$num"
# 根据IP和主机最大数计算掩码
curl -I www.baidu.com
# 查看网页http头
curl -s www.baidu.com
# 不显示进度
queryperf -d list -s DNS_IP -l 2
# BIND自带DNS压力测试
[list 文件格式:www.turku.fi A]
telnet ip port
# 测试端口是否开放,有些服务可直接输入命令得到返回状态
echo "show " |nc $ip $port
# 适用于telnet一类登录得到命令返回
nc -l -p port
# 监听指定端口
nc -nv -z 10.10.10.11 1080 |grep succeeded
# 检查主机端口是否开放
curl -o /dev/null -s -m 10 --connect-timeout 10 -w %{http_code} $URL
# 检查页面状态
curl -d "user=xuesong&pwd=123" http://www.abc.cn/Result
# 提交web页面表单 需查看表单提交地址
curl -s http://.ip138.com/ic.asp
# 通过IP138取本机出口外网IP
rsync -avzP -e "ssh -p 22" /dir user@$IP:/dir
# 同步目录 # --delete 无差同步 删除目录下其它文件
sshpass -p "$passwd"
rsync -avzP -e "ssh -p 22" /dir
user@$IP:/dir/ # 指定密码避免交互同步目录
ifconfig eth0:0 192.168.1.221 netmask 255.255.255.0
# 增加逻辑IP地址
echo 1 & /proc/sys/net/ipv4/icmp_echo_ignore_all
net rpc shutdown -I IP_ADDRESS -U username%password
# 远程关掉一台WINDOWS机器
wget --random-wait -r -p -e robots=off -U Mozilla www.example.com
# 递归方式下载整个网站
网卡流量查看{
watch more /proc/net/dev
# 实时监控流量文件系统 累计值
# 网卡流量查看工具
nethogs -d 5 eth0 eth1
# 按进程实时统计网络流量 epel源nethogs
-n参数有6个不同的开关: DEV | EDEV | NFS | NFSD | SOCK | ALL
DEV显示网络接口信息
EDEV显示关于网络错误的统计数据
NFS统计活动的NFS客户端的信息
NFSD统计NFS服务器的信息
SOCK显示套 接字信息
ALL显示所有5个开关
sar -n DEV 1 10
# 每秒钟接收的数据包
# 每秒钟发送的数据包
# 每秒钟接收的字节数
# 每秒钟发送的字节数
# 每秒钟接收的压缩数据包
# 每秒钟发送的压缩数据包
# 每秒钟接收的多播数据包
# 几十万并发的情况下netstat会没有响应,建议使用 ss 命令
# 显示所有连接中的Socket
# 显示TCP连接
# 显示UDP连接
# 显示所有已建立的有效连接
netstat -anlp
# 查看链接
netstat -r
# 查看路由表
# netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多
# 列出当前socket详细信息
# 显示本地打开的所有端口
# 显示每个进程具体打开的socket
# 显示所有TCP socket
# 显示所有UDP Socekt
ss dst 192.168.119.113
# 匹配远程地址
ss dst 192.168.119.113:http
# 匹配远程地址和端口号
ss dst 192.168.119.113:3844
# 匹配远程地址和端口号
ss src 192.168.119.103:16021
# 匹配本地地址和端口号
ss -o state established ‘( dport = :smtp or sport = :smtp )‘
# 显示所有已建立的SMTP连接
ss -o state established ‘( dport = :http or sport = :http )‘
# 显示所有已建立的HTTP连接
ss -x src /tmp/.X11-unix/*
# 找出所有连接X服务器的进程
并发数查看{
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}‘
# 正在等待处理的请求
ESTABLISHED
# 正常数据传输状态,既当前并发数
# 处理完毕,等待超时结束的请求
CLOSE_WAIT
# 客户端异常关闭,没有完成4次挥手
如大量可能存在攻击行为
ssh -p 22 user@192.168.1.209
# 从linux ssh登录另一台linux
ssh -p 22 root@192.168.1.209 CMD
# 利用ssh操作远程主机
scp -P 22 文件 root@ip:/目录
# 把本地文件拷贝到远程主机
sshpass -p ‘密码‘ ssh -n root@$IP "echo hello"
# 指定密码远程操作
ssh -o StrictHostKeyChecking=no $IP
# ssh连接不提示yes
ssh -t "su -"
# 指定伪终端 客户端以交互模式工作
scp root@192.168.1.209:远程目录 本地目录
# 把远程指定文件拷贝到本地
ssh -N -L2001:remotehost:80 user@somemachine
# 用SSH创建端口转发通道
ssh -t host_A ssh host_B
# 嵌套使用SSH
ssh -t -p 22 $user@$Ip /bin/su - root -c {$Cmd};
# 远程su执行命令 Cmd="\"/sbin/ifconfig eth0\""
ssh-keygen -t rsa
# 生成密钥
ssh-copy-id -i xuesong@10.10.10.133
vi $HOME/.ssh/authorized_keys
# 公钥存放位置
sshfs name@server:/path/to/folder /path/to/mount/point
# 通过ssh挂载远程主机上的文件夹
fusermount -u /path/to/mount/point
# 卸载ssh挂载的目录
ssh user@host cat /path/to/remotefile | diff /path/to/localfile -
# 用DIFF对比远程文件跟本地文件
su - user -c "ssh user@192.168.1.1 \"echo -e aa |mail -s test \""
# 切换用户登录远程发送邮件
SSH反向连接{
# 外网A要控制内网B
ssh -NfR 1234:localhost:2223 user1@123.123.123.123 -p22
# 将A主机的1234端口和B主机的2223端口绑定,相当于远程端口映射
# 这时在A主机上sshd会listen本地1234端口
127.0.0.1:1234
ssh localhost -p1234
# 在A主机连接本地1234端口
网卡配置文件{
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
BROADCAST=192.168.1.255
HWADDR=00:0C:29:3F:E1:EA
IPADDR=192.168.1.55
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
TYPE=Ethernet
GATEWAY=192.168.1.1
#ARPCHECK=no
# 进制arp检查
# 查看路由表
rou}

我要回帖

更多关于 空白字符 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信