天天看點

Shell 相關技巧的總結應用(1)

1、以指定使用者的身份運作指令

  runuser - work -c "cd /home/work/uc/bin  && sh start.sh"

  runuser - push -c "cd /home/push/mucs/bin  && sh start.sh"

  或者:

  daemon --user mongod "mongod --config conf/mongod.conf"

  daemon 是一個函數名,在使用前需要 source /etc/rc.d/init.d/functions

2、關于rsync資料同步的相關應用:

  同步公司UC資料

  rsync -avzptogl --progress uc --exclude "uc/logs"  zayhu05-mb:/home/work/

  同步mucs資料

  rsync -avzpogtl --progress mucs --exclude "mucs/logs" --exclude "mucs/saved" --exclude "mucs/ttscache"  mucs06-fk:/home/push

  更換磁盤時 本地同步

  rsync -avztopgl --progress /data/    /data03/

  說明:如果沒有-l參數,将不會同步soft link ;--exclude 可以排除一些不希望同步的子目錄

3、防禦方法新的挑戰應答極限攻擊:

  采用sysctl将挑戰應答極限值提高到較大範圍,使得攻擊者不能合理地達到它,是以不能推斷出客戶伺服器連接配接的任何附加資料,以此達到防禦目的。

  1)設定 /etc/sysctl.conf 中的net.ipv4.tcp_challenge_ack_limit 到一個較大的值(如999999999):

net.ipv4.tcp_challenge_ack_limit = 999999999

  2)加載設定:

  sysctl -p

4、在umount 一塊磁盤時,系統總是提示busy,排錯如下:

[root@mucs03-mb ~]# lsof +D /data2/

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME

bash    6646 push  cwd    DIR 202,80     4096 3145731 /data2/mucs/logs

[root@mucs03-mb ~]# ps -ef | grep 6646

root      5866  1567  0 14:56 pts/1    00:00:00 grep --color=auto 6646

push      6646  6645  0 Nov23 pts/0    00:00:00 -bash

[root@mucs03-mb ~]# kill 6646

[root@mucs03-mb ~]# 然後再umount , 解除安裝成功

補充:如果/data2中包含swap分區的擴充檔案,然後在沒有swapoff的情況下,直接将檔案move到其它磁盤,然後再檢視/data2時系統會提示busy

5、統計公司應用 錯誤日志的分布比例:

[push@mucs01-fk logs]$  grep -i error mucs.err.log.2016-12-09 | awk -F'[\\[\\]]' '{state[$4]+=1;line+=1}END{for(i in state)printf ("%-35s%10d\t%-8f%\n",i,state[i],state[i]*100/line)}'

注意:awk 在定義分隔符時可以定義多個,例如:df -h | awk -F"[ %]" '/data/{if($(NF-2)>50)print $0}'  就是以空格或百分号為分隔符;但如果分隔符需要定義成中括号時,就必須使用轉義符。awk 轉義中括号時需要使用 '\\' 。 

6、從/var/log/nginx/error.log檔案中過濾近十分鐘的error日志:

[root@nginx01-mb ~]# tail -c 10m  /var/log/nginx/error.log | grep -a "error" | awk -F '['  'BEGIN{"date +%s" | getline nowTS}{"date -d \""$1"\" +%s" | getline ts; if((nowTS - ts) < 600) print $0 }'

<a href="http://s2.51cto.com/wyfs02/M00/8B/62/wKiom1hLj7CTUMKZAAG7MBZJRks548.png-wh_500x0-wm_3-wmp_4-s_2379091928.png" target="_blank"></a>

說明:首先從日志中取出最後10M的日志,然後過濾帶有"error"的行;然後取目前時間戳,用getline将目前時候戳放入newTS變量;然後使用 date -d 将每行日志中的固定時間 轉換成%s (時間戳)格式,并放入變量ts中;最後判斷目前時間戳減去日志時間戳是否大于600s,并輸出最終結果。

7、Shell函數傳回值常用的兩種方式:return,echo

1) return 語句

    shell函數的傳回值,可以和其他語言的傳回值一樣,通過return語句傳回

   注意:return隻能用來傳回整數值,且和c的差別是0傳回為正确,其他的值為錯誤。

2)echo 傳回值

   其實在shell中,函數的傳回值有一個非常安全的傳回方式,即通過輸出到标準輸出傳回。因為子程序會繼承父程序的标準輸出,是以,子程序的輸出也就直接反應到父程序。一定要注意,不要向标準輸出傳送一些不是結果的資訊(也就是說,不要随便echo一些不需要的資訊),比如調試資訊 (這些排程資訊可以重定向到一個檔案中解決),是以在使用類似grep 的指令時 要記得加上 &gt;/dev/null 2&gt;&amp;1 來接收這些輸出資訊,避免這些指令的輸出

8、公司更新jdk總結

[root@template-jp ~]# tar xfz jdk-9-ea+146_linux-x64_bin.tar.gz

[root@template-jp ~]# ls

  jdk-9   jdk-9-ea+146_linux-x64_bin.tar.gz

[root@template-jp ~]# cp -r jdk-9 /usr/java/

[root@template-jp ~]# cd /usr/java/

[root@template-jp java]# ll

total 16

lrwxrwxrwx 1 root root   16 Jan 19  2016 default -&gt; /usr/java/latest

drwxr-xr-x 8 root root 4096 Jan 19  2016 jdk1.7.0_80

drwxr-xr-x 9 root root 4096 Nov  8 13:53 jdk1.8.0_112

drwxr-xr-x 9 root root 4096 Nov  7 16:48 jdk1.8.0_77

drwxr-xr-x 8 root root 4096 Dec  8 12:10 jdk-9

lrwxrwxrwx 1 root root   22 Nov  8 13:53 latest -&gt; /usr/java/jdk1.8.0_112

[root@template-jp java]# rm latest -f

[root@template-jp java]# ln -s /usr/java/jdk-9 latest

lrwxrwxrwx 1 root root   15 Dec  8 12:10 latest -&gt; /usr/java/jdk-9

[root@template-jp java]# java -version

java version "9-ea"

Java(TM) SE Runtime Environment (build 9-ea+146)

Java HotSpot(TM) 64-Bit Server VM (build 9-ea+146, mixed mode)

[root@template-jp java]# 如果此時檢視到的目前版本不正确,需要使用alternatives設定目前版本指向latest

[root@template-jp java]# alternatives --config  java

There are 4 programs which provide 'java'.

  Selection    Command

-----------------------------------------------

   1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java

*  2           /usr/java/jdk1.8.0_91/jre/bin/java

 + 3           /usr/java/latest/bin/java

   4           /usr/java/jdk-9/bin/java

Enter to keep the current selection[+], or type selection number: 3

[root@template-jp java]# 

注意:在解壓 jdk-9-ea+146_linux-x64_bin.tar.gz 檔案時盡量避免 使用-C參數直接解壓到/usr/java目錄中,也盡量避免把解壓後的 jdk-9 目錄直接使用mv 指令移動到/usr/java 目錄,以上兩種操作方法會導緻 /usr/java/jdk-9/ 目錄下内容owner和group的異常,如下圖所示:

<a href="http://s1.51cto.com/wyfs02/M02/8B/62/wKiom1hLieSwpYU8AALLM8bL5-k757.png-wh_500x0-wm_3-wmp_4-s_678012454.png" target="_blank"></a>

9、關于awk 引用shell 變量的應用

關于awk 調用shell變量的方法很多,個人習慣使用-v選項,如下所示:

[root@zayhu01-mb ~]# df -h | awk -v threshold=$threshold -F"[ %]" '/data/{if($(NF-2)&gt;threshold)print $0}'

<a href="http://s2.51cto.com/wyfs02/M00/8B/5E/wKioL1hLjCeCj_m0AAEVeVp_Snc841.png-wh_500x0-wm_3-wmp_4-s_1785149196.png" target="_blank"></a>

10、關于php 的緩存技術

早期的php需要借助eAccelerate或Xcache相關軟體實作opcode緩存,進而提高速度;針對PHP5.5等進階版本,編譯時需要加上--enable-opcache參數,PHP就會自帶opcode 緩存功能。相關配置如下:

[root@nginx01-mb ~]# vim /usr/local/php-5.5.20/php.ini

opcache.enable=1

zend_extension=/usr/local/php-5.5.20/lib/php/extensions/no-debug-non-zts-20121212/opcache.so

opcache.memory_consumption=128

opcache.interned_strings_buffer=8

opcache.max_accelerated_files=4000

opcache.revalidate_freq=60

opcache.fast_shutdown=1

opcache.enable_cli=1

[root@nginx01-mb ~]# service php-fpm restart

11、磁盤空間未釋放

近期nginx03-fk總是提示磁盤已滿,但已經把相關資料及log清除,系統還是提示磁盤已滿。仔細檢視發現删除檔案後磁盤空間并未釋放。解決方法:重新開機相關app ,例 service  nginx restart 

本文轉自 meteor_hy 51CTO部落格,原文連結:http://blog.51cto.com/caiyuanji/1881445,如需轉載請自行聯系原作者