平常工做積累(待續)

 

執行計劃任務時會主動給root發一封信php

執行計劃任務時會主動給root發一封信,關閉再也不發信的方法:css

原來是這樣:html

      [root@scj ~]#crontab -ljava

      */30 * * * * /usr/sbin/ntpdate ntp.ksyun.cnnode

改成這樣:python

      [root@scj ~]#crontab -lmysql

      */30 * * * * /usr/sbin/ntpdate ntp.ksyun.cn > /dev/null  2>&1linux

注意:2>&1 等價於 &> ,意思是:將 標準正確輸出 和 標準錯誤輸出 都輸出到一個地方nginx



解決does not map back to the address - POSSIBLE BREAK-IN ATTEMPTgit

##ssh登錄時報錯:
#less /var/log/secure
#Address 192.168.1.168 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!


##分析:
#是由於DNS服務器把 192.168.1.168 的地址反向解析成 localhost 
C:\Users\shencj>nslookup
默認服務器:  localhost
Address:  192.168.3.1

> set type=PTR
> 192.168.1.168
服務器:  localhost
Address:  192.168.3.1

168.1.168.192.in-addr.arpa      name = localhost


##解決方法:
vim /etc/ssh/sshd_config
將UseDNS 改成 no
/etc/init.d/sshd restart


zabbix微信,短信報警

參考:

    http://my.oschina.net/u/2422096/blog/601976?fromerr=8TlHnGSF

    http://wangzan18.blog.51cto.com/8021085/1734408




[Errno 13] Permission denied: '/root/.python-eggs'解決辦法

python腳本里面添加,注意必須在MySQLdb模塊前面添加:
import os
os.environ['PYTHON_EGG_CACHE'] = '/tmp/.python-eggs'

[root@localhost shell]# more qps.py 
#!/usr/bin/env python
# coding=utf-8

import time
import sys
import os
os.environ['PYTHON_EGG_CACHE'] = '/tmp/.python-eggs'    
import MySQLdb

另外權限 給  chmod 755  /tmp/.python-eggs/




獲取一分鐘的日誌(nginx)

#!/bin/bash
#author: linuxhub.org
#取出nginx一分鐘內的日誌

#Nginx日誌格式:
# 192.168.0.161 - - [26/Mar/2015:14:29:20 +0800] "GET / HTTP/1.1" 200 2126 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36" -

if [ -z $1 ];then
    echo "請在腳本後面加上日誌文件!!"
    exit 1
fi

#日誌文件
#logfile=/data/logs/nginx/admin.kuaiyouxi.com.log
logfile=$1

#開始時間
start_time=`date -d "10 minutes ago" +"%H:%M:%S"`
#start_time="14:29:20"

#結束時間
stop_time=`date +"%H:%M:%S"`
#stop_time="14:35:36"

tac $logfile | awk  -v st="$start_time" -v et="$stop_time" '
#BEGIN{
#    print "\n-------------------------------";
#    print "開始時間:"st;
#    print "結束時間:"et;
#    print "在這個時間段(1分鐘內)的日誌以下:"
#    print "---------------------------------\n"
#}

{

    #第4列的時間數據,而後按:冒號進行分割出時間
    #split($4,i,":");

    #組合時間 例: 14:37:49
    #t=sprintf("%s:%s:%s",i[2],i[3],i[4]);

    #第4列的時間數據,取出時:分:秒
    t=substr($5,RSTART+14,21);

    #判斷在st與et之間的時間
    if(t>=st && t<=et)
        {print $0}
}
#END{
#    print "\n"
#}'
##獲取一分鐘內的日誌##
sed -n "/$(date -d "1 minutes ago" "+%d\/%b\/%Y:%H:%M")/,/$(date "+%d\/%b\/%Y:%H:%M")/p" access.log




nginx root與alias區別

##Nginx 貌似沒有虛擬目錄的說法,由於它原本就是完徹底全根據目錄來設計並工做的。
##若是非要給nginx安上一個虛擬目錄的說法,那就只有alias標籤比較"像",乾脆來講說alias標籤和root標籤的區別吧。
##最基本的區別:alias指定的目錄是準確的,root是指定目錄的上級目錄,而且該上級目錄要含有location指定名稱的同名目錄。
##另外,根據前文所述,使用alias標籤的目錄塊中不能使用rewrite的break。
##說不明白,看下配置:
location /abc/ {
    alias /home/html/abc/;
}
##在這段配置下,http://ip/abc/a.html就指定的是/home/html/abc/a.html。這段配置亦可改爲
location /abc/ {
    root /home/html/;
}
##這樣,nginx就會去找/home/html/目錄下的abc目錄了,獲得的結果是相同的。可是,若是我把alias的配置改爲:
location /abc/ {
    alias /home/html/def/;
}
##那麼nginx將會從/home/html/def/取數據,這段配置還不能直接使用root配置,若是非要配置,只有在/home/html/下創建一個 def->abc的軟link(快捷方式)了。
##通常狀況下,在location /中配置root,在location /other中配置alias是一個好習慣
location /img/ {
    alias /var/www/p_w_picpath/;
}
#按照上述配置,訪問/img/目錄裏面的文件時,ningx會自動去/var/www/p_w_picpath/目錄找文件

location /img/ {
    root /var/www/p_w_picpath;
}
#按照這種配置,訪問/img/目錄下的文件時,nginx會去/var/www/p_w_picpath/img/目錄下找文件

alias是一個目錄別名的定義,root則是上層目錄的定義

還有一個重要的區別是alias後面必需要用「/」結束,不然會找不到文件的,而root則無關緊要




history顯示時間

vi /etc/bashrc
##在最後添加:
username=`whoami`
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S $username "
export HISTFILESIZE=1000000
export HISTSIZE=2000

source /etc/bashrc
#history
  321  2015-10-12 10:45:49 root vi /etc/bashrc 
  322  2015-10-12 10:45:57 root source /etc/bashrc
  323  2015-10-12 10:46:02 root ifconfig 
  324  2015-10-12 10:46:04 root history 
  325  2015-10-12 10:46:23 root vi /etc/bashrc 
  326  2015-10-12 10:46:32 root source /etc/bashrc
  327  2015-10-12 10:46:33 root history 
  328  2015-10-12 10:46:42 root date
  329  2015-10-12 10:46:44 root history
  
##數目,時間,用戶,命令




nmap掃描端口

 nmap -sS -O 139.196.xxx.xxx



安裝epel yum源

 rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm



netstat查看鏈接狀況

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}'


tomcat部署多個項目

vi server.xml
##在host標籤裏面添加一個Context標籤
<Context path="/pic" reloadable="true" docBase="/photo/pic"/>
##path:別名
##docBase:根目錄
訪問:ip:8080  默認訪問的根目錄是webapps
訪問:ip:8080/pic  訪問的是/photo/pic

參考:http://blog.csdn.net/philosophyatmath/article/details/30246631




tomcat7日誌切割

一、下載 
    # wget http://cronolog.org/download/cronolog-1.6.2.tar.gz 
二、解壓縮 
    # tar zxvf cronolog-1.6.2.tar.gz 
三、進入cronolog安裝文件所在目錄 
    # cd cronolog-1.6.2 
四、運行安裝 
    # ./configure 
    # make 
    # make install 
五、查看cronolog安裝後所在目錄(驗證安裝是否成功) 
    # which cronolog 
    ##通常狀況下顯示爲:/usr/local/sbin/cronolog
vi /usr/local/tomcat7/bin/catalina.sh
##在大約370行
##找到 if [ "$1" = "-security" ] ; then

##修改成:
 if [ "$1" = "-security" ] ; then
    if [ $have_tty -eq 1 ]; then
      echo "Using Security Manager"
    fi
    shift
    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
      -Djava.security.manager \
      -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
      -Dcatalina.base="\"$CATALINA_BASE\"" \
      -Dcatalina.home="\"$CATALINA_HOME\"" \
      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
      org.apache.catalina.startup.Bootstrap "$@" start 2>&1 \
      | /usr/local/sbin/cronolog /data/tomcat7/logs/catalina.%Y-%m-%d.out >> /dev/null &

  else
    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
      -Dcatalina.base="\"$CATALINA_BASE\"" \
      -Dcatalina.home="\"$CATALINA_HOME\"" \
      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
      org.apache.catalina.startup.Bootstrap "$@" start 2>&1 \
      | /usr/local/sbin/cronolog /data/tomcat7/logs/catalina.%Y-%m-%d.out >> /dev/null &

  fi
##重啓tomcat




nginx服務器http重定向到https的正確寫法

server {
       listen         80;
       server_name    my.domain.com;
       return         301 https://$server_name$request_uri;
}

server {
       listen         443 ssl;
       server_name    my.domain.com;

       [....]
}

參考:http://www.sijitao.net/1829.html




nginx的全局變量參數解釋

參考:http://blog.sina.com.cn/s/blog_594c47d00101dfyh.html

nginx的全局變量參數解釋 
    --網站Nginx Rewrite 規則
   
nginx的全局變量參數解釋:
$arg_PARAMETER#這個變量包含GET請求中,若是有變量PARAMETER時的值。
$args    #這個變量等於請求行中(GET請求)的參數,例如foo=123&bar=blahblah;
$binary_remote_addr#二進制的客戶地址。
$body_bytes_sent#響應時送出的body字節數數量。即便鏈接中斷,這個數據也是精確的。
$content_length#請求頭中的Content-length字段。
$content_type#請求頭中的Content-Type字段。
$cookie_COOKIE#cookie COOKIE變量的值
$document_root#當前請求在root指令中指定的值。
$document_uri#與$uri相同。
$host#請求主機頭字段(即:請求url中的host),不然爲服務器名稱(即:配置文件中的server_name值)。
$hostname#Set to the machine’s hostname as returned by gethostname
$http_HEADER
$is_args#若是有$args參數,這個變量等於」?」,不然等於」",空值。
$http_user_agent#客戶端agent信息
$http_cookie#客戶端cookie信息
$limit_rate#這個變量能夠限制鏈接速率。
$query_string#與$args相同。
$request_body_file#客戶端請求主體信息的臨時文件名。
$request_method#客戶端請求的動做,一般爲GET或POST。
$remote_addr#客戶端的IP地址。
$remote_port#客戶端的端口。
$remote_user#已經通過Auth Basic Module驗證的用戶名。
$request_completion#若是請求結束,設置爲OK. 當請求未結束或若是該請求不是請求鏈串的最後一個時,爲空(Empty)。
$request_method#GET或POST
$request_filename#當前請求的文件路徑,由root或alias指令與URI請求生成。
$request_uri#包含請求參數的原始URI,不包含主機名,如:」/foo/bar.php?arg=baz」。不能修改。
$scheme#HTTP方法(如http,https)。
$server_protocol#請求使用的協議,一般是HTTP/1.0或HTTP/1.1。
$server_addr#服務器地址,在完成一次系統調用後能夠肯定這個值。
$server_name#服務器名稱(即:配置文件中的server_name值)。
$server_port#請求到達服務器的端口號。
$uri#不帶請求參數的當前URI,$uri不包含主機名,如」/foo/bar.html」。該值有可能和$request_uri 不一致。$request_uri是瀏覽器發過來的值。該值是rewrite後的值。例如作了internal redirects後。
if (-d $request_filename){
  rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}

rewrite後面的flag:

參考:http://www.76ku.cn/articles/archives/317

##nginx中if判斷&&
set $flag 0;
if ($uri !~ /login$) {
   set $flag "${flag}1";
}
if ($uri !~ /register.html$) {
   set $flag "${flag}1";
}
if ($uri !~ /account/.*$) {
   set $flag "${flag}1";
}
if ($flag = "0111") {
   #rewrite ^/?.*$ http://$server_name$request_uri;
   rewrite ^(.*) http://$server_name$1 permanent;
}
##nginx中if判斷&&


rewrite重定向和僞靜態

rewrite重定向和僞靜態:
    重定向:rewrite ^(.*) https://$server_name$1 permanent;  (https://$server_name$1 是一個完整的url ),將http請求重定向到https
    僞靜態:rewrite ^(.*)/t(\d+)\.html$ $1/index.php?t=3 last; ($1/index.php?t=3 是一個相對的url,沒有host)將http://dede.com/index.php?t=3用僞靜態規則改寫成http://dede.com/t3.html



keepalived相關

notify_master/etc/keepalived/master.sh         #當前服務器爲主時,觖發執行的腳本
notify_backup/etc/keepalived/slave.sh          #當前服務器爲備時,觖發執行的腳本
notify_fault/etc/keepalived/notify_fault.sh    #當前服務器出現問題時,觖發執行的腳本
notify_stop/etc/keepalived/down.sh             #當前服務器爲down時,觖發執行的腳本
notify_down /etc/keepalived/killkeepalived.sh  #檢測的服務(如:mysql)down掉時,觸發執行的腳本

vi /etc/keepalived/master.sh         #增長以下內容
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change master status!!! " >> /etc/keepalived/change.log
#輸出當前時間到日誌中

##編寫當前服務器爲備時的腳本##
vim/etc/keepalived/slave.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change slave status!!!" >> /etc/keepalived/change.log
#輸出當前時間到日誌中

##編寫當前服務器不正常時的腳本##
vim/etc/keepalived/notify_fault.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change notify_fault status!!!" >>/etc/keepalived/change.log
#輸出當前時間到日誌中
sleep 3   #休眠3秒
echo "#`date +"%Y-%m-%d%H:%M"` try startup mysql!!!" >> /etc/keepalived/change.log
#輸出當前時間到日誌中     
service mysql start     #啓動Mysql服務器

##編寫當前服務器wodn時的腳本##
vim/etc/keepalived/down.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` keepalived is down!!!" >> /etc/keepalived/change.log
#輸出當前時間到日誌中
##單播模式##
vrrp_instance VI_1 {
    state backup
    interface eth0
    virtual_router_id 51
    priority 99
    unicast_src_ip 10.10.191.224      #本機ip
    unicast_peer {
       10.10.150.230                  #對端ip
    }
    advert_int 1
    #nopreempt

    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.113.94
    }
}







大神的博客地址

http://space.itpub.net/26355921  

新浪微博技術總監: http://blog.csdn.net/heiyeshuwu

書記博客:http://www.51clocker.com

startssl證書免費申請步驟:http://blog.csdn.net/ruixue0117/article/details/22201303        #建議使用firefox瀏覽器









mysql配置主從

wKioL1U_NvOjg3TmAADIY72awEo867.jpg

binlog_format           = MIXED                         //binlog日誌格式,mysql默認採用statement,建議使用mixed
log-bin                 = /data/mysql/mysql-bin.log    //binlog日誌文件
expire_logs_days        = 7                           //binlog過時清理時間
max_binlog_size         = 100m                       //binlog每一個日誌文件大小
binlog_cache_size       = 4m                        //binlog緩存大小
max_binlog_cache_size   = 512m                     //最大binlog緩存大小





驗證mysql主從數據是否一致(pt-table-checksum和pt-table-sync)

##安裝toolkit須要一些依賴包
yum -y install perl perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL perl-Time-HiRes

參考:http://www.cnblogs.com/zhoujinyi/archive/2013/05/09/3067045.html







zabbix觸發器表達式經常使用的兩個函數

last:

{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5 

意思是:最後時刻cpu的負載大於5,則觸發報警


min:

{www.solutionware.com:net.if.in[eth0,bytes].min(60)}>100K

意思是:60秒內流進網卡的流量持續大於100K,則報警


Name 觸發器名稱.
名稱能夠包含宏變量: {HOST.HOST}, {HOST.NAME}, {HOST.CONN}, {HOST.DNS}, {HOST.IP}, {ITEM.VALUE}, {ITEM.LASTVALUE} and {$MACRO}.
$1, $2…$9 能夠被用來關聯表達式的常量
示例:
name:Processor load above $1 on {HOST.NAME}」
表達式:
system.cpu.load[percpu,avg1].last(0)}>5
會顯示爲:Processor load above 5 on ttlsa雲服務器
Expression 計算觸發器狀態的邏輯表達式,這邊設置爲上一次值等於0
Multiple PROBLEM events generation 經過設置該選項,你能夠在觸發器產生problem的時候觸發一個事件
Description 觸發器的描述,通常name寫的不清楚,這邊能夠具體描述這個觸發器的做用,例如nginx當前離線,請處理等等。Zabbix 2.2版本開始,支持觸發器名稱。
URL 在Monitoring → Triggers中,能夠看到URL而且能夠點擊,通常狀況下他須要配合觸發器ID來使用,在url中包含觸發器ID(宏變量 {TRIGGER.ID}),這樣能夠直接點擊到具體觸發器中。
Severity 設置嚴重性級別,上圖我設置爲「災難」,你能夠相應的設置警告、嚴重等狀態的觸發器
Enabled 當前觸發器是否啓用



zabbix自定義key注意事項

UserParameter=sjsyServer.status,/etc/zabbix/itemscripts/mysqlstatus.sh

注意:zabbix用戶要對/etc/zabbix/itemscripts/mysqlstatus.sh這個文件有執行權限

[root@localhost itemscripts]# ll /etc/zabbix/itemscripts/mysqlstatus.sh 
-rwxr--r-- 1 zabbix root 114 Sep 14 12:25 /etc/zabbix/itemscripts/mysqlstatus.sh

不然:

[root@localhost ~]# zabbix_get -s 192.168.188.129 -k sjsyServer.status

##獲取的結果將會是空






saltstack相關

saltstack中文wiki社區:http://www.saltstack.cn/projects/cssug-kb/wiki

saltstack中文介紹:http://docs.saltstack.cn/zh_CN/latest/

saltstack官網:http://saltstack.com/

saltstack配置實例:http://bbs.chinaunix.net/thread-4142057-1-1.html

salt寫的至關不錯:http://my.oschina.net/u/877567/blog?catalog=404877

                  http://my.oschina.net/xxbAndy/blog/391591

                  http://my.oschina.net/guol/blog/156610

salt全部資源: http://docs.saltstack.cn/zh_CN/latest/ref/states/all/index.html








磁盤inode不足 

最近磁盤老是寫不上數據,查看磁盤空間(df -h)發現空間只用了不到5%,後來找到牛人才知道是磁盤inode已經用完了,可以使用df -hi查看磁盤inode使用狀況。


緣由:使用/ext3的磁盤inode空間只有幾百K,若是存儲太多的小文件致使空間不足時就沒法再建立新的文件。


解決方案:使用xfs的磁盤格式,可增長inode大小。

執行步驟:

1.   安裝xfsprogs-2.9.4-1.el5.centos.x86_64.rpm   

     rpm -ivh http://mirror.centos.org/centos/5/extras/x86_64/RPMS/xfsprogs-2.9.4-1.el5.centos.x86_64.rpm 

     或者將包下載下來手動安裝

2.   將掛載磁盤空間數據備份,並將該磁盤卸載:

     umount /data

     若是失敗,執行如下命令查看使用/data文件的全部進程:

     lsof |grep /data

     執行如下命令將進程殺死:

     lsof |grep /data |awk -F" " '{print $2}' |xargs kill

3.   執行如下命令將磁盤格式化爲xfs

     mkfs.xfs -f /dev/xvdb

4.   修改/etc/fstab,將掛載磁盤的格式由ext3改成xfs

5.   從新掛載磁盤:mount -a






iptables

每次執行 iptables -A 添加規則後,必定要記得執行:

[root@scj ~]# /etc/init.d/iptables save








lrzsz

rz:將windous端數據傳到linux服務器上

rz -y:將windous端數據傳到linux服務器上,並覆蓋掉原來相同文件名的文件

sz httpd.conf:將linux服務器上的httpd.conf文件傳到windous端








svn同步數據到線上服務器

只同步指定版本到最新版本被改過的數據:

在線上服務器寫一個腳本,代碼以下:

#!/bin/bash
#此腳本是根據svn版本號,指定版本到最新版本只同步更改過的文件到服務端

Svnurl=http://ip/svn/zhushen/server
Web_server_dir=/tmp/scj/server
Log_dir=/tmp/scj

#列出指定版本到最新版本被更改過的文件
Update_server_xml=$(/usr/bin/svn diff -r $1:HEAD $Svnurl 2> /dev/null | grep Index |awk -F":" '{print $2}')

#同步被改過的文件
case $1 in
  [0-9]*)
    echo ===================== >> $Log_dir/update.log 2>&1
    echo $(date +%F-%H:%M:%S) >> $Log_dir/update.log 2>&1
    for conf_xml in $Update_server_xml
    do
      /usr/bin/svn  export  $Svnurl/$conf_xml  $Web_server_dir/$conf_xml  --force
      echo $conf_xml >> $Log_dir/update.log
    done
  ;;
  *)
    echo "輸入版本號"
  ;;
esac








經常使用數據下載

稀酷客: http://www.ckook.com/









netstat 出現大量的close_wait狀態

wKiom1Voi_Dj8p1dAAP0p4w0660637.jpg


出現這種問題的主要緣由:

    客戶端主動關閉鏈接,服務端因爲某種緣由沒有即便向客戶端發送FIN數據請求,致使服務端沒有即便將鏈接釋放掉


解決方法:

    經過修改系統的內核參數(tcp_keepalive相關的)來解決問題:

    net.ipv4.tcp_keepalive_time=30

    net.ipv4.tcp_keepalive_probes=2

    net.ipv4.tcp_keepalive_intvl=2

    sysctl -p          #使當即生效

    注意:內核參數我調整的可能有些猛,到底合不合適要注意觀察

         參考連接:

                 http://ipsysctl-tutorial.frozentux.net/

                 http://haka.sharera.com/blog/BlogTopic/32309.htm

注意:其實出現這種問題根本的緣由仍是程序代碼有問題







find查找某一個文件


find . -name  'file*'             #查找當前目錄下file開頭的文件

注意:-name後面的關鍵字要用引號引發來,如'file*'


##find查找目錄## 只查找/backup/目錄下的全部一級目錄
find /backup/ -maxdepth 1 -type d -mtime +15 -exec rm -rf {} \;
##-maxdepth 1 -type d,只顯示一級目錄

使用find在目錄下查找文件裏含有"INFORMATION"字符串的文件名

[root@scj postfix]# find /etc/postfix/ | xargs grep "INFORMATION" | awk -F":" '{print $1}' | sort |uniq 

/etc/postfix/main.cf

[root@scj postfix]# find /etc/postfix/ | xargs grep "INFORMATION" | awk -F":" '{print $1}' | awk -F"/" '{print $NF}'|sort |uniq 

main.cf





磁盤報警快速查找方法

一、df -h

   查看掛載狀況和每一個分區的使用狀況

二、du -h --max-depth=1

   查看當前目錄下,每一個目錄裏數據的大小(只能查看目錄,文件會忽略掉),深度是1(也就是隻查看當前的一級目錄)

[root@scj tmp]# du -h --max-depth=1
12K	./scripts
96K	./salt
2.1G	./lishi
4.0K	./.ICE-unix
8.0K	./pear
2.1G	./beifen
4.2G	.

   能夠看出/tmp目錄下,總共有4.2G的數據,beifen目錄和linshi目錄各有2.1G

三、du -sh

   查看當前目錄下全部數據的大小

[root@scj tmp]# du -sh
4.2G	.

四、du -sh *

   忽然知道這個命令更好用,不只統計全部目錄,還統計全部文件(當前目錄下的一級文件和子目錄)

[root@scj tmp]# du -sh *
4.0K	aa
4.0K	beifen
4.0K	file1
2.1G	lishi
0	mysqld.sock
620K	mysqldump.sql
8.0K	pear
4.0K	percona-version-check
16K	php-fpm.log
96K	salt
12K	scripts
0	www.log.slow
0	yum.log
4.0K	yum_save_tx-2015-04-21-06-053qooJ4.yumtx
4.0K	yum_save_tx-2015-04-21-07-03wAW6m7.yumtx
8.0K	yum_save_tx-2015-04-29-11-12VLBEZO.yumtx
8.0K	yum_save_tx-2015-04-29-11-17jxd71y.yumtx
8.0K	yum_save_tx-2015-04-29-11-188of3QH.yumtx

利用上面四個命令能夠快速定位某個目錄(其實第二個命令能夠被第四個命令替代了)







建立邏輯卷

新買進一臺服務器,用來存數據庫數據

最好的方法是將磁盤作成邏輯卷(未來可動態擴展)

步驟:http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/24/3096087.html


縮減home邏輯卷,添加到/(根)邏輯卷下:

    http://www.php114.net/2013/1019/637.html

    http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/24/3097785.html









rpm包下載地址

163網易:

http://mirrors.163.com/centos/


東北大學:

http://mirror.neu.edu.cn/centos/


搜狐CentOS鏡像: 

http://mirrors.sohu.com/centos/


電子科技大: 

http://mirrors.stuhome.net/centos/


中科大:

http://centos.ustc.edu.cn/centos/







兩次fork()緣由

一、子進程的產生:

    執行任何程序,父進程會產生子進程,由子進程去完成;子進程會被分配必定的資源,同時子進程會繼承父進程的全部資源環境

二、執行fork()函數:

    執行fork()函數會產生一個子進程,fork()函數會返回兩個值,子進程號和0,如果父進程則返回子進程號,如果子進程則返回0;若調用fork()函數失敗則返回-1(失敗緣由:進程數達到上限;內存不足)

三、孤兒進程:

    父進程產生一個子進程,若父進程在子進程結束以前結束,則這個子進程就會變爲孤兒進程,不過,這個子進程以後會由init這個進程去管理,同時子進程結束時,資源也會被init進程回收

四、殭屍進程:

    父進程產生一個子進程,子進程結束時,父進程沒有用waitwaitpid回收子進程,這時候這個子進程就會變成殭屍進程,殭屍進程不會佔用系統資源,不過會佔用進程表,雖然殭屍進程不佔用資源,可是若是殭屍進程多了也會影響系統性能

五、兩次fork():

   爲了不出現殭屍進程,就須要執行兩次fork();父進程執行fork產生子進程,子進程再執行fork產生一個子子進程;子子進程的父進程是子進程,子進程的父進程多是一個一直在運行的某個服務, 咱們把子進程停掉,這時候子子進程就會由init進程去管理,以後子子進程結束時,資源也由init進程去回收

六、參考:http://www.linuxidc.com/Linux/2011-08/40590.htm







守護進程

一、定義:

    守護進程:脫離終端而且在後臺運行的進程

    守護進程脫離終端:避免進程在執行過程當中的信息在任何終端上顯示;進程不會被任何終端所產生的終端信息所打斷

二、建立步驟:

    建立子進程,退出父進程:

        使用fork()函數和if判斷語句,使子進程變爲孤兒進程,交給init進程管理

pid = os.fork()         #調用fork()函數
if pid < 0:             #小於0,代表調用fork失敗
    print 'invoke fork() failure'
    sys.exit(1)         #退出腳本
elif pid > 0:           #大於0,代表是父進程
    sys.exit(0)         #退出父進程

    在子進程中建立新會話:

        這個步驟是建立守護進程中最重要的一步;調用fork函數建立子進程時,子進程繼承了父進程的所有資源環境(包括會話期、進程組、控制終端等),雖然父進程退出了,但會話期、進程組、控制終端等並無改變,所以,子進程並無真正的獨立出來,而setsid函數可以使子進程徹底獨立出來

os.setsid()             #調用setsid()函數

    改變當前目錄爲根目錄:

        調用fork()函數建立子進程,子進程也會繼承父進程的當前工做目錄,若子進程使用父進程的當前工做目錄可能會有一些問題

os.chdir("/")

    重設文件權限掩碼:

        把文件權限掩碼設置爲0,能夠大大加強守護進程的靈活性

os.umask(0)

三、一個建立守護進程的實例:

vi /tmp/dir1/file.py
#encoding:utf-8
import os
import sys
import time
import commands

pid = os.fork()         #調用fork()函數
if pid < 0:             #小於0,表面調用fork失敗
    print 'invoke fork() failure'
    sys.exit(1)         #退出腳本
elif pid > 0:           #大於0,表面是父進程
    sys.exit(0)         #退出父進程,下面全部命令都是在子進程下執行

os.setsid()             #在子進程中調用setsid函數
os.chdir("/")
os.umask(0)
while True:
    os.system('echo `date +%F-%H%M%S` >> /tmp/dir1/file')
    time.sleep(1)

 

[root@scj dir1]# python /tmp/dir1/file.py 
[root@scj dir1]# ps -ef | grep file.py
root      3282     1  0 02:46 ?        00:00:00 python /tmp/dir1/file.py
root      3311  1575  0 02:46 pts/1    00:00:00 grep file.py

由上發現:file.py被放在後臺做爲守護進程運行,父進程號是1(也就是init進程)

注意:守護進程由init進程管理

[root@scj dir1]# tail -f /tmp/dir1/file
2015-06-23-025041
2015-06-23-025042
2015-06-23-025043
2015-06-23-025044
2015-06-23-025045
2015-06-23-025046
2015-06-23-025047
2015-06-23-025048
2015-06-23-025049
2015-06-23-025050
2015-06-23-025051
2015-06-23-025052
2015-06-23-025053
2015-06-23-025054

每秒執行一次

四、中止守護進程的方法:

    使用kill殺死

[root@scj dir1]# ps -ef | grep file.py
root      3282     1  0 02:46 ?        00:00:00 python /tmp/dir1/file.py
root      4195  1575  0 02:51 pts/1    00:00:00 grep file.py
[root@scj dir1]# kill -9 3282






添加靜態路由

另外一種永久的方法:

wKioL1WaGFPzfS2rAAKHVwtZaMQ576.jpg

###設置eth0上的路由,若是不默認網關在eth0上,就不用設置了
#cat > /etc/sysconfig/network-scripts/route-eth0 << EOF
#10.0.0.0/8 via 10.126.40.254
#EOF






內核優化

net.core.wmem_max = 873200
net.core.rmem_max = 873200
net.core.netdev_max_backlog = 1024
net.core.somaxconn = 512
net.ipv4.tcp_mem = 786432  1048576 1572864
net.ipv4.tcp_wmem = 8192  436600  873200
net.ipv4.tcp_rmem = 8192  436600  873200
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_fin_timeout = 30 
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024  65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
#### sysctl.conf setting  設置內核參數
cat >> /etc/sysctl.conf << EOF
###下面的TCP內核參數的調整都是爲了讓服務器能夠應對大的或突發性的鏈接數(如上萬的ESTALISH鏈接)
這些調整在nginx/squid/varnish/httpd/ftp這樣有會產生大量的TCP鏈接的應用上,是須要的
##最大的TCP數據接收窗口(字節)
net.core.wmem_max = 873200
##最大的TCP數據發送窗口(字節)
net.core.rmem_max = 873200
##每一個網絡接口接收數據包的速率比內核處理這些包的速率快時,容許送到隊列的最大數目,默認是300
net.core.netdev_max_backlog = 1024
##定義了系統中每個端口最大的監聽隊列的長度,這是個全局的參數。
net.core.somaxconn = 512
##下面的三個要一塊兒看
##第一個net.ipv4.tcp_mem[0][1][2]表示TCP總體內存使用,計算方式是值*內存頁大小4K;
##三個值分別是低於[0]值,表示TCP沒有內存壓力,在[1]值下,進入內存壓力階段,大於[2]高於此值,TCP拒絕分配鏈接
##net.ipv4.tcp_wmem[0][1][2]分別表示最小發送內存,默認發送內存,最大發送內存;
##結合上面的net.ipv4.tcp_mem[0][1][2]三個值,當TCP總內存佔用小於tcp_mem[0]時,能夠分配小於tcp_wmem[2]的內存給一個TCP鏈接;
##當TCP內存佔用大於tcp_mem[0]時,能夠分配tcp_wmem[0]的內存;
##當TCP總內存佔用大於tcp_mem[1],小於tcp_mem[2]時,能夠分配tcp_wmem[0]的內存;
##當TCP總內存佔用大於tcp_mem[2]時,tcp內存分析沒法進行
##net.ipv4.tcp_rmem的三個值的解釋同上。
net.ipv4.tcp_mem = 786432  1048576 1572864  #設置[0][1][2]分別爲3G、4G、6G
net.ipv4.tcp_wmem = 8192  436600  873200   #設置TCP發送緩存分別爲:最小8K,默認400k,最大800K
net.ipv4.tcp_rmem = 8192  436600  873200   #設置TCP接收緩存分別爲:最小8K,默認400k,最大800K
net.ipv4.tcp_retries2 = 5  #TCP失敗重傳次數,默認值15,意味着重傳15次才完全放棄.可減小到5,以儘早釋放內核資源
net.ipv4.tcp_fin_timeout = 30  #表示若是套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間
net.ipv4.tcp_keepalive_time = 1200  #表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改成20分鐘
net.ipv4.tcp_syncookies = 1  #開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少許SYN***
net.ipv4.tcp_tw_reuse = 1  #表示開啓重用。容許將TIME-WAIT sockets從新用於新的TCP鏈接,減小TIME-WAIT 狀態
net.ipv4.tcp_tw_recycle = 1  #表示開啓TCP鏈接中TIME-WAIT sockets的快速回收
net.ipv4.ip_local_port_range = 1024  65000  #增大本地端口數,對於發啓不少對外的鏈接時有用
net.ipv4.tcp_max_syn_backlog = 8192 # 進入SYN包的最大請求隊列.默認1024.對重負載服務器,增長該值顯然有好處
net.ipv4.tcp_max_tw_buckets = 5000  #表示系統同時保持TIME_WAIT套接字的最大數量,若是超過這個數字,TIME_WAIT套接字將馬上被清除並打印警告信息,默認爲180000
###這四個是用來設置lvs實體機用的,若是你的機器不使用lvs的DR方式,能夠不加這幾個參數
net.ipv4.conf.lo.arp_ignore = 1  
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
EOF

參考: http://waringid.blog.51cto.com/65148/183496/

wKioL1XISK7zmS2aAAKvAQdBxHA741.jpg





nohup

若是咱們想把一個進程放在後臺運行,可使用&;可是隻使用&把進程放在後臺運行會有問題,就是當咱們退出帳號或是註銷用戶時,這個進程就會消失;爲了不退出帳號時進程就會消失,可使用nohup,就是no hang up 不掛起的意思

·





sed添加多行

[root@scj www.scj.com]# cat file2.sh 
aaaaaa
bbbbbb
cccccc
dddddd

在第二行後面添加以下內容:

#備份6服 血色城堡
dbname='gamedb_xscb logdb_xscb'
dumpname='6f_xscb'

mysqldump  --opt --default-character-set=utf8 --databases  $dbname > ${backuptodir}${dumpname}_full_`date +%Y%m%d%H%M`.sql
cd $backuptodir
dumpfile=`find . -type f -name "${dumpname}*" | sort | tail -n1 | awk -F'/' '{print $2}'`
tar -zcf ${dumpname}_full_`date +%Y%m%d%H%M`.tar.gz $dumpfile
rm -rf $dumpfile
[root@scj www.scj.com]# sed -i '2a\\n#備份6服 血色城堡\ndbname='"'gamedb_xscb logdb_xscb'"'\ndumpname='"'6f_xscb'"'\n\nmysqldump  --opt --default-character-set=utf8 --databases  $dbname > ${backuptodir}${dumpname}_full_`date +%Y%m%d%H%M`.sql\ncd $backuptodir\ndumpfile=`find . -type f -name "${dumpname}*" | sort | tail -n1 | awk -F'"'/'"' '"'{print \$2}'"'`\ntar -zcf ${dumpname}_full_`date +%Y%m%d%H%M`.tar.gz $dumpfile\nrm -rf $dumpfile\n' file2.sh 
[root@scj www.scj.com]# cat file2.sh 
aaaaaa
bbbbbb

#備份6服 血色城堡
dbname='gamedb_xscb logdb_xscb'
dumpname='6f_xscb'

mysqldump  --opt --default-character-set=utf8 --databases  $dbname > ${backuptodir}${dumpname}_full_`date +%Y%m%d%H%M`.sql
cd $backuptodir
dumpfile=`find . -type f -name "${dumpname}*" | sort | tail -n1 | awk -F'/' '{print $2}'`
tar -zcf ${dumpname}_full_`date +%Y%m%d%H%M`.tar.gz $dumpfile
rm -rf $dumpfile

cccccc
dddddd

解析:

[root@scj www.scj.com]# sed '1a\hello' file2.sh    #在第一行後面添加hello一行,sed最外面必須用單引號,必須
aaaaaa
hello
bbbbbb
[root@scj www.scj.com]# sed '1a\hello\nworld' file2.sh   #添加兩行,用\n進行換行
aaaaaa
hello
world
bbbbbb
##在第一行後面添加'hello',要帶着單引號
[root@scj www.scj.com]# sed '1a\'"'hello'"'' file2.sh 
aaaaaa
'hello'
bbbbbb
##這裏在單引號裏用'"'把hello引發來便可
[root@scj www.scj.com]# sed '13a\\n' file1.sh && sed "14a\#備份6服 血色城堡\ndbname='gamedb_xscb logdb_xscb'\ndumpname='6f_xscb'\n" file1.sh         #sed裏面若引用變量,此時最外面要用雙引號
[root@scj www.scj.com]# sed '1a\if\n  {\n    echo hello\n  }' file2.sh 
aaaaaa
if
  {
    echo hello
  }
bbbbbb
##有幾個空格就在單引號寫幾個空格






ls幾個參數

ls:默認是按文件(目錄)名的首字母進行排序的

##注意:pear是目錄
[root@scj tmp]# ls
file1  file2  file3.sh  gamedb.sql  logdb.sql  mysqldump.sql  pear  test  yum.log  zookeeper
[root@scj tmp]# ls -l
total 664
-rw-r--r--  1 user1  nobody      6 Apr 15 06:57 file1
-rw-r--r--  1 nobody nobody      6 Apr 15 07:00 file2
-rw-r--r--  1 root   root      246 Aug 21 13:23 file3.sh
-rw-r--r--  1 root   root    11461 Aug 12 05:07 gamedb.sql
-rw-r--r--  1 root   root     7102 Aug 12 05:07 logdb.sql
-rw-r--r--  1 root   root   631787 May  6 11:47 mysqldump.sql
drwxr-xr-x  3 root   root     4096 Apr 10 14:13 pear
-rw-r--r--  1 root   root        7 Aug 21 13:25 test
-rw-------. 1 root   root        0 Apr  3 15:01 yum.log
drwxr-xr-x  2 root   root     4096 Apr  8 09:45 zookeeper

ls -r:按文件名首字母反向排序

[root@scj tmp]# ls -r
zookeeper  yum.log  test  pear  mysqldump.sql  logdb.sql  gamedb.sql  file3.sh  file2  file1

ls -t:按文件(目錄)的修改時間排序

##最近修改時間在前面
[root@scj tmp]# ls -t
test  file3.sh  gamedb.sql  logdb.sql  mysqldump.sql  file2  file1  pear  zookeeper  yum.log
[root@scj tmp]# ls -lt
total 664
-rw-r--r--  1 root   root        7 Aug 21 13:25 test
-rw-r--r--  1 root   root      246 Aug 21 13:23 file3.sh
-rw-r--r--  1 root   root    11461 Aug 12 05:07 gamedb.sql
-rw-r--r--  1 root   root     7102 Aug 12 05:07 logdb.sql
-rw-r--r--  1 root   root   631787 May  6 11:47 mysqldump.sql
-rw-r--r--  1 nobody nobody      6 Apr 15 07:00 file2
-rw-r--r--  1 user1  nobody      6 Apr 15 06:57 file1
drwxr-xr-x  3 root   root     4096 Apr 10 14:13 pear
drwxr-xr-x  2 root   root     4096 Apr  8 09:45 zookeeper
-rw-------. 1 root   root        0 Apr  3 15:01 yum.log

ls -rlt:按修改時間反向排序

[root@scj tmp]# ls -ltr
total 664
-rw-------. 1 root   root        0 Apr  3 15:01 yum.log
drwxr-xr-x  2 root   root     4096 Apr  8 09:45 zookeeper
drwxr-xr-x  3 root   root     4096 Apr 10 14:13 pear
-rw-r--r--  1 user1  nobody      6 Apr 15 06:57 file1
-rw-r--r--  1 nobody nobody      6 Apr 15 07:00 file2
-rw-r--r--  1 root   root   631787 May  6 11:47 mysqldump.sql
-rw-r--r--  1 root   root     7102 Aug 12 05:07 logdb.sql
-rw-r--r--  1 root   root    11461 Aug 12 05:07 gamedb.sql
-rw-r--r--  1 root   root      246 Aug 21 13:23 file3.sh
-rw-r--r--  1 root   root        7 Aug 21 13:25 test






刷博客訪問次數

import webbrowser
import time
import os

z = 1
while z <= 5:
    x = 1
    while x <= 10:
        webbrowser.open_new_tab("http://732233048.blog.51cto.com/9323668/1625477")
        x = x + 1
        time.sleep(1)
    else:
        os.system("taskkill /F /IM 360se.exe")
    z = z + 1

注意:

    博文的連接地址:http://732233048.blog.51cto.com/9323668/1625477

    360瀏覽器的程序名稱:360se.exe

    windows殺掉瀏覽器程序的命令:taskkill /F /IM 360se.exe

    本例中共打開50次:

        裏面循環打開10次,關閉瀏覽器

        外面循環5次





git

git亂碼問題:http://segmentfault.com/a/1190000000578037

git使用:http://blog.csdn.net/vipzjyno1/article/details/






lsof和fuser

lsof:查看某個進程打開使用的文件有哪些

      lsof | grep puppet :查看puppet進程所打開的文件


fuser:查看某一個文件是由哪一個進程打開的

      fuser -v /usr/lib/ruby/1.8/i386-linux/syck.so:包含用戶,進程號及command等等

      fuser -m  :後面接的那個文件名會主動上提到該文件系統的最頂層,對umount不成功頗有效

            如:fuser -m /home   查看home正在被哪些進程所使用

                fuser -m /home/xxxx/xxxx    上跳到文件系統最頂層/home

[root@localhost ~]# lsof -i :80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   1634   root    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1662 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1663 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1664 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1665 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1714 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1715 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1716 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1717 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   2086 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   2087 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
[root@localhost ~]# ps -ef | grep http
root       1634      1  0 05:17 ?        00:00:03 /usr/local/apache2/bin/httpd -k start
daemon     1662   1634  0 05:17 ?        00:00:01 /usr/local/apache2/bin/httpd -k start
daemon     1663   1634  0 05:17 ?        00:00:01 /usr/local/apache2/bin/httpd -k start
daemon     1664   1634  0 05:17 ?        00:00:01 /usr/local/apache2/bin/httpd -k start
daemon     1665   1634  0 05:17 ?        00:00:02 /usr/local/apache2/bin/httpd -k start
daemon     1714   1634  0 05:20 ?        00:00:02 /usr/local/apache2/bin/httpd -k start
daemon     1715   1634  0 05:20 ?        00:00:01 /usr/local/apache2/bin/httpd -k start
daemon     1716   1634  0 05:20 ?        00:00:01 /usr/local/apache2/bin/httpd -k start
daemon     1717   1634  0 05:20 ?        00:00:02 /usr/local/apache2/bin/httpd -k start
daemon     2086   1634  0 09:26 ?        00:00:01 /usr/local/apache2/bin/httpd -k start
daemon     2087   1634  0 09:26 ?        00:00:02 /usr/local/apache2/bin/httpd -k start
root       2899   2771  0 15:54 pts/3    00:00:00 grep http
[root@localhost ~]# lsof -i :80 |wc -l
12
[root@localhost ~]# ps -ef | grep http|wc -l
12








centos查看網卡流量iftop

top:用來查看系統的性能狀況

l: 切換顯示平均負載和啓動時間信息。即顯示隱藏第一行
m:切換顯示內存信息。即顯示隱藏內存行
t: 切換顯示進程和CPU狀態信息。即顯示隱藏CPU行
c:切換顯示命令名稱和完整命令行。 顯示完整的命令。 這個功能頗有用。
M: 根據駐留內存大小進行排序。
P:根據CPU使用百分比大小進行排序。
T:根據時間/累計時間進行排序

top -bc -n1 與 ps -ef 功能差很少,且更詳細;在方括號'[]'裏的都是內核級進程


iftop:用來查看網卡流量狀況

參考:

    http://blog.csdn.net/gaojinshan/article/details/40781241

    http://down.chinaz.com/server/201112/1478_1.htm

相關文章
相關標籤/搜索