============================================================================================================================php
09年,鸟人第四年linux环境,用ssh终端连上server,两眼一黑(啥命令也不会).....html
每次把成老师在我电脑上操做的命令用history找到记录下来,避免反复问他一样的问题...node
后来把工做中用到的新命令、从《shell编程..》学到的使用方法也记录下来...python
因而,一个暂时的txt文件变成了现在这个样子(平常命令差点儿都可以搜到)....mysql
============================================================================================================================但假设#位于第一行开头,并且是#!(称为Shebang)则例外,它表示该脚本使用后面指定的解释器/bin/sh解释运行。
shell凝视-->
A、方法一
:<<BLOCK'
....凝视内容
'BLOCK
B、方法二
:<<'BLOCK
....凝视内容
BLOCK'
C、方法三
:<<'
....凝视内容
'
以上三种方法都是经过在:<
BLOCK为Here Documents中的定义符号可以任意起名,仅仅要先后匹配便可了
更帅的方法:
cat <<"EOF" > /dev/null
this
is
a
multi-
line
comment
EOF
或者:
: cat <<"EOF"
this
is
a
multi-
line
comment
EOF
<--shell凝视
eval的做用是再次运行命令行处理,也就是说,对一个命令行,运行两次命令行处理。
eval echo "\$$#" 输出最后一个參数。不用eval的话仅仅能输出$number,还不是$number中存储的数据
<getopts在 linux与unix shell编程指南 20.pdf>
getopts通常格式为:
getopts option_string OPTION 将所有以连字符开头的參数做为变量与option_string对照,假设匹配成功。变量设置成OPTION的值,假设未发现匹配字符,把?设置成其值
getopts ahfvc: OPTION 选项a、h、f、v可以不加实际值进行传递,而选项c必须取
sort -u -n xx.log |wc -l
du -sh * | sort -h #sort -h --human-numeric-sort
compare human readable numbers (e.g., 2K 1G)
ls /home/mysql/bigman/wom_weibo_sina* | xargs du -cb 统计指定文件的总大小
vi 中加入和去除行号
显示行号 :set number 或 :set nu
去除行号 :set nonumber 或 :set nonu
vi中水平分页编辑 :vsplit another_file
vi中竖直分页编辑 :sp another_file
上述两种,用ctrl+w+w进行切换
linux
vi中用标签页编辑 :android
:tabe[dit] another_file
ios
向后切换 {num}gt => gt3gt 4gt 5gt (带数字的是以第一个标签页为基准,而不是当前标签页为基准)
c++
:tabn[ext] {num} =>:tabnext 2;:tabnext
git
向前切换 {num}gT => gT 3gT4gT 5gT (带数据的是以当前标签页为基准,不是以第一个标签页为基准)
:tabN[ext] {num} =>:tabNext 2;:tabNext
切到第一个标签页 :tabfir[st]
切到最后一个标签页 :tabl[ast]
把当前标签页移到第N个标签页以后 :tabm[ove] [N]
对所有标签页运行命令 :tabd[o] {cmd}
关闭标签页 :tabc[lose] {num}
关闭其它所有标签页 :tabonly
关闭所有标签页:qa
把复制(yank)的文本粘贴到文件里用p便可了(要粘贴到上一行用P),那么假设要粘贴到:命令行里面呢--> ctrl+r "
一次性打开多个文件用标签页编辑 vi -p one_file anther_file third_file
有时候文件过多,一次无法全部打开(vim -p 默认一次最多打开9或10个),可以用set tabpagemax=30改动默认的最大tab页限制。或者:
:tab ball show each buffer in a tab (up to 'tabpagemax' tabs):tab help open a new help window in its own tab page
想要grep在代码文件夹中查找目标片断,并编辑所有命中的文件? grep -rn 'Utils' . | awk -F: '{print $1}' |sort -u | tr '\n' ' ' 对于结果,运行vim -p就能够
vim查看一个正在被其它进程改动的文件时需要reload文件,:e
ctrl+a 跳到mysql命令行开头
ctrl+u 从光标位置删到行首
ctrl+k 从光标位置删到行末
折叠(http://vim.wikia.com/wiki/Folding)
:set fdm=indent 依照相同的缩进折叠,极适合Lua。所有function都折起来了(foldmethod
。默认foldmethod=manual
,即用zf手动折叠;其它方式是syntax
、expr(
本身定义折叠规则))
zR一次性打开所有折叠
在Visual模式创建选中代码块的折叠 zf
创建折叠(对光标所在的大括号的代码块创建折叠) zfa{
zf + 数字 + 方向键,折叠
展开折叠 zo
zO 对所在范围内所有嵌套的折叠点展开
关闭折叠 zc
zC 对所在范围内所有嵌套的折叠点进行折叠
删除光标处折叠 zdr
x 删除当前光标下的字符
dw 删除光标以后的单词剩余部分(跟按w向前依照单词移动同样)
db 删除光标以前的单词剩余部分(跟按b向后依照单词移动同样)
d$ 删除光标以后的该行剩余部分(跟按¥移到行末同样)
d0 删除光标以前的该行剩余部分(跟按0移到行首同样)
dd 删除当前行。
v加方向键选中内容后,可用d将选中部分删除
d + num + 方向键 向上或向下(箭头或者jk都行哦)删除num行(num去除自身之外的行数)
y 复制也有上述用法
vim设置字体颜色
[root@localhost server]# ls /usr/share/vim/vim72/colors/
blue.vim default.vim desert.vim evening.vim morning.vim pablo.vim README.txt shine.vim torte.vim
darkblue.vim delek.vim elflord.vim koehler.vim murphy.vim peachpuff.vim ron.vim slate.vim zellner.vim
[root@localhost server]# cat ~/.vimrc
:colorscheme desert
在vim已打开的状态下。用:colorscheme desert也可切换到相应的颜色方案!
对于公用的机器和用户,不想忍受别人的颜色方案可以在当前链接上创建一个别名,这样就可以本身用本身喜欢的样式了
alias vim='vim --cmd ":colorscheme desert"'
alias vim='vim --cmd ":colorscheme desert" --cmd ":set number"'
vim --cmd ":colorscheme desert" --cmd ":set number" --cmd ":set tabstop=4 shiftwidth=4 expandtab"
把vim tab的长度设成4个空格:在.vimrc中增长set tabstop=4
vim中的tab本身主动用四个空格替换:set tabstop=4 shiftwidth=4 expandtab
不要用空格替换tab的命令 :set noexpandtab
$跳至行末(等同于end键)
%跳至相应的符号还有一端。比方从{到},从(到)
这种话脚本里面的echo "abc\ndef"对'\n'的处理是同样的(确定还有其它的差异,仅仅是我栽在这个\n上面了)
cat file1 file2
cat file1 file2 > /tmp/allfile
cat > /tmp/newfile (ctrl+D结束新文件输入)
cat -v file 显示控制字符(检查ftp从DOS传过来的文件)
dos2unix file 把dos下的那些控制符转换成linux格式
paste file1 file2 把两个文件的各行连在一块儿做为新行打印出来
split -1 file1.txt 文件切割,依照一行一个文件切割
611 rpm -ql httpd
[dongsong@tm4ctt143 ~]$ who
dongsong pts/0 2011-02-18 10:08 (10.4.6.120)
awk 在 <linux与unix shell编程指南 009.pdf>
awk 有很是多字符串处理函数、数字处理函数、时间函数等,功能强大,用man可以看到。length(), substr(),tolower(),toupper()...
[dongsong@tm4ctt143 ~]$ who | awk '{print $1"\t"$3"\t"$2}' awk可以控制输出那个字段(域标记从$1開始,假设用$0则表示所有域,$NF表示最后一个域$(NF-1)表示倒数第二个域)
dongsong 2011-02-18 pts/0
cat /etc/passwd | awk -F: '{print $1}' awk -F 是以字符切割
awk '{print $2}' data..f
awk '{if($1=="265919437") print $1}' active_22_122999_20110209.log
awk '{if($1~/265919437/) print $1}' active_22_122999_20110209.log
awk '{if($1!~/265919437/) print $1}' active_22_122999_20110209.log
cat /tmp/debug_ips.log |sort |awk '{if($1==line){count++;} else{if(count>0) print count;count=1;} line=$1;} END {print count;}'|awk '{if($1>1) print $1}'|wc -l
[dongsong@tm4ctt143 shell_study]$ echo adsfafds|awk '{print substr($0, 1)}'
adsfafds
[dongsong@tm4ctt143 shell_study]$ echo adsfafds|awk '{print substr($0, 1, 2)}'
ad
cat /tmp/t | awk '{t=t"info[\""$2"\"],"} END {print t;}'
[dongsong@localhost kl-robot]$ echo 'entryId,pos,count,remainTime,isBinding,type' | tr ',' '\n' | awk '{t=t"info[\""$0"\"],"} END {print t;}'
info["entryId"],info["pos"],info["count"],info["remainTime"],info["isBinding"],info["type"],
两种计算字符串长度的方法,注意差异,awk取得的是准确值
[dongsong@tm4ctt143 shell_study]$ echo "sfff"|wc -c[dongsong@tm4ctt143 ~]$ who | tee who.out tee,谐音T,输出到screen的同一时候输出一个副本到文件里去
tee -a #append
[dongsong@tm4ctt143 ~]$ read var1 << hello
> look
> hello
[dongsong@tm4ctt143 ~]$ echo $var1
look
777 netstat -a
ls -l | grep ^d 仅仅显示文件夹文件
972 histpry |less
973 touch hello.php
<下面可以在 linux与unix shell编程指南 002.pdf 中找到>
touch -t 05042140 test.txt 建立一个更改时间是5月4号21:90的文件
find . -newer test.txt 寻找比test.txt更新的文件
find . -newer !test.txt 与上面相反
find . -type d 查找当前文件夹下的文件夹
find . ! -type d | sort 查找当前文件夹下除文件夹之外的文件,后面管道加上sort是排序
find . -type f -mtime -10 -print -mount -exec wc -l {} \;
find . -type f -mtime -10 -print -mount |xargs wc -l 与上面等同。仅仅是xargs一批一批的运行,exec把前面所有的当成參数一次运行()
find . -name "*.cpp" | xargs grep "int" 在文件里查找int
ls *.sql | grep -v 2011-11-17 | xargs rm 删除名字不含2011-11-17字样的sql文件
ifconfig
netstat -lntp
tcpdump -i lo port 389 -s 1000000 -A
tcpdump -i lo -s 10000 -A -w /home/team/ddd port 389 抓包
tcpdump -i eth0 -s 10000 -A -nnn host 10.0.4.133 and port 80
tcpdump -i eth0 -nnn port 1234
-nnn是显示数字,便于直接观看结果
find . -name "*server.conf" | xargs -I {} cp {} /tmp/ 对符合条件的文件作copy,-I是作替换,把管道输出东西替换到后面位置上(man xargs)。
也可以尝试如下的方式
find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +
今天(2014.7.17)遇到一个问题是系统有tcpdump但是用yum list看发现不是yum源里面的。而系统自带的这个仅仅能打印很简陋的信息,从yum装一个就正常了
/usr/sbin/tcpdump -i eth0 -s 1000 -nnn host 10.6.10.140 and port 5630 > /tmp/tcpdump.log 2>&1 &
svn log -v | head -n 10
svn diff -r 4016:4017 connectserver.conf
chmod a+x xx/*
sar -n DEV 2 5 网卡流量实时监控,2s一次。总共打印五次
sar -n DEV 显示当天的网卡流量数据(这些还未写盘到/var/log/sa/sar[day]。仅仅能这样看)
关于sysstat
sysstat = sar + iostat + mpstat + pidstat + sadf (http://www.blackmoreops.com/2014/06/18/sysstat-sar-examples-usage/)
man sar 可以看到日志中各项指标和衡量单位的含义
设置打日志的间隔: vim /etc/cron.d/sysstat
设置日志保留的时间: vim /etc/sysconf/sysstat HISTORY
从新启动sysstat: service sysstat restart 或者 /etc/init.d/sysstat restart
for i in `find ./ -name "*.[ch]" -exec wc -l {} \;|cut -d ' ' -f1;`; do sum=$(($sum+$i));done 统计文件夹下.c .h文件行数(代码行数)
或者 find ./ |egrep "*.[ch]$|*.cpp$|*.hpp$" |xargs wc -l
ssh-keygen
产生公开钥 (pulib key) 和私人钥 (private key),以保障 ssh 联机的安性, 当 ssh 连 shd server。会交换公开钥上,系统会检查 /etc/ssh_know_hosts 内储存的 key,假设找到client就用这个 key 产生一个随机产生的session key 传给server。两端都用这个 key 来继续完毕 ssh 剩下来的阶段。
它会产生 identity.pub、identity 两个档案,私人钥存放于identity。公开钥 存放于 identity.pub 中,接下来使用 scp 将 identity.pub copy 到远程机器的家文件夹下.ssh下的authorized_keys。 .ssh/authorized_keys(这个 authorized_keys 档案至关于协议的 rhosts 档案)。以后使用者能够不用password去登入。RSA的认证绝对是比 rhosts 认证更来的安全可靠。想让多台机器都不输password直接往A上拷数据,能够把这几台机器的identity.pub追加到A得authorized_keys文件后面。
运行:
scp identity.pub k@linux1.ee.oit.edu.tw:.ssh/authorized_keys
若在使用 ssh-keygen 产生钥匙对时没有输入password,则如上所看到的不需输入password就能够从 net67.ee.oit.edu.tw 去登入 linux1.ee.oit.edu.tw。在此,这里输入的password可以跟账号的password不一样,也可以不输入password。
-----------scp end----------------
ssh -p 7710 root@220.181.83.115 -v ssh登陆
nohup ********* & 转后台执行
date +%s 在bash上输出unixtime
date --date "1 days ago" 获取一天前的时间
date +%G-%m-%d 输出2011-11-17
date +R 查看server时区设置
show global variables like '%time_zone%' 查看mysql时区设置
select current_timestamp; 查看mysql当前的时间戳
编码问题:
iconv -f GB2312 -t UTF-8 NationLogInterface.h > NationLonInterface.h_utf-8 bash上对文件进行编码转换
在Vim中可以直接查看文件编码 :set fileencoding 就能够显示文件编码格式
autoreconf -fi
./configure --prefix=/home/myciv/civ-server/trunk/run
linux编译问题,因为系统时间致使编译不正常:find .|xargs touch
加入sudo权限 vi /etc/sudoers
设置sudo不输入password:sudo visudo 或者 sudo vi /etc/sudoers, 按例如如下改动
%admin ALL=(ALL)NOPASSWD:NOPASSWD ALL //admin组的用户sudo所有命令都不用输入password
%guy ALL=NOPASSWD:ALL //用户guy sudo 所有命令都不用输入password
%guy ALL=NOPASSWD:/usr/bin/tt.sh,/usr/sbin/adduser //用户guy sudo指令命令不用输入password
fg、bg、jobs、&、ctrl + z都是跟系统任务有关的,尽管现在基本上不怎么需要用到这些命令,但学会了也是很是有用的
一。& 最经常被用到
这个用在一个命令的最后。可以把这个命令放到后台运行
二。ctrl + z
可以将一个正在前台运行的命令放到后台。并且暂停
三。jobs
查看当前有多少在后台执行的命令
四。fg
将后台中的命令调至前台继续执行
假设后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是经过jobs命令查到的后台正在运行的命令的序号(不是pid)
五。bg
将一个在后台暂停的命令,变成继续运行
假设后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是经过jobs命令查到的后台正在运行的命令的序号(不是pid)
gdb调试core文件:
gdb -core core.*** XXX(可运行文件)
gdb>> bt
gdb>> f XX(第几个栈)
gdb>> list filename:lineNumber
gdb>> info threads 列出线程
gdb>> thread n 跳转到线程
源码之间创建跳转连接
ctags -R
cscope -b -R *.cpp *.hpp
ctags创建以后可以用ctrl+] 和ctrl+t进行正反向跳转,在bash如下之间用vi -t name可以打开函数或者变量定义的文件(功能真风骚,貌似我仅仅用了ctags的1%)
vim xxx.c以前要把当前路径切换到ctags所在文件夹去,不然找不到符号
ctags的使用方法:http://oreilly.com/catalog/vi6/chapter/ch08.html#ch08_05.htm
ctags的官网:http://ctags.sourceforge.net/
对lua创建ctag: ctags --langdef=MYLUA --langmap=MYLUA:.lua --regex-MYLUA="/^.*\s*function\s*(\w+):(\w+).*$/\2/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*[0-9]+.*$/\1/e/" --regex-MYLUA="/^.*\s*function\s*(\w+)\.(\w+).*$/\2/f/" --regex-MYLUA="/^.*\s*function\s*(\w+)\s*\(.*$/\1/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*\{.*$/\1/e/" --regex-MYLUA="/^\s*module\s+\"(\w+)\".*$/\1/m,module/" --regex-MYLUA="/^\s*module\s+\"[a-zA-Z0-9._]+\.(\w+)\".*$/\1/m,module/" --languages=MYLUA --excmd=pattern --extra=f
-R .
要对文件名称也建tag的话需要添加參数 --extra=f
这招不错
find -name '*.[ch]' -exec ctags {} +
find lualib-src/ service-src/ skynet-src/ -name '*.[ch]' -exec ctags {} +
如下这个不行,尽管ls -R 会把文件夹如下的子文件夹全部递归遍历一遍。不过ctags并不不过对过滤出来的文件建了tag而是对全部的(ctasg -R)
ls -lhrtR ./* | egrep "*\.h$|*\.cpp$" | ctags -R
应该这样用:
find lualib-src/ service-src/ skynet-src/ connectserver/ -name "*.*" | egrep '*.c$|*.h$|*.cpp$' | xargs ctags
ctrl+o 回到光标上次所在的位置
ctrl+i 前进到光标回跳前的位置
ctrl+e 保持光标不动把页面向上移动
ctrl+y 保持光标不动把页面向下移动
ctrl+f 向下滚一屏
ctrl+b向上滚一屏
ctrl+d向下滚半屏
ctrl+u向上滚半屏
怎样让ctags支持php的语法跳转:
下面命令可放到~/.bash_profile中
alias phptags='ctags --langmap=php:.engine.inc.module.theme.php --php-kinds=cdf --languages=php --extra=f'
下面设置放到 ~/.ctags文件里
$ cat ~/.ctags
--regex-php=/^[ \t]*[(private|public|static)( \t)]*function[ \t]+([A-Za-z0-9_]+)[ \t]*\(/\1/f, function, functions/
--regex-php=/^[ \t]*[(private|public|static)]+[ \t]+\$([A-Za-z0-9_]+)[ \t]*/\1/p, property, properties/
--regex-php=/^[ \t]*(const)[ \t]+([A-Za-z0-9_]+)[ \t]*/\2/d, const, constants/
使用时。在代码文件夹中:
$ phptags -R
就可以生成比較可用的tags文件了。
对于有多个tag文件。可以指定要使用的tag(也可以结合alias来用,或者直接放入.vimrc中,或者直接不带目标文件的启动vim而后用:命令来设置和跳转) :set tags=$SRC/tags
vim --cmd ":set tag=.../tags"
:set tags 显示当前载入的tag文件:tags 显示当前tag stack(tag跳转历史),不少其它命令可以用:help tag-commands来查看
:tag xxx 跳到xxx这个tag的位置去
:tag /^xxx 跳到以xxx打头的tag位置
:ts /^xxx 列出以xxx打头的tag
:tag /xxx 跳到包括xxx的tag位置
:ts /xxx 列出包括xxx的tag
:ts xxx
:ts[elect][!] [ident] 列出所有跟目标相符的tag
:ta[g] 功能跟ctrl+]相似
:po[p] 功能跟ctrl+t相似
对Python文件建ctags跳转标记
http://www.held.org.il/blog/2011/02/configuring-ctags-for-python-and-vim/
[root@test-22 kl-robot]# cat ~/.ctags --python-kinds=-i root@test-22 kl-robot]# ctags --list-kinds=python ctags: Warning: Unsupported parameter 'i' for --python-kinds option c classes f functions m class members [root@test-22 kl-robot]# ctags -R --extra=f . ctags: Warning: Unsupported parameter 'i' for --python-kinds option [root@test-22 kl-robot]# ls -lhrt tags -rw-r--r-- 1 root root 162K 06-11 16:05 tags
----------------------查看系统配置-----------------------
系统# netstat -antp # 查看所有已经创建的链接
netstat -A inet -n -p #-A协议(inet:raw tcp udp) -n显示数字port -p显示程序名
# netstat -s # 查看网络统计信息
netstat -a | grep 5630 查看跟5630port相关的所有链接(已创建的链接以及正在监听的port信息)
ps axo "lstart,etime,stat,vsize,rss,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm,cmd" | egrep "server|cross"
start_time 程序启动日期
lstart 启动的准确时间
etime 已执行时长
pgrep "lz2_mapserver|lz2_baseserver" | xargs kill -USR2 #比ps axo + 过滤更精准一点 不会被进程的命令行參数干扰。
是相似于killall的命令。
因为调用./a.sh来运行shell是在一个子shell里运行的。因此运行后。结构并无反应到父shell里。但是 source不一样它就是在本shell中运行的。因此可以看到结果
------------------end of source命令-------------------------
使用man时可以指定不一样的section来浏览,各个section意义例如如下:
1 - commands
2 - system calls
3 - library calls
4 - special files
5 - file formats and convertions
6 - games for linux
7 - macro packages and conventions
8 - system management commands
(man 1是shell命令,man 2是系统调用。man 3是库函数)
windows绑定host的文件:C:\WINDOWS\system32\drivers\etc
linux绑定houst的文件:/etc/hosts
---------------------------------------suid/guis-------------------------------------------------------------start---------------
suid意味着假设A用户对属于他本身的shell脚本文件设置了这样的权限。那么其它用户在运行这个脚本的时候就拥有了A用户的权限。因此。假设 root用户对某一脚本设置了这一权限的话则其它用户运行该脚本的时候则拥有了root用户权限。
同理。guid意味着运行对应脚本的用户则拥有了该文件所属用户组中用户的权限。
为何使用suid/guid?
举个样例:要对数据库系统进行备份需要有系统管理权限,那么我可以写几个脚本,并设置了它们的guid,这样我指定的一些用户仅仅要运行这些脚本就可以完毕对应的工做,而无须以数据库管理员的身份登陆,以避免不当心破坏了数据库server。经过运行这些脚本,他们可以完毕数据库备份及其它管理任务。但是在这些脚本运行结束以后,他们就又回复到他们做为普通用户的权限。
有至关一些命令也设置了suid和guid。
假设想找出这些命令,可以进入/bin或/sb in文件夹,运行如下的命令:
$ ls -l | grep '^...s'
上面的命令是用来查找suid文件的;
$ ls -l | grep '^...s..s'
上面的命令是用来查找suid和guid的。
怎样设置suid/guid?
假设但愿设置suid。那么就将对应的权限位以前的那一位设置为4。假设但愿设置guid,那么就将对应的权限位以前的那一位设置为2;假设但愿二者都置位。那么将对应的权限位以前的那一位设置为4+2。
一旦设置了这一位,一个s将出现在x的位置上。记住:在设置suid或guid的同一时候。对应的运行权限位必须要被设置。好比。假设但愿设置guid,那么必须要让该用户组具备运行权限。
假设想要对文件login设置suid,它当前所具备的权限为rwx rw- r-- (741),需要在使用chmod命令时在该权限数字的前面加上一个4。即chmod 4741。这将使该文件的权限变为rws rw- r--。
$ chmod 4741 login
还可以使用符号方式来设置suid/guid。假设某个文件具备这种权限: rwx r-x r-x。那么可以这样设置其suid/guid:
chmod u+s <filename>
chmod u+g <filename>
---------------------------------------suid/guis-------------------------------------------------------------end---------------
---------------------------------------mysql------------------------------------------------------------------start------------------
select * from t_battle_mails where iStartX = 245 AND iStartY = 102 into outfile "/tmp/battlemail.txt";
load data infile "/home/myciv/login_logs/login_22_122999_20110112.log" into table t_test1 fields terminated by "\t";
select count(sActivityCode) from t_user_info where activate = 1 and sActivityCode != '' and first_time > "2011-01-12 00:00:00" and first_time < "2011-01-12 23:59:59";
SELECT UNIX_TIMESTAMP("20110114000000");
SELECT UNIX_TIMESTAMP("2011-01-14 00:00:00");
SELECT FROM_UNIXTIME(12312689349);
datetime字段设置当前值为默认值的问题(參考http://wotf23771.iteye.com/blog/721013):
MySQL的datetime设置当前时间为默认值,由于MySQL眼下字段的默认值不支持函数,因此用create_time datetime default now()的形式设置默认值是不可能的。
取代的方案是使用TIMESTAMP类型取代DATETIME类型。
CURRENT_TIMESTAMP :当我更新这条记录的时候,这条记录的这个字段不会改变。
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP :当我更新这条记录的时候,这条记录的这个字段将会改变。即时间变为了更新时候的时间。(注意一个UPDATE设置一个列为它已经有的值。这将不引发TIMESTAMP列被更新。因为假设你设置一个列为它当前的值,MySQL为了效率而忽略更改。
)假设有多个TIMESTAMP列,仅仅有第一个本身主动更新。
同一个表中上述两种类型字段不能出现随意两个!
mysql> select count(*) from t_raw_img where time < NOW();
+----------+
| count(*) |
+----------+
| 2452 |
+----------+
1 row in set (0.02 sec)
mysql> select NOW();
+---------------------+
| NOW() |
+---------------------+
| 2012-05-02 10:35:57 |
+---------------------+
1 row in set (0.00 sec)
mysql> select count(*) from t_raw_img where time > "2012-04-27 00:00:00";
+----------+
| count(*) |
+----------+
| 2452 |
+----------+
1 row in set (0.03 sec)
mysqldump备份:mysqldump -uusername -ppassword -h主机 数据库 数据表 -w "sql条件" --lock-all-tables > 路径
mysqldump -h 127.0.0.1 -uroot -proot123 civ_hujiajie t_battle_mails -w "1" --lock-all-tables > /tmp/testdump.txt;
mysqldump还原:mysql -uusername -ppassword -h主机 数据库 < 路径
source 文件;
导出
-t 导数据不导结构
-d 导结构不导数据
--replace 用replace into替代insert into
--where="id>100 order by id limit 0,10"
-r, --result-file=nameDirect output to a given file. This option should be used on Windows to prevent newline"\n" characters from being converted to"\r\n" carriage return/newline sequences. The result file is created and its previous contents overwritten, even if an error occurs while generating the dump.
-c or - complete_insert
这个选项使得结果sql中携带列信息。不加该选项是 replace/insert into table t values(...),加了之后是replace/insert into table t(c1,c2,...) values (...)
--compact Give less verbose output (useful for debugging). Disables
structure comments and header/footer constructs. Enables
options --skip-add-drop-table --skip-add-locks
--skip-comments --skip-disable-keys --skip-set-charset. 很是多时候咱们仅仅想要inser/replace语句。其它都不要,那么这个參数可以把很是多多余信息干掉
1.导出整个数据库
mysqldump -u username -p 数据库名 > 导出的文件名称
mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql
2.导出一个表
mysqldump -u username -p 数据库名 表名> 导出的文件名称
mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
3.导出一个数据库结构
mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc >d:wcnc_db.sql
-d 没有数据 --add-drop-table 在每个create语句以前添加一个drop table
4. 导出txt文件
环境变量 path
cmd
mysql -uroot -proot 数据库 表名 > save path
mysql -uroot -proot db 表名>e:/a.txt
导入数据库 sql ,txt
1. 导入sql格式
source 命令
进入mysql数据库控制台,
如mysql -u root -p
mysql>use 数据库
而后使用source命令,后面參数为脚本文件(如这里用到的.sql)
mysql>source d:wcnc_db.sql
2. txt格式
mysql -uroot -proot db< .txt
把查询结果直接导入还有一个表中
insert into tb2 (单据编号, 物品编号, 物品名称, 物品数量) select '10001',物品编号 ,物品名称, 物品数量 from tb1
---------------------------------------mysql------------------------------------------------------------------end------------------
<linux与unix shell编程指南 007.pdf> 元字符(正則表達式)
^ 仅仅匹配行首
$ 仅仅匹配行尾
* 一个单字符后紧跟*,匹配0个或多个此单字符
[] 仅仅匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用-表示[]内字符序列范围。如用[1-5]取代[12345],[^1-5]匹配1-5之外的字符
\ 仅仅用来屏蔽一个元字符的特殊含义。因为有时在s h e l l中一些元字符有
特殊含义。\可以使其失去应有意义
. 仅仅匹配随意单字符
pattern\{n\} 用来匹配前面pattern出现次数。n为次数
pattern\{n,\} 含义同上,但次数最少为n
pattern\{n,m\} 含义同上。但pattern出现次数在n与m之间
<linux与unix shell编程指南 012.pdf> tr命令的使用
tr特定控制字符的不一样表达方式
速记符 含义 八进制方式
\a Ctrl-G 铃声 \007
\b Ctrl-H 退格符 \010
\f Ctrl-L 走行换页 \014
\n Ctrl-J 新行 \012
\r Ctrl-M 回车 \015
\t Ctrl-I tab键 \011
\v Ctrl-X \030
tr -s "[a-z]" < oops.txt > results.txt 去除连续反复的字符,比方“ddsssssssssss”=》“ds”
tr -s "[a-z]" < oops.txt 和上面的命令意义等同,仅仅是输出到准备输出了
tr -s "[\n]" < oops.txt 去除换行
tr -s "[\012]" < oops.txt 和上面的命令等同
[dongsong@tm4ctt143 ~]$ echo "May Day, May Day, Going Down.." | tr "[a-z]" "[A-Z]" 小写转大写
MAY DAY, MAY DAY, GOING DOWN..
tr "[A-Z]" "[a-z]" < oops.txt 大小到小写
使用trap命令
trap命令用于捕获指定的信号并运行提早定义的命令。
其主要的语法是:
trap 'command' signal
当中signal是要捕获的信号,command是捕获到指定的信号以后,所要运行的命令。
可以用kill –l命令看到系统中全部可用的信号名,捕获信号后所运行的命令可以是不论什么一条或多条合法的shell语句。也可以是一个函数名。
shell脚本在运行时,会产生三个所谓的“伪信号”,(之因此称之为“伪信号”是因为这三个信号是由shell产生的,而其余的信号是由操做系统产生的)。经过使用trap命令捕获这三个“伪信号”并输出相关信息对调试颇有帮助。
<shift在 linux与unix shell编程指南 20.pdf>
shift命令每运行一次,变量的个数($#)减一,而变量值提早一位,shift number去掉number个參数
特定shell变量<linux与unix shell编程指南 14.pdf> 还有本地变量、环境变量、位置变量的完整介绍
$# 传递到脚本的參数个数
$* 以一个单字符串显示所有向脚本传递的參数。
与位置变量不一样,此选项參数可超过9个
$$ 脚本执行的当前进程ID号
$! 后台执行的最后一个进程的进程ID号
$@ 与$#一样。但是使用时加引號。并在引號中返回每个參数,for循环用$@取參数可以一次获得各个參数(不需要用shift)
$- 显示shell使用的当前选项,与set命令功能一样
$? 显示最后命令的退出状态。0表示没有错误,其它不论什么值代表有错误。
[dongsong@tm4ctt143 shell_study]$ expr 1 \> 0
1
[dongsong@tm4ctt143 shell_study]$ expr 1 \* 10
10
<linux与unix shell编程指南 017.pdf> 条件測试
test通常有两种格式,即:
test condition
或
[ c o n d i t i o n ]
使用方括号时,要注意在条件两边加上空格。
表17-1 文件状态測试
-d 文件夹
-s 文件长度大于0、非空
-f 正规文件
-w 可写
-L 符号链接
-u 文件有suid位设置
-r 可读
-x 可运行
-a 逻辑与,操做符两边均为真,结果为真,不然为假。
-o 逻辑或。操做符两边一边为真。结果为真,不然为假。
! 逻辑否。条件为假,结果为真。
[dongsong@tm4ctt143 shell_study]$ ls -lh file1.txt
-rw-rw-r-- 1 dongsong dongsong 123 Feb 25 16:43 file1.txt
[dongsong@tm4ctt143 shell_study]$ test -d file1.txt
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ [ -d file1.txt ]
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test -x file1.txt -a -x x_shift.sh
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test -f file1.txt -a -x x_shift.sh
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ -f file1.txt -a -x x_shift.sh ]
[dongsong@tm4ctt143 shell_study]$ echo $?
0
測试字符串
= 两个字符串相等。
!= 两个字符串不等。
-z 空串。
-n 非空串。
[dongsong@tm4ctt143 shell_study]$ test "hello" = hello
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ test "hello " = "hello"
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test "hello " != "hello"
[dongsong@tm4ctt143 shell_study]$
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ test -z ""
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ test -z " "
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test -n " "
[dongsong@tm4ctt143 shell_study]$ echo $?
0
測试数值
-eq 数值相等。
-ne 数值不相等。
-gt 第一个数大于第二个数。
-lt 第一个数小于第二个数。
-le 第一个数小于等于第二个数。
-ge 第一个数大于等于第二个数。
[dongsong@tm4ctt143 shell_study]$ test 20 -eq 30
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test 30 -eq 30
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ 20 -eq 30 ]
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ [ 20 -ne 30 ]
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ "20" -le "30" ]
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ "20" -ge "30" ]
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ [ "20" -lt "30" ]
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ "20" -gt "30" ]
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ LOOP=1
[dongsong@tm4ctt143 shell_study]$ echo $LOOP
1
[dongsong@tm4ctt143 shell_study]$ LOOP=`expr $LOOP + 1`
[dongsong@tm4ctt143 shell_study]$ echo $LOOP
2
expr命令通常用于整数值。但也可用于字符串。通常格式为:
expr argument operator argument
expr也是一个手工命令行计数器。
注意:
expr 自身有返回值。返回1表示成功
$? 取命令运行结果时,0表示成功
. CheckItIsADirectory 将shell文件加载到shell中(点-空格-文件名称),而后可以用set查看加载的函数,用unset可以去掉加载的函数
也可以用这样的方式把一个shell脚本载入到还有一个脚本中,相似于C++中的include
还可以把把配置文件之类的文件里的变量包括到其它脚本文件里
dd命令常用于对磁带或通常的磁带解压任务中出现的数据问题提出质疑或转换。但也可
用于建立定长文件。
如下建立长度为1兆的文件m y f i l e。
dd if=/dev/zero of=myfile count=512 bs=2048
dd if=file1.txt of=file2.txt conv=lcase 大写字母换成小写字母
dd if=file1.txt of=file3.txt conv=ucase 小写字母换成大写字母
: ${_ANS:=$_DEFAULT}请教前辈这名话的意思。
假设变量_ANS为空,将变量_DEFAULT的值赋给它
最前面:是空操做 (至关于nop?
)
这样shell就仅仅对命令行处理完毕赋值,其余啥也不干,去掉冒号会发现bash把$_ANS当命令进行运行并报错了
tput <linux与unix shell编程指南 21.pdf>
tput init 使用前初始化
字符串输出-------->
名字 含义
bel 警铃
blink 闪烁模式
bold 粗体
civis 隐藏光标
clear 清屏
cnorm 不隐藏光标
cup 移动光标到屏幕位置(x,y)
el 清除到行尾
ell 清除到行首
smso 启动突出模式
rmso 中止突出模式
smul 開始下划线模式
rmul 结束下划线模式
sc 保存当前光标位置
rc 恢复光标到最后保存位置
sgr0 正常屏幕
rev 逆转视图
<---------字符串输出
数字输出----------->
名字 含义
cols 列数目
ittab 设置宽度
lines 屏幕行数
<---------数字输出
布尔输出----------->
名字 含义
chts 光标不可见
hs 具备状态行
<-----------布尔输出
echo -e ""\033[?
25l" 关闭光标
echo -e "\033[?25h"
查找子串
cat /tmp/debug.log | perl -e 'while(<>) { if ($_ =~ /hd_uid=(\d+)/) { print "$1\n"; } } ' 匹配每行"hd_uid="后面的数字
if [ ... ]
then
...
fi
exit num
case $i in
1)
echo 1111;;
2)
echo 2222;;
*)
echo other;;
esac
basename 返回shell脚本名
var=$(n=1;while ((n<=$num));do echo $n;((n++));done) 双小括号表示算数运算
echo $var
>>1 2
可以把$var拿来作for循环用
整数运算:
[weibofengyun@localhost tfengyun_calc]$ ((a=a+1))
[weibofengyun@localhost tfengyun_calc]$ echo $a
1
[weibofengyun@localhost tfengyun_calc]$ ((a=a+1))
[weibofengyun@localhost tfengyun_calc]$ echo $a
2
[weibofengyun@localhost tfengyun_calc]$ echo $((a=a+1))
3
[weibofengyun@localhost tfengyun_calc]$ a=$((a=a+1))
[weibofengyun@localhost tfengyun_calc]$ echo $a
4
[weibofengyun@localhost tfengyun_calc]$ a=$((a+1))
[weibofengyun@localhost tfengyun_calc]$ echo $a
5
:s/procat/law/ 替换当前行第一个 procat为 law;
:s/procat/law/g 替换当前行所有 procat为 law;
:n,$s/procat/law/ 替换第n行開始到最后一行中每一行的第一个procat为law;
:n,$s/procat/law/g 替换第n行開始到最后一行中每一行所有 procat为law,当中n 为数字。若n为“.”,则表示从当前行開始到最后一行;
:.,200 s/^/xxx/g 把当前行到200行开头都加上xxx
:%s/procat/law/(等同于 :g/procat/s//law/) 替换每一行的第一个procat为law。
:%s/procat/law/g(等同于 :g/procat/s//law/g) 替换每一行中所有procat为law。 ----->>>>>>>>>>>常用<<<<<<<<<<<<<<<<<<<<<<<---------
:%s/procat/law/gc(等同于 :g/procat/s//law/gc) 一查询方式替换每一行中所有procat为law;
若替换字符串中需要替换“/”。则不能使用“/”在命令中做切割符,此时可以可以使用“#”做为分隔符,当命令中出现“#”。则“/”再也不被系统认做分隔符
:s#procat/#law/# 替换当前行第一个procat/为 law/
:%s/fields:get\w*("/fd./g 正则替换 fields:getUIntField(" fields:getStringField(" ----> fd.
同步报错
rsync: failed to set permissions on "/data jj/gameserver/startsh/conf/refreshConn.sh": Operation not permitted (1)
解决:Replace -avz with -rltvz. (The -a option is equivalent to -rlptgoD.)
-l表明监听模式。
#nc -l 4444 |tar -C /target/dir -xf -
而后,在A上经过nc和 tar发送mytest文件夹。
使用一致的4444的port。
#tar -C mytest|nc 192.168.0.11 4444
g++编译c++程序时怎样解决动态库的问题
拿clucene举例。cmake、make install以后clucene动态库在/usr/local/lib/如下(libclucene_core.so),静态库在/usr/local/include/如下
编译g++ -o test test.cpp -L/usr/local/lib -lclucene_core (把so文件的前缀lib和后缀名去掉而后用-l链接上)
执行前把动态库的位置设置到环境变量中,export LD_LIBRARY_PATH=/usr/local/lib, 而后./test就能够
g++ -DTEST 增长预编译宏TEST
g++ -g 增长调试信息。可用gdb调试
怎样避免每次都export LD_LIBRARY_PATH:
[root@localhost tutorial]# cat /etc/ld.so.conf.d/boost_python.conf
/usr/local/boost/lib/
[root@localhost tutorial]# sudo ldconfig
-ne 0 ]
then
echo "rm '$file' failed."
exit 1
fi
fi
---------------------------------------------------------------一个导出csv文件的小脚本。虽小却耗我很多时间------------------------------------------------------------------
dpkg显示安装包的头文件以及库的路径
dpkg -L libalberta2-dev
MySQL仅仅在以为走索引可以筛去85%以上数据的时候。才使用索引,假设达不到这个标准。索引是无心义的。
前缀索引:MySQL可以利用索引的前向部分。但不可以利用后向部分。不支持反向索引。
好比:SELECT col2 FROM table WHERE col1=1;可以使用索引(col1,col2),但不可以使用(col2,col1).
不等比較的优化:假设索引的前向部分在WHERE中是等于。那么可以使用索引,假设索引的前向部分再WHERE中是不等比較,那么不可以为后面的等于比較使用索引
好比:SELECT col1 FROM table WHERE col2=1 AND col3 >10;可以全然使用索引(col2,col3),但仅仅可以使用(col3,col2)的前缀,
排序的优化:可以在条件是等于的时候继续使用索引排序,或者条件中的不等于字段就是排序字段。
好比:SELECT col1 FROM table WHERE col2=1 AND col3>0 ORDER BY col3,可以全然使用索引(col2,col3)避免排序。但条件是col2<1 AND col3=0 ORDER BY col3时则仅仅能使用col2排除记录,不可以用来排序。
GROUP BY/DISTINCT也是以排序为基础,优化同上。
ubuntu下alt+f2可以执行应用程序,gnome-terminal可以启动终端
sudo yum install python-setuptools
sudo easy_install virtualenv
virtualenv venv
cd venv/
bin/easy_install django
要安装的库有多个版本号时,可以用easy_install PackageName==1.2.3指定版本号号作安装http://peak.telecommunity.com/DevCenter/EasyInstall#changing-the-active-version
python有多个版本号时候。怎样用easy_install把包安装到指定的python版本号中去:/usr/local/bin/python2.6 -m easy_install ThePkgName
~/venv/bin/python manage.py runserver 0.0.0.0:8000
~/venv/bin/easy_install python-memcached
~/venv/bin/python manage.py fetchfollowers --screen_name 吓人的鸟
~/venv/bin/python manage.py syncdb
~/venv/bin/python manage.py runserver 0.0.0.0:8000
python -m easy_install twisted 用easy_install把twisted库安装到指定的Python环境下(which python可以看到这条命令的python是什么环境下的python)
python程序数据库入库报错
Traceback (most recent call last):
File "main.py", line 225, in <module>
(hashlib.md5(imgUrl).hexdigest(), imgUrl, database.MySQLdb.Binary(imgData)))
File "/home/dongsong/boosencms/src/boosenspider/database.py", line 108, in execute
affects = cursor.execute(sql, args)
File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 174, in execute
File "build/bdist.linux-x86_64/egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
_mysql_exceptions.OperationalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")
解决的方法:设置max_allowed_packet
[root@bogon dongsong]#
[root@bogon dongsong]# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_allowed_packet=10485760
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
不停止服务程序进程直接将日志文件移走,两种方法:
1.在程序中提供对信号SIGUS1的处理程序。收到SIGUS1又一次打开输出文件out.txt
mv out.txt xx/xx (inode不会改变)
kill SIGUS1 进程ID
2.程序是别人写的,没有收到信号则又一次打开文件的处理逻辑
cp out.txt xx/xx (inode不会改变)
echo -n >out.txt 截断out.txt,out.txt的inode不会改变。内容被清空
ntpdate time.windows.com && hwclock -w
ntpdate pool.ntp.org
easy_install 安装的python包可以用easy_install -m 删除,貌似更好的方式使用pip uninstall
pkg_name (http://stackoverflow.com/questions/1231688/how-do-i-remove-packages-installed-with-pythons-easy-install)
$ wget https://bootstrap.pypa.io/get-pip.py $ python get-pip.py
0就表示从不备份;第2个0表示fsck检查的顺序。0表示不检查。
[dongsong@bogon python_study]$ mail -s "hello,吓人的鸟" xudongsong0102@163.com
hello,can you received it ?
EOT
centos安装中文输入法
sudo yum install ibus ibus-pinyin -y
系统---首选项---输入法 启动ibus输入法
cat /proc/pid/status 各參数意义(man proc)
Name 应用程序或命令的名字
State 任务的状态,执行/睡眠/僵死/
SleepAVG 任务的平均等待时间(以nanosecond为单位)。交互式任务因为休眠次数多、时间长,它们的 sleep_avg 也会对应地更大一些,因此计算出来的优先级也会对应高一些。
Tgid 线程组号
Pid 任务ID
Ppid 父进程ID
TracerPid 接收跟踪该进程信息的进程的ID号
Uid Uid euid suid fsuid
Gid Gid egid sgid fsgid
FDSize 文件描写叙述符的最大个数。file->fds
Groups
VmSize(KB) 任务虚拟地址空间的大小 (total_vm-reserved_vm),当中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页
VmLck(KB) 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm)
VmRSS(KB) 应用程序正在使用的物理内存的大小,就是用ps命令的參数rss的值 (rss)
VmData(KB) 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据。 (total_vm-shared_vm-stack_vm)
VmStk(KB) 任务在用户态的栈的大小 (stack_vm)
VmExe(KB) 程序所拥有的可运行虚拟内存的大小。代码段。不包含任务使用的库 (end_code-start_code)
VmLib(KB) 被映像到任务的虚拟内存空间的库的大小 (exec_lib)
VmPTE 该进程的所有页表的大小,单位:kb
Threads 共享使用该信号描写叙述符的任务的个数。在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描写叙述符。
SigQ 待处理信号的个数
SigPnd 屏蔽位,存储了该线程的待处理信号
ShdPnd 屏蔽位。存储了该线程组的待处理信号
SigBlk 存放被堵塞的信号
SigIgn 存放被忽略的信号
SigCgt 存放被俘获到的信号
CapInh Inheritable。能被当前进程运行的程序的继承的能力
CapPrm Permitted。进程可使用的能力。能够包括CapEff中没有的能力。这些能力是被进程本身暂时放弃的,CapEff是CapPrm的一个子集。进程放弃没有必要的能力有利于提升安全性
CapEff Effective。进程的有效能力
要使用终端的rz和sz功能上传下载文件:sudo yum install lrzsz
配置yum源(yum很差使了...):
--->start
YumRepo Error: All mirror URLs are not using ftp, http[s] or file. Eg. $releasever is not a valid release or hasnt been released yet/
wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm
sudo rpm -ivh epel-release-6-7.noarch.rpm
yum repolist
sudo yum install yum-priorities -y
在/etc/yum.repos.d/epel.repo的epel部分增长
priority=10
yum check-update
參考:http://www.linuxmail.info/add-epel-centos-6/
<----end
查看本身的出口公网ip
Windows: tracert www.google.com
Linux: wget http://members.3322.org/dyndns/getip
cat getip /*got the ip*/
局域网IP段
A类:10.0.0.0 后三位自由分配
B类:172.16.0.0 至172.31.0.0 后两位自由分配
C类:192.168.0.0 后两位自由分配
shell作文件内容替换(下述是一个文件的样例。多个文件本身用for循环)
sed 's/sinaweibo/weibo/g' ./templates/weibo/maintain/reposts.html > t.html
names=`cat /tmp/rename.txt | awk -F: '{print $1}'`;for name in $names; do sed 's/sinaweibo/weibo/g' $name > tmpfile; cp -f tmpfile $name;done;
2013-01-27成老师分享:
start--->
lsmod
modinfo
lspci
ls /sys
ls /proc
mount
runlevel #执行级别
telinit 3 #切换执行级别
init 3
dmesg #系统开机信息
last #登陆、开关机历史
ls /var/log/message #内核和一些用户日志
ls /etc #系统配置
rpm -qf /etc/localtime #查看一个文件是由哪一个软件包安装的
rpm -ql glibc #查看一个软件包安装了哪些文件
ldd #查看一个程序连接了哪些动态库
用nm external.so查看动态库中的符号
tree -a 把所有文件夹和文件用树状结构显示
tree -afsDF
tree -afsDtF
-f 打印每个文件和文件夹的全路径
-s 打印文件大小
-D 打印文件最后改动时间
-t 依照最后改动时间排序(默认降序。不知道咋按升序排)
-r 依照名字反序排(默认是依照名字的字母升序排)
-F 把文件夹后面加上/。便于区分文件和文件夹
-L 2 仅仅递归两层
删除linux下文件结尾的^M: :%s/^M$//g (^M要用ctrl+V,ctrl+m来输入。不能用键盘上的^和M来拼凑) 其它方式參见:http://blog.csdn.net/huganle/article/details/7821199
vim打开文件的时候不显示^M? 用vim -b xxx
dos2unix file也可以作上述转换
或者用vim filename, :set ff=unix
。。的15672port
POSTROUTONG是出去的。--dport:假设目的port是15672port, --SNAT:改变源地址。就把源地址变成192.168.1.xxx(因为172.。。
上面设置了 仅仅有192.168.1.xxx可以訪问这个15672port)
再在211上设置port转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward 。默认是0。每次从新启动都要执行这个命令。
防火墙在指定port接受指定IP机器的tcp链接
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -s 192.168.1.211 -p tcp --dport 15672 -j ACCEPT
通过个人试验(2014.9.12)代表:防火墙把port訪问关闭,在该port已经创建的链接没被马上掐断。仅仅是数据再也不继续转发了。因此client链接应该会在没收到ping包的状况下(对咱们游戏项目而言)被掐断
[root@localhost skynet]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
: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 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#-A INPUT -m state --state NEW -m tcp -p tcp --dport 9999 -j ACCEPT #必须加在REJECT(也就是如下那两行)以前!
不然无效!
!
。
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
-c 依照字符输出
cat - getip.1 < 25.sql #“-”表示标准输入
cat /dev/fd/0 getip.1 < 25.sql #“/dev/fd/0”和这个等效,在c程序中也可以用/dev/fd/0做为标准输入文件来打开
Unix环境高级编程第三章的习题:
shell从左到右运行命令行,因此
a.out > outfile 2>&1
首先设置标准输出到outfile,而后运行dups将标准输出拷贝到描写叙述符2(标准错误)上。其结果是将标准输出和标准错误设置为一样的文件,即描写叙述符1和2指向一样的文件表项。
而对于命令行。
a.out 2>&1 > outfile
由于首先运行dups,因此描写叙述符2成为终端(若是命令是交互运行的),标准输出重定向到outfile。结果是描写叙述符1指向outfile的文件表项,描写叙述符2指向终端的文件表项。
今天(2013.9.18)遇到一个小问题
吓人的鸟 16:17:09
为何我用myql -P不管指定3303仍是3318都进到同一个数据库去了?
成老师 16:19:35
可能用的是socket连进去的,你指定 -h 127.0.0.1 -P 3303 试试看?
吓人的鸟 16:19:43
还真是....
apache(httpd)虚拟主机配置(多个port提供不一样服务)
<VirtualHost *:8080>
DocumentRoot /var/www/html/normal
<Directory "/var/www/html/normal">
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/weibofengyun/workspace-php/tfengyunmgr/2
ServerName www.tfengyun.com
ErrorLog logs/www.tfengyun.com-error_log
CustomLog logs/www.tfengyun.com-access_log common
<Directory "/data/weibofengyun/workspace-php/tfengyunmgr/2">
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/weibofengyun/workspace-php/tfengyun140-migrant/
ServerName vip2.tfengyun.com
ErrorLog logs/vip2.tfengyun.com-error_log
CustomLog logs/vip2.tfengyun.com-access_log common
<Directory "/data/weibofengyun/workspace-php/tfengyun140-migrant/">
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
同一时候在httpd.conf中增长
Listen 80
Listen 8080
perror error_number 显示系统错误码的信息
一个复制并改动编码的小脚本
[dongsong@localhost proj.android]$ cat copy_file.sh
#!/bin/sh
fromDir=/media/sf_cocos2d-x/cocos2d-2.0-x-2.0.3/bomb/Classes/
toDir=/data/android/cocos2d-2.0-x-2.0.3/bomb/Classes/
fromFiles=`ls $fromDir`
for fromFile in $fromFiles
do
#echo $fromFile
encoding=`file $fromDir$fromFile | awk '{print $2}'`
#echo $encoding
if [[ $encoding -eq "UTF-8" ]]
then
/bin/cp -rf $fromDir$fromFile $toDir$fromFile
echo copied file $fromDir$fromFile
else
iconv -f GB2312 -t UTF-8 $fromDir"$fromFile" > $toDir"$fromFile"
echo iconved file $fromDir$fromFile
fi
done
#/bin/cp -rf /media/sf_cocos2d-x/cocos2d-2.0-x-2.0.3/bomb/Classes/* /data/android/cocos2d-2.0-x-2.0.3/bomb/Classes/
/bin/cp -rf /media/sf_cocos2d-x/cocos2d-2.0-x-2.0.3/bomb/Resources/* /data/android/cocos2d-2.0-x-2.0.3/bomb/Resources/
chown dongsong:dongsong /data/android/cocos2d-2.0-x-2.0.3/bomb/Classes/*
chown dongsong:dongsong /data/android/cocos2d-2.0-x-2.0.3/bomb/Resources/*
xhost +si:localuser:apache 授予apache用户訪问X的权限
配置在 /etc/X11下的xinitrc.d/localuser.sh里面
ssh超时问题 http://docs.oseems.com/general/application/ssh/disable-timeout
/etc/ssh/ssh_config
clientServerAliveInterval 100
服务端
ClientAliveInterval 30
TCPKeepAlive yes
ClientAliveCountMax 99999
从新启动
sudo /etc/init.d/sshd restart
设置sshd开机自启动:
chkconfig sshd on
或者
ntsysv (图形界面。好多其它服务都可以在这里管理)
内网IP: 10.x.x.x 172.16.x.x至172.31.x.x 192.168.x.x
git提交改动的文件:(至于新建的项目,在项目首页有具体的上传说明)
[xiarendeniao@localhost aoi]$ git add TowerAoi.h test.cpp
[xiarendeniao@localhost aoi]$ git commit -m "fix bug; modify check consistency"
[master 51f5864] fix bug; modify check consistency
2 files changed, 15 insertions(+), 9 deletions(-)
[xiarendeniao@localhost aoi]$ git push origin master
Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 719 bytes, done.
Total 4 (delta 2), reused 0 (delta 0)
To ssh://git@github.com/xiarendeniao/pomelo-aoi.git
c7fcad0..51f5864 master -> master
git恢复删除的文件:git ls-files -d | xargs git checkout --
[dongsong@localhost robot]$ git push origin master error: The requested URL returned error: 403 Forbidden while accessing https://github.com/xiarendeniao/robot.git/info/refs fatal: HTTP request failed [dongsong@localhost robot]$ cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = https://github.com/xiarendeniao/robot.git [branch "master"] remote = origin merge = refs/heads/master ----改动 url = ... [dongsong@localhost robot]$ cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = https://xiarendeniao@github.com/xiarendeniao/robot.git [branch "master"] remote = origin merge = refs/heads/master [dongsong@localhost robot]$ git push origin master (gnome-ssh-askpass:3020): Gtk-WARNING **: cannot open display: [dongsong@localhost robot]$ unset SSH_ASKPASS [dongsong@localhost robot]$ git push origin master Password: Counting objects: 19, done. Delta compression using up to 2 threads. Compressing objects: 100% (18/18), done. Writing objects: 100% (19/19), 8.47 KiB, done. Total 19 (delta 0), reused 0 (delta 0) To https://xiarendeniao@github.com/xiarendeniao/robot.git * [new branch] master -> master
[root@localhost server]# cat start.sh
valgrind -v --leak-check=full --log-file=mem-leak-check.log ./mapserver > mapserver.log 2>&1 &
(2014.8.21)新学了一招:yum whatprovides "*drm/drm.h"
编译或者依照时提示找不到某头文件。可以用这样的方式找到头文件的提供方
yum grouplist
yum groupinstall “X Window System”
yum groupinstall “Desktop”
yum groupinstall “Fonts”
怎样防止sudo rm -rf xx的悲剧?
[root@test-22 tmp]# cat ~/.bashrc
# .bashrc
nodel()
{
tmp=`date '+%s'`
if [ ! -d "/trash/$tmp" ]; then
mkdir "/trash/$tmp"
fi
echo "mv $@ /trash/$tmp"
mv $@ /trash/$tmp
}
alias rm='nodel'
[root@test-22 tmp]# which rm
alias rm='nodel'
生成core dump file:
ulimit -c unlimited
要在字符串输出中夹杂变量,需要用双引號,而不是单引號
[myciv@xh-4-1 sh]$ echo "sdsdf${a}" sdsdf1111111 [myciv@xh-4-1 sh]$ echo "sdsdf$a" sdsdf1111111 [myciv@xh-4-1 sh]$ echo 'sdsdf$a' sdsdf$a
删除文件名称乱码的文件(手工没法输入文件名称)
[dongsong@localhost python_study]$ ls -inum 358391 drwxrwxr-x 2 dongsong dongsong 4.0K 11月 2 02:13 ??˦ [dongsong@localhost python_study]$ find . -inum 358391 -exec mv {} /tmp/t/ \; [dongsong@localhost python_study]$ find . -inum 358391 -exec rm -rf {} \;
[root@test-22 server]# cat /bin/grep.sh #!/bin/sh aimstr=$1 dirstr=$2 #echo $aimstr #echo $dirstr #echo '++++' if [[ -z $dirstr ]]; then dirstr='.'; fi grep -rn "$aimstr" $dirstr | grep -v ".svn" | grep -v './tags' | grep -v ".swp "
#!/bin/sh username="xudongsong" password="" read -p "svn password for $username:" password svn export --username=$username --password=$password svn://svnip:svnport/svndir/myfile.csv ./myfile.csv python conv.py
监控日志错误并报警
[dongsong@localhost server]$ cat sa.sh #!/bin/sh mails[0]="youguess@163.com" ps axo "pid,lstart,etime,stat,vsize,rss,euid,ruid,tty,tpgid,sess,pgrp,ppid,pcpu,comm,cmd" | egrep "xserver|yserver|zserver | grep -v 'egrep' | awk '{print $1}' | xargs kill -USR2 rfile='mailrecord' if [ ! -f $rfile ]; then touch $rfile; fi mfile='mailfile' if [ ! -f $mfile ]; then touch $mfile; fi echo -n > $mfile logfiles=`ls -r *log` tosend=0 for logfile in $logfiles; do lastline=`grep -n "$logfile" $rfile | awk -F: '{print $3}'` if [ -z $lastline ]; then lastline=0; fi lines=`grep -n 'call stack' $logfile | awk -F: '{print $1}'` nextline=0 haserr=0 for line in $lines; do if (($line>$lastline)); then nextline=$line lend=`expr $line + 10` if (($haserr == 0)); then haserr=1 echo "------$logfile-------" >> $mfile fi sed -n "$line,${lend}p" $logfile >> $mfile tosend=1 fi done cat $rfile | grep -v $logfile > "${rfile}.new" mv "${rfile}.new" $rfile echo "${logfile}:${nextline}" >> $rfile done if (($tosend == 1)); then for addr in ${mails[*]}; do mail -s "wsjj server error" $addr < $mfile done fi rm $mfile