常用命令:
find查找{
#linux文件没有创建时间 #Access 使用时间 #Modify 修改内容的时间 #Change 状态改变时间(权限、属主) #时间默认为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 path -name name1 -or -name name2 # 找到任何关键字
}
sort排序{
-t # 指定排序时使用的栏分隔字符 -n # 按数值大小排序 -r # 以相反的顺序排序 -f # 排序时,将小写字母视为大写字母 -d # 在处理英文字母、数字和空格字符时,忽略其他字符 -c # 检查文件是否按顺序排序 -b # 忽略每行前面开始处的空格字符 -M # 前三个字母按月缩写排序 -k # 指定域 -m # 合并几个排序良好的文件 -T # 指定临时文件目录,默认在/tmp -o # 将排序后的结果存储在指定的文本中
sort -n # 按数字排序 sort -nr # 按数字倒叙 sort -u # 过滤重复行 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 a.txt # 以第二域排序,如遇重复,则删除
}
vim编辑器{
gconf-editor # 配置编辑器 /etc/vimrc # 配置文件路径 vim 24 file # 打开文件定位到指定行 vim file1 file2 # 打开多个文件 vim -r file # 恢复上次异常关闭的文件 .file.swp vim -O2 file1 file2 # 垂直分屏 vim -on file1 file2 # 水平分屏 Ctrl U # 向前翻页 Ctrl D # 向后翻页 Ctrl ww # 切换窗口 Ctrl w or-or= # 增减高度 :sp filename # 上下分割打开新文件 :vs filename # 左右分割打开新文件 :set nu # 打开行号 :set nonu # 取消行号 :nohl # 取消高亮 :set paste # 取消缩进 :set autoindent # 设置自动缩进 :set ff # 查看文本格式 :set binary # 改为unix格式 :%s/str/newstr/g # 全部替换 :200 # 跳转到200 1 文件头 G # 跳到行尾 dd # 删除当前行 并复制 可直接粘贴p 11111dd # 删除11111行,可用于清空文件 r # 替换单个字符 R # 替换多个字符 u # 撤销上次操作 *# 全文匹配当前光标的字符串 $ # 行尾 0 # 行首 X # 文档加密 v = # 自动格式化代码 Ctrl v # 可视模式 Ctrl v I ESC # 多行操作 Ctrl v s ESC # 批量取消注释
}
归档解压缩{
tar zxvpf gz.tar.gz dir # 解包指定tar.gz中的内容 不指定目录的,全解压 tar zcvpf /KaTeX parse error: Expected 'EOF', got '#' at position 18: …th/gz.tar.gz * #? 打包gz 注意*最好使用相对路…path/gz.tar.gz * # 没有提示包装正确 tar ztvpf gz.tar.gz # 查看gz tar xvf 1.tar -C dir # 解包tar 放入指定目录 tar -cvf 1.tar * # 打包tar tar tvf 1.tar # 查看tar tar -rvf 1.tar filename # 给tar追加文件 tar --exclude=/home/dmtsai --exclude=.tar -zcvf myfile.tar.gz /home/ /etc # 打包/home, /etc ,但排除 /home/dmtsai tar -N “2005/06/01” -zcvf home.tar.gz /home # 在 /home 当中,比 2005/06/01 备份新文件 tar -zcvfh home.tar.gz /home # 包装目录包括连接目录 tar zcf - ./ | ssh root@IP “tar zxf - -C /xxxx” # 压缩时解压 zgrep str 1.gz # 检查压缩包中的文件字符 bzip2 -dv 1.tar.bz2 # 解压bzip2 bzip2 -v 1.tar # bzip2压缩 bzcat # 查看bzip2 gzip A # 直接压缩文件 # 压缩后源文件消失 gunzip A.gz # 直接解压文件 # 解压后源文件消失 gzip -dv 1.tar.gz # 解压gzip到tar gzip -v 1.tar # 压缩tar到gz unzip zip.zip # 解压zip zip zip.zip * # 压缩zip rar a rar.rar *.jpg # 压缩文件为rar包 unrar x rar.rar # 解压rar包
}
svn更新代码{
–force # 强制覆盖 /usr/bin/svn --username user --password passwd co $Code ${SvnPath}src/ # 检查整个项目 /usr/bin/svn --username user --password passwd up $Code ${SvnPath}src/ # 更新项目 /usr/bin/svn --username user --password passwd export C o d e Code CodeFile S v n P a t h s r c / {SvnPath}src/ SvnPathsrc/File # 导出个别文件 /usr/bin/svn --username user --password passwd export -r 版本号 svn路径 本地路径 --force # 导出指定版本
}
git{
git clone git@10.10.10.10:gittest.git ./gittest/ # 克隆项目到指定目录 git clone -b develop --depth=1 http://git.a.com/d.git # 克隆指定分支 克隆一层 git status # Show the working tree(工作树) status git log -n 1 --stat # 查看最后一次日志文件 git branch -a # 列出远程跟踪分支(remote-tracking branches)和本地分支 git checkout developing # 切换到developing分支 git checkout -b release # 切换分支没有从当前分支创建 git checkout -b release origin/master # 从远程分支创建本地镜像分支 git push origin --delete release # 从远端删除分区,服务端有可能设置保护不允许删除 git push origin release # 把本地分支提交到远程 git pull # 更新项目 需要cd到项目目录中 git fetch -f -p # 抓取远端代码但不合并到当前 git reset --hard origin/master # 和远端同步分支 git add . # 更新所有文件 git commit -m “gittest up” # 提交操作并添加备注 git push # 正式提交到远程git服务器 git push [-u origin master] # 正式提交到远程git服务器(master分支) git tag [-a] dev-v-0.11.54 [-m ‘fix #67’] # 创建tag,名为dev-v-0.11.54,备注fix #67 git tag -l dev-v-0.11.54 # 查看tag(dev-v-0.11.5) git push origin --tags # 提交tag git reset --hard # 本地恢复整个项目 git rm -r -n --cached ./img # -n执行命令时,不会删除任何文件,而是展示此命令要删除的文件列表预览 git rm -r --cached ./img # 执行删除命令 需要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 # 记住密码 git config [–global] user.name “your name” # 设置你的用户名, 希望在一个特定的项目中使用不同的用户或e-mail地址, 不要–global选项 git config [–global] user.email “your email” # 设置你的e-mail地址, 每次Git提交都会使用该信息 git config [–global] user.name # 查看用户名 git config [–global] user.email # 查看用户e-mail git config --global --edit # 编辑~/.gitconfig(User-specific)配置文件, 值优先级高于/etc/gitconfig(System-wide) git config --edit # 编辑.git/config(Repository specific)配置文件, 值优先级高于~/.gitconfig git cherry-pick # 用于把另一个本地分支的commit修改应用到当前分支 需要push到远程 git log --pretty=format:’%h: %s’ 9378b62…HEAD # 查看指定范围更新操作 commit id git config --global core.ignorecase false # 设置全局大小写敏感 git ls-remote --heads origin refs/heads/test # 查看
从远端拉一份新的{
#You have not concluded your merge (MERGE_HEAD exists) git拉取失败 git fetch --hard origin/master git reset --hard origin/master }
删除远程分支并新建{ git checkout master git branch -r -d origin/test # 删除远程分支 但有时候并没有删除 可以尝试使用下面的语句 git push origin :test # 推送一个空分支到远程分支,相当于删除远程分支 git branch -d test # 删除本地test分支, -D 强制 git branch -a |grep test git checkout -b test git push origin test
git reset --hard origin/test }
迁移git项目{ git branch -r | grep -v ‘->’ | while read remote; do git branch --track “KaTeX parse error: Expected '}', got '#' at position 8: {remote#̲origin/}" "remote”; done git fetch --all git pull --all git remote set-url origin git@git.github.cn:server/gw.git git push --all } }
恢复rm删除的文件{
#debugfs针对 ext2 # ext3grep针对 ext3 # extundelete针对 ext4 df -T # 首先查看磁盘分区格式 umount /data/ # 卸载挂载,数据丢失请首先卸载挂载,或重新挂载只读 ext3grep /dev/sdb1 --ls --inode 2 # 记录信息继续查找目录下文件inode信息 ext3grep /dev/sdb1 --ls --inode 131081 # 此处是inode ext3grep /dev/sdb1 --restore-inode 49153 # 记录下inode信息开始恢复目录
}
rpm{
rpm -ivh lynx # rpm安装 rpm -e lynx # 卸载包 rpm -e lynx --nodeps # 强制卸载 rpm -qa # 查看所有安装的rpm包 rpm -qa | grep lynx # 查找包是否安装 rpm -ql # 软件包路径 rpm -Uvh # 升级包 rpm --test lynx # 测试 rpm -qc # 软件包配置文档 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{
yum list # 所有软件列表 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 rpm -Uvh http://mirrors.hustunique.com/epel//6/x86_64/epel-release-6-8.noarch.rpm
自适配版本
yum install epel-release
}
自定义yum源{
find /etc/yum.repos.d -name “*.repo” -exec mv {} {}.bak ;
vim /etc/yum.repos.d/yum.repo [yum] #http baseurl=http://10.0.0.1/centos5.5 #挂载iso #mount -o loop CentOS-5.8-x86_64-bin-DVD-1of2.iso /data/iso/ #本地 #baseurl=file:///data/iso/ enable=1
#导入key rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
}
源码安装{
./configure --help # 查看所有编译参数 ./configure --prefix=/usr/local/ # 配置参数 make # 编译 #make -j 8 # 多线程编译,速度较快,但有些软件不支持 make install # 安装包 make clean # 清除编译结果
}
开机启动脚本顺序{
/etc/profile /etc/profile.d/*.sh ~/bash_profile ~/.bashrc /etc/bashrc
}
进程管理{
ps -eaf # 查看所有进程 kill -9 PID # 强制终止某个PID进程 kill -15 PID # 安全退出 需程序内部处理信号 cmd & # 命令后台运行 nohup cmd & # 后台运行不受shell退出影响 ctrl+z # 将前台放入后台(暂停) jobs # 查看后台运行程序 bg 2 # 启动后台暂停进程 fg 2 # 调回后台进程 pstree # 进程树 vmstat 1 9 # 每隔一秒报告系统性能信息9次 sar # 查看cpu等状态 lsof file # 显示打开指定文件的所有进程 lsof -i:32768 # 查看端口的进程 renice +1 180 # 把180号进程的优先级加1 exec sh a.sh # 子进程替换原来程序的pid, 避免supervisor无法强制杀死进程
ps{
ps aux |grep -v USER | sort -nk +4 | tail # 显示消耗内存最多的10个运行中的进程,以内存使用量排序.cpu +3 #USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND %CPU # 进程的cpu占用率 %MEM # 进程的内存占用率 VSZ # 进程虚拟大小,单位K(即总占用内存大小,包括真实内存和虚拟内存) RSS # 进程使用的驻留集大小即实际物理内存大小 START # 进程启动时间和日期 占用的虚拟内存大小 = VSZ - RSS
ps -eo pid,lstart,etime,args # 查看进程启动时间
}
top{
前五行是系统整体的统计信息。 第一行: 任务队列信息,同 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时间百分比 0.0% hi 0.0% si
第四、五行:为内存信息。内容如下: Mem: 191272k total 物理内存总量 173656k used 使用的物理内存总量 17616k free 空闲内存总量 22052k buffers 用作内核缓存的内存量 Swap: 192772k total 交换区总量 0k used 使用的交换区总量 192772k free 空闲交换区总量 123988k cached 缓冲的交换区总量。 内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖, 该数值即为这些内容已存在于内存中的交换区的大小。 相应的内存再次被换出时可不必再对交换区写入。
进程信息区,各列的含义如下: # 显示各个进程的详细信息
序号 列名 含义 a PID 进程id b PPID 父进程id c RUSER Real user name d UID 进程所有者的用户id e USER 进程所有者的用户名 f GROUP 进程所有者的组名 g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ? h PR 优先级 i NI nice值。负值表示高优先级,正值表示低优先级 j P 最后使用的CPU,仅在多CPU环境下有意义 k %CPU 上次更新到现在的CPU时间占用百分比 l TIME 进程使用的CPU时间总计,单位秒 m TIME+ 进程使用的CPU时间总计,单位1/100秒 n %MEM 进程使用的物理内存百分比 o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。 q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA r CODE 可执行代码占用的物理内存大小,单位kb s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb t SHR 共享内存大小,单位kb u nFLT 页面错误次数 v nDRT 最后一次写入到现在,被修改过的页面数。 w S 进程状态。 D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 父进程在但并不等待子进程 x COMMAND 命令名/命令行 y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名 z Flags 任务标志,参考 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]
do #让进程释放swap的方法只有一个:就是重启该进程。或者等其自动释放。放 #如果进程会自动释放,那么我们就不会写脚本来找他了,找他都是因为他没有自动释放。 #所以我们要列出占用swap并需要重启的进程,但是init这个进程是系统里所有进程的祖先进程 #重启init进程意味着重启系统,这是万万不可以的,所以就不必检测他了,以免对系统造成影响。 if [ p i d − e q 1 ] ; t h e n c o n t i n u e ; f i g r e p − q " S w a p " / p r o c / pid -eq 1 ];then continue;fi grep -q "Swap" /proc/ pid−eq1];thencontinue;figrep−q"Swap"/proc/pid/smaps 2>/dev/null if [ ? − e q 0 ] ; t h e n s w a p = ? -eq 0 ];then swap= ?−eq0];thenswap=(grep Swap /proc/$pid/smaps | gawk ‘{ sum+=KaTeX parse error: Expected 'EOF', got '}' at position 3: 2;}̲ END{ print sum…(ps aux | grep -w "KaTeX parse error: Undefined control sequence: \ at position 21: …| grep -v grep \̲ ̲| awk '{ for(i=…i); }}’) if [ s w a p − g t 0 ] ; t h e n e c h o − e " swap -gt 0 ];then echo -e " swap−gt0];thenecho−e"{pid}\tKaTeX parse error: Undefined control sequence: \t at position 7: {swap}\̲t̲{proc_name}" fi fi done | sort -k2 -n | awk -F’\t’ ‘{
pid[NR]=$1; size[NR]=$2; name[NR]=$3; } END{
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]); else printf("%-10s\t%15.2fGB\t%s\n",pid[id],size[id]/1048576,name[id]); } }’
}
linux操作系统提供的信号{
kill -l # 查看linux提供的信号 trap “echo aaa” 2 3 15 # shell使用 trap 捕捉退出信号
发送信号一般有两种原因:
#1(被动式) 内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号 #2(主动式) 通过系统调用kill来向指定进程发送信号 #进程结束信号 SIGTERM 和 SIGKILL 的区别: SIGTERM 比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。 #如果一个进程收到一个SIGUSR1信号,然后执行信号绑定函数,第二个SIGUSR2信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。
SIGHUP 1 A # 终端挂起或者控制进程终止 SIGINT 2 A # 键盘终端进程(如control+c) SIGQUIT 3 C # 键盘的退出键被按下 SIGILL 4 C # 非法指令 SIGABRT 6 C # 由abort(3)发出的退出指令 SIGFPE 8 C # 浮点异常 SIGKILL 9 AEF # Kill信号 立刻停止 SIGSEGV 11 C # 无效的内存引用 SIGPIPE 13 A # 管道破裂: 写一个没有读端口的管道 SIGALRM 14 A # 闹钟信号 由alarm(2)发出的信号 SIGTERM 15 A # 终止信号,可让程序安全退出 kill -15 SIGUSR1 30,10,16 A # 用户自定义信号1 SIGUSR2 31,12,17 A # 用户自定义信号2 SIGCHLD 20,17,18 B # 子进程结束自动向父进程发送SIGCHLD信号 SIGCONT 19,18,25 # 进程继续(曾被停止的进程) SIGSTOP 17,19,23 DEF # 终止进程 SIGTSTP 18,20,24 D # 控制终端(tty)上按下停止键 SIGTTIN 21,21,26 D # 后台进程企图从控制终端读 SIGTTOU 22,22,27 D # 后台进程企图从控制终端写
缺省处理动作一项中的字母含义如下: A 缺省的动作是终止进程 B 缺省的动作是忽略此信号,将该信号丢弃,不做处理 C 缺省的动作是终止进程并进行内核映像转储(dump core),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。 D 缺省的动作是停止进程,进入停止状况以后还能重新进行下去,一般是在调试的过程中(例如ptrace系统调用) E 信号不能被捕获 F 信号不能被忽略 }
系统性能状态{
vmstat 1 9
r # 等待执行的任务数。当这个值超过了cpu线程数,就会出现cpu瓶颈。 b # 等待IO的进程数量,表示阻塞的进程。 swpd # 虚拟内存已使用的大小,如大于0,表示机器物理内存不足,如不是程序内存泄露,那么该升级内存。 free # 空闲的物理内存的大小 buff # 已用的buff大小,对块设备的读写进行缓冲 cache # cache直接用来记忆我们打开的文件,给文件做缓冲,(把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。) inact # 非活跃内存大小,即被标明可回收的内存,区别于free和active -a选项时显示 active # 活跃的内存大小 -a选项时显示 si # 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露,要查找耗内存进程解决掉。 so # 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。 bi # 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte bo # 块设备每秒发送的块数量,例如读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。 in # 每秒CPU的中断次数,包括时间中断。in和cs这两个值越大,会看到由内核消耗的cpu时间会越多 cs # 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用。 us # 用户进程执行消耗cpu时间(user time) us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施 sy # 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。 id # 空闲 CPU时间,一般来说,id + us + sy = 100,一般认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。 wt # 等待IOCPU时间。Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。
如果 r 经常大于4,且id经常少于40,表示cpu的负荷很重。 如果 pi po 长期不等于0,表示内存不足。 如果 b 队列经常大于3,表示io性能不好。
}
}
日志管理{
history # 历时命令默认1000条 HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " # 让history命令显示具体时间 history -c # 清除记录命令 cat $HOME/.bash_history # 历史命令记录文件 lastb -a # 列出登录系统失败的用户相关信息 清空二进制日志记录文件 echo > /var/log/btmp last # 查看登陆过的用户信息 清空二进制日志记录文件 echo > /var/log/wtmp 默认打开乱码 who /var/log/wtmp # 查看登陆过的用户信息 lastlog # 用户最后登录的时间 tail -f /var/log/messages # 系统日志 tail -f /var/log/secure # ssh日志
}
selinux{
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
}
查看剩余内存{
free -m #-/+ buffers/cache: 6458 1649 #6458M为真实使用内存 1649M为真实剩余内存(剩余内存+缓存+缓冲器) #linux会利用所有的剩余内存作为缓存,所以要保证linux运行速度,就需要保证内存的缓存大小
}
查看剩余内存{
free -m #-/+ buffers/cache: 6458 1649 #6458M为真实使用内存 1649M为真实剩余内存(剩余内存+缓存+缓冲器) #linux会利用所有的剩余内存作为缓存,所以要保证linux运行速度,就需要保证内存的缓存大小
}
系统信息{
uname -a # 查看Linux内核版本信息 cat /proc/version # 查看内核版本 cat /etc/issue # 查看系统版本 lsb_release -a # 查看系统版本 需安装 centos-release locale -a # 列出所有语系 locale # 当前环境变量中所有编码 hwclock # 查看时间 who # 当前在线用户 w # 当前在线用户 whoami # 查看当前用户名 logname # 查看初始登陆用户名 uptime # 查看服务器启动时间 sar -n DEV 1 10 # 查看网卡网速流量 dmesg # 显示开机信息 lsmod # 查看内核模块
}
终端提示显示{
echo $PS1 # 环境变量控制提示显示 PS1=’[\u@ \H \w \A @#]$’ PS1=’[\u@\h \W]$’ export PS1=’[ \e[32m \e[31m \u@ \e[36m \h \w \e[m ]$ ’ # 高亮显示终端
}
开机启动模式{
vi /etc/inittab id:3:initdefault: # 3为多用户命令 #ca::ctrlaltdel:/sbin/shutdown -t3 -r now # 注释此行 禁止 ctrl+alt+del 关闭计算机
}
硬件信息{
more /proc/cpuinfo # 查看cpu信息 lscpu # 查看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 # 查看全面硬件信息 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 # 查看硬件信息 lspci|grep RAID # 查看是否支持raid lspci -vvv |grep Ethernet # 查看网卡型号 lspci -vvv |grep Kernel|grep driver # 查看驱动模块 modinfo tg2 # 查看驱动版本(驱动模块) ethtool -i em1 # 查看网卡驱动版本 ethtool em1 # 查看网卡带宽
}
终端快捷键{
Ctrl+A # 行前 Ctrl+E # 行尾 Ctrl+S # 终端锁屏 Ctrl+Q # 解锁屏 Ctrl+D # 退出
}
定时任务{
at 5pm + 3 days /bin/ls # 单次定时任务 指定三天后下午5:00执行/bin/ls
crontab -e # 编辑周期任务 #分钟 小时 天 月 星期 命令或脚本 1,30 1-3/2 * * * 命令或脚本 >> 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 # 启动自动周期性服务
-
-
-
-
- echo “d” >>d$(date +%Y%m%d).log # 让定时任务直接生成带日期的log 需要转义%
-
-
-
}
date{
星期日[SUN] 星期一[MON] 星期二[TUE] 星期三[WED] 星期四[THU] 星期五[FRI] 星期六[SAT] 一月[JAN] 二月[FEB] 三月[MAR] 四月[APR] 五月[MAY] 六月[JUN] 七月[JUL] 八月[AUG] 九月[SEP] 十月[OCT] 十一月[NOV] 十二月[DEC]
date -s 20091112 # 设日期 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 ‘20110902’ # 日期格式转换 date +%Y-%m-%d_%X # 日期和时间 date +%N # 纳秒 date -d “2012-08-13 14:00:23” +%s # 换算成秒计算(1970年至今的秒数) date -d “@1363867952” +%Y-%m-%d-%T # 将时间戳换算成日期 date -d “1970-01-01 UTC 1363867952 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 # 临时设置用户最大进程数 ulimit -a # 查看
/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
sysctl -p # 修改配置文件后让系统生效
}
随机分配端口范围{
#本机连其它端口用的 echo “10000 65535” > /proc/sys/net/ipv4/ip_local_port_range
}
百万长链接设置{
#内存消耗需要较大 vim /root/.bash_profile #添加如下2行,退出bash重新登陆 #一个进程不能使用超过NR_OPEN文件描述符 echo 20000500 > /proc/sys/fs/nr_open #当前用户最大文件数 ulimit -n 10000000
}
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
}
sudo{
echo myPassword | sudo -S ls /tmp # 直接输入sudo的密码非交互,从标准输入读取密码而不是终端设备 visudo # sudo命令权限添加 /etc/sudoers 用户 别名(可用all)=NOPASSWD:命令1,命令2 user ALL=NOPASSWD:/bin/su # 免root密码切换root身份 wangming linuxfan=NOPASSWD:/sbin/apache start,/sbin/apache restart UserName ALL=(ALL) ALL UserName ALL=(ALL) NOPASSWD: ALL peterli ALL=(ALL) NOPASSWD:/sbin/service Defaults requiretty # sudo不允许后台运行,注释此行既允许 Defaults !visiblepw # sudo不允许远程,去掉!既允许
}
服务{
/etc/init.d/sendmail start # 启动服务 /etc/init.d/sendmail stop # 关闭服务 /etc/init.d/sendmail status # 查看服务当前状态 /date/mysql/bin/mysqld_safe --user=mysql & # 启动mysql后台运行 /bin/systemctl restart mysqld.service # centos7启动服务 vi /etc/rc.d/rc.local # 开机启动执行 可用于开机启动脚本 /etc/rc.d/rc3.d/S55sshd # 开机启动和关机关闭服务连接 # S开机start K关机stop 55级别 后跟服务名 ln -s -f /date/httpd/bin/apachectl /etc/rc.d/rc3.d/S15httpd # 将启动程序脚本连接到开机启动目录 ipvsadm -ln # lvs查看后端负载机并发 ipvsadm -C # lvs清除规则 xm list # 查看xen虚拟主机列表 virsh # 虚拟化(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 service on|off|set # 设置非独立服务启状态 chkconfig --level 35 httpd off # 让服务不自动启动 chkconfig --level 35 httpd on # 让服务自动启动 35指的是运行级别 chkconfig --list # 查看所有服务的启动状态 chkconfig --list |grep httpd # 查看某个服务的启动状态 chkconfig –-list [service] # 查看服务的状态
}
systemctl{
systemctl is-active *.service # 查看服务是否运行 systemctl is-enabled *.service # 查询服务是否开机启动 systemctl mask *.service # 注销指定服务 systemctl unmask cups.service # 取消注销cups服务 systemctl enable *.service # 开机运行服务 systemctl disable *.service # 取消开机运行 systemctl start *.service # 启动服务 systemctl stop *.service # 停止服务 systemctl restart *.service # 重启服务 systemctl reload *.service # 重新加载服务配置文件 systemctl status *.service # 查询服务运行状态 systemctl --failed # 显示启动失败的服务 systemctl poweroff # 系统关机 systemctl reboot # 重新启动 systemctl rescue # 强制进入救援模式 systemctl emergency # 强制进入紧急救援模式 systemctl list-dependencies # 查看当前运行级别target(mult-user)启动了哪些服务 systemctl list-unit-files # 查看开机启动的状态 journalctl -r -u elasticsearch.service # 查看日志 r倒序 u服务名 /etc/systemd/system/falcon-agent.service [Unit] Description=This is zuiyou monitor agent After=network.target remote-fs.target nss-lookup.target
[Service] User= root Type=simple PIDFile=/opt/falcon-agent/var/app.pid ExecStartPre=/usr/bin/rm -f /opt/falcon-agent/var/app.pid ExecStart=/opt/falcon-agent/control start ExecReload=/bin/kill -s HUP $MAINPID KillMode=process KillSignal=SIGQUIT TimeoutStopSec=5 PrivateTmp=true Restart=always LimitNOFILE=infinity
[Install] WantedBy=multi-user.target
systemctl daemon-reload # 加载配置
}
}
nginx{
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 #–with # 默认不加载 需指定编译此参数才使用 #–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 –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服务
}
elasticsearch{
vim /etc/sysctl.conf vm.max_map_count = 262144
vim /etc/security/limits.conf
- soft memlock unlimited
- hard memlock unlimited sysctl -p
curl ‘localhost:9200/_cat/health?v’ # 健康检查 curl ‘localhost:9200/_cat/nodes?v’ # 获取集群的节点列表 curl ‘localhost:9200/_cat/indices?v’ # 列出所有索引 curl 127.0.0.1:9200/indexname -XDELETE # 删除索引 curl -XGET http://localhost:9200/_cat/shards # 查看分片 curl ‘127.0.0.1:9200/_cat/indices’ # 查分片同步 unassigned_shards # 没同步完成
}
mysql常用命令{
#mysql 可视化工具 MySQL Workbench
mysqlcheck -uroot -p -S mysql.sock --optimize --databases account # 检查、修复、优化MyISAM表 mysqlbinlog slave-relay-bin.000001 # 查看二进制日志 mysqladmin -h myhost -u root -p create dbname # 创建数据库
flush privileges; # 刷新 show databases; # 显示所有数据库 use dbname; # 打开数据库 show tables; # 显示选中数据库中所有的表 desc tables; # 查看表结构 drop database name; # 删除数据库 drop table name; # 删除表 create database name; # 创建数据库 select column from table; # 查询 show processlist; # 查看mysql进程 show full processlist; # 显示进程全的语句 select user(); # 查看所有用户 show slave status\G; # 查看主从状态 show variables; # 查看所有参数变量 show status; # 运行状态 show table status # 查看表的引擎状态 show grants for user@’%’ # 查看用户权限 drop table if exists user # 表存在就删除 create table if not exists user # 表不存在就创建 select host,user,password from user; # 查询用户权限 先use mysql create table ka(ka_id varchar(6),qianshu int); # 创建表 show variables like ‘character_set_%’; # 查看系统的字符集和排序方式的设定 show variables like ‘%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 dbname where Name=‘tablename’; # 查询表引擎 mysql -uroot -p -A -ss -h10.10.10.5 -e “show databases;” # shell中获取数据不带表格 -ss参数 CREATE TABLE innodb (id int, title char(20)) ENGINE = INNODB # 创建表指定存储引擎的类型(MyISAM或INNODB) grant replication slave on . to ‘user’@’%’ identified by ‘pwd’; # 创建主从复制用户 ALTER TABLE player ADD INDEX weekcredit_faction_index (weekcredit, faction); # 添加索引 alter table name add column accountid(column) int(11) NOT NULL(column); # 插入字段 update host set monitor_state=‘Y’,hostname=‘xuesong’ where ip=‘192.168.1.1’; # 更新数据 select * from information_schema.processlist where command!=‘sleep’; # 查看当前进程 select * from atable where name=‘on’ AND t<15 AND host LIKE ‘10%’ limit 1,10; # 多条件查询 show create database ops_deploy; # 查看数据库编码 show create table updatelog; # 查看数据库表编码 alter database ops_deploy CHARACTER SET utf8; # 修改数据库编码 alter table updatelog
default character set utf8; # 修改表编码 alter table updatelog
convert to character set utf8; # 修改一张表的所有字段的编码格式
自增表{
create table xuesong (id INTEGER PRIMARY KEY AUTO_INCREMENT, name CHAR(30) NOT NULL, age integer , sex CHAR(15) ); # 创建自增表 insert into xuesong(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 u s e r n a m e − p username -p username−ppasswd -h d b h o s t − P dbhost -P dbhost−Pdbport -A -e " use d b n a m e ; d e l e t e f r o m d a t a w h e r e d a t e = ( ′ dbname; delete from data where date=(' dbname;deletefromdatawheredate=(′date1’); " # 执行多条mysql命令 mysql -uroot -p -S mysql.sock -e “use db;alter table gift add column accountid int(11) NOT NULL;flush privileges;” 2>&1 |grep -v Warning # 不登陆mysql插入字段
}
mysql字符集相关{
show variables like ‘%character%’; # 查看数据库中设置字符集的参数 #character_set_client、character_set_connection 以及 character_set_results 这几个参数都是客户端的设置 #character_set_system、character_set_server 以及 character_set_database 是指服务器端的设置。 #而对于这三个服务器端的参数来说的优先级是: #列级字符集 > 表级字符集 > character_set_database > character_set_server > character_set_system
show global variables like ‘%char%’; #查看RDS实例字符集相关参数设置 show global variables like ‘coll%’; #查看当前会话字符序相关参数设置 show character set; #查看实例支持的字符集 show collation; #查看实例支持的字符序 show create table table_name \G #查看表字符集设置 show create database database_name \G #查看数据库字符集设置 show create procedure procedure_name \G #查看存储过程字符集设置 show procedure status \G #查看存储过程字符集设置 alter database db_name default charset utf8; #修改数据库的字符集 create database db_name character set utf8; #创建数据库时指定字符集 alter table tab_name default charset utf8 collate utf8_general_ci; #修改表字符集和字符序
#下面三条sql 分别将库 dbsdq , 表 tt2 , 表 tt2 中的 c2 列修改为utf8mb4 字符集 alter database dbsdq character set utf8mb4 collate utf8mb4_unicode_ci; use dbsdq; alter table tt2 character set utf8mb4 collate utf8mb4_unicode_ci; alter table tt2 modify c2 varchar(10) character set utf8mb4; #修改列时,当前列中的所有行都会立即转化为新的字符集; #alter table 会对表加元数据锁
}
备份数据库{
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 # 备份数据库结构
#最小权限备份 grant select on db_name.* to dbbackup@“localhost” Identified by “passwd”; #–single-transaction InnoDB有时间戳 只备份开始那一刻的数据,备份过程中的数据不会备份 mysqldump -hlocalhost -P 3306 -u dbbackup --single-transaction -p"passwd" --database dbname >dbname.sql
#xtrabackup备份需单独安装软件 优点: 速度快,压力小,可直接恢复主从复制 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
}
还原数据库{
mysql -h host -u root -p dbname < dbname_backup.sql source 路径.sql # 登陆mysql后还原sql文件
}
赋权限{
指定IP: $IP 本机: localhost 所有IP地址: % # 通常指定多条
grant all on zabbix.* to user@“KaTeX parse error: Expected 'EOF', got '#' at position 6: IP"; #̲ 对现有账号赋予权限 gran…IP” identified by ‘passwd’; # 赋予指定IP指定用户所有权限(不允许对当前库给其他用户赋权限) grant all privileges on database.* to user@“localhost” identified by ‘passwd’ with grant option; # 赋予本机指定用户所有权限(允许对当前库给其他用户赋权限) grant select, insert, update, delete on database.* to user@'ip’identified by “passwd”; # 开放管理操作指令 revoke all on . from user@localhost; # 回收权限 GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON storemisc_dev
.* TO ‘user’@‘192.168.%’
}
更改密码{
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 & use mysql; update user set password=password(‘123123’) where user=‘root’;
}
mysql主从复制失败恢复{
slave stop; reset slave; 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; slave start;
}
sql语句使用变量{
use xuesong; set @a=concat(‘my’,weekday(curdate())); # 组合时间变量 set @sql := concat(‘CREATE TABLE IF NOT EXISTS ‘,@a,’( id INT(11) NOT NULL )’); # 组合sql语句 select @sql; # 查看语句 prepare create_tb from @sql; # 准备 execute create_tb; # 执行
}
检测mysql主从复制延迟{
1、在从库定时执行更新主库中的