============================================================================================================================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