常用命令
adduser
$ adduser eagle
$ passwd eagle # ur password for eagle user
# 賦予用戶(hù)可以 sudo的權(quán)限
$ chmod u+w /etc/sudoers
$ vim /etc/sudoers
# 找到 `root ALL=(ALL) ALL`這行甜奄,并在下面添加 eagle用戶(hù)
eagle ALL=(ALL) ALL
$ chmod u-w /etc/sudoers
# 切換到 eagle用戶(hù)
$ su - eagle
chown
# 軟鏈接
$ chown -h superset:superset superset
# 所有子目錄及文件
$ chown -R superset:superset superset-0.15.4
date
# 該時(shí)間戳格式為 13位毫秒級(jí)別
$ echo "`date -d '2017-04-21 10:00:00' +%s`000"
du
# 文件大小
$ du -h /home/ --max-depth=1
3.1G /home/eagle
40.8G /home/
# 同理陷谱,使用 `ll -h`也可以得到文件的大小
$ ll -h
總用量 546M
-rw-rw-r-- 1 zookeeper zookeeper 41M 8月 31 10:08 zookeeper.log
-rw-rw-r-- 1 zookeeper zookeeper 101M 8月 31 00:06 zookeeper.log.1
-rw-rw-r-- 1 zookeeper zookeeper 101M 8月 29 11:39 zookeeper.log.2
-rw-rw-r-- 1 zookeeper zookeeper 101M 8月 27 16:01 zookeeper.log.3
-rw-rw-r-- 1 zookeeper zookeeper 101M 8月 25 20:38 zookeeper.log.4
-rw-rw-r-- 1 zookeeper zookeeper 101M 8月 24 00:34 zookeeper.log.5
-rw-rw-r-- 1 zookeeper zookeeper 4.2M 8月 31 09:35 zookeeper.out
grep
# 或操作
$ grep -E 'bin|etc'
$ egrep 'bin|etc'
$ awk '/bin|etc/'
# 與操作
$ grep bin | grep etc
# 不區(qū)分大小寫(xiě)
$ grep -i BIN # (bin/sbin)
# 全詞匹配
$ grep -w bin # (bin)
# 匹配催训,并指定顯示多少行上下文
$ grep -C 1 bin # (bin/boot root/sbin/script)
# 過(guò)濾腳本輸出 (|& 相當(dāng)于 stdout + stderr )
$ zkServer.sh status |& grep Mode
Mode: follower
lsof
# 系統(tǒng)級(jí) 監(jiān)控 & 診斷工具
# 指定進(jìn)程號(hào),可以查看該進(jìn)程打開(kāi)的文件
$ lsof -p <pid>
nmon
- 生成 nmon文件
# 獲得幫助文檔
$ nmon_x86_64_centos6 -h
# 不同的操作系統(tǒng)乐严,可能 nmon命令不一樣
# -f 使得 xxx.nmon文件名包含文件創(chuàng)建的時(shí)間
# -N 指定需要對(duì) NFS活動(dòng)情況進(jìn)行監(jiān)控
# -m 指定生成的 xxx.nmon存放的目錄
# -s 指定相隔多少秒诈泼,做一次監(jiān)控
# -c 指定采集多少次監(jiān)控?cái)?shù)據(jù)膝迎,生成一個(gè) xxx.nmon文件
$ /nmon/nmon_x86_64_rhel6 -f -N -m /nmon -s 60 -c 1440
$ /nmon/nmon_x86_64_centos6 -f -N -m /nmon -s 60 -c 1440
# 轉(zhuǎn)換 .nmon文件為 .csv文件
$ sort yuzhouwan-prd3_170831_0001.nmon > yuzhouwan-prd3_170831_0001.csv
# 查看監(jiān)控?cái)?shù)據(jù)
# 在 https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power%20Systems/page/nmon_analyser 頁(yè)面攘须,下載 nmon analyser v52_1.xlsm文件
# 打開(kāi)后,會(huì)提示"啟用宏定義"圣贸,點(diǎn)擊確定
# 一共會(huì)有 Analyser/Settings/Release Notes 三個(gè) sheet挚歧,跳轉(zhuǎn)到第一個(gè) Analyser里
# 點(diǎn)擊 "Analyze nmon data"按鈕,選擇 yuzhouwan-prd3_170831_0001.csv文件
# 會(huì)生成一個(gè) yuzhouwan-prd3_170831_0001.nmon.xlsx吁峻,并直接打開(kāi)
- 系統(tǒng)資源實(shí)時(shí)監(jiān)控
$ /nmon/nmon_x86_64_centos6
# 常用組合:nml
lnmonq14g---------------------Hostname=yuzhouwan-prd3-Refresh= 2secs ---11:04.35-----------|
| CPU +-------------------------------------------------------------------------+ |
|100%-| | |
| 95%-| | | # 為節(jié)省空間 此處滑负,省去25%~90%
| 20%-| | |
| 15%-| | |
| 10%-| ss | |
| 5%-|UUUUsUUUUsUUsUUUUwUUssUssUUssUUUsUUsUUUUUsU| |
| +--------------------User---------System----+----Wait---------------------+ |
| Memory Stats --------------------------------------------------------------------------|
| RAM High Low Swap Page Size=4 KB |
| Total MB 129013.3 -0.0 -0.0 10240.0 |
| Free MB 584.1 -0.0 -0.0 10240.0 |
| Free Percent 0.5% 100.0% 100.0% 100.0% |
| MB MB MB |
| Cached= 76656.7 Active= 54649.3 |
| Buffers= 4908.1 Swapcached= 0.0 Inactive = 68809.5 |
| Dirty = 131.6 Writeback = 0.0 Mapped = 75.1 |
| Slab = 4059.3 Commit_AS = 47663.8 PageTables= 96.6 |
| Network I/O ---------------------------------------------------------------------------|
|I/F Name Recv=KB/s Trans=KB/s packin packout insize outsize Peak->Recv Trans |
| lo 1044.0 1044.0 335.5 335.5 3186.8 3186.8 8639.4 8639.4 |
| eth0 5262.7 1168.7 5999.0 2762.1 898.3 433.3 10531.6 43312.1 |
| eth1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 |
|---------Warning: Some Statistics may not shown-----------------------------------------|
make
$ make -j<thread_num>
# 查看 CPU核數(shù)
$ cat /proc/cpuinfo | grep processor | wc -l
# 如果是兩個(gè)處理器的話(huà),一般 `-j2`可以達(dá)到最高效率 (某些進(jìn)程主要耗時(shí)是在 I/O上用含,并不能充分利用單個(gè) cpu的時(shí)間矮慕,則可以考慮 -j4)
# 一般的,使用 `thread_num = number_of_cores + 1`公式來(lái)計(jì)算即可
tar
# 壓縮
$ tar zcvf gc.tar.gz gc
# 解壓
$ tar zxvf gc.tar.gz
top
# 查看進(jìn)程內(nèi)線(xiàn)程資源消耗
$ top -Hp <pid>
tree
$ yum install tree -y
$ tree -L 1 /
/
├── bin
├── usr
└── var
rpm
$ rpm -i --badreloc --relocate /usr/java=/home/eagle/software/java jdk-7u80-linux-x64.rpm
rsync
# 軟鏈接啄骇、隱藏文件 等特殊文件的復(fù)制痴鳄,需要用 `rsync`命令而不能用 `scp`
$ rsync -avuz -e ssh eagle/ root@eagle:/home/eagle
ps
# 查看進(jìn)程的 啟動(dòng)時(shí)間 和 已運(yùn)行時(shí)長(zhǎng)
$ ps -eo pid,lstart,etime | grep <pid>
# 查看進(jìn)程分配內(nèi)存大小
# RSS (Resident Set Size) 常駐內(nèi)存集,表示該進(jìn)程分配的內(nèi)存大小
$ ps -e -o pid,rss
uname
$ uname -a
Linux yuzhouwan 2.6.32-504.3.3.el6.centos.plus.x86_64 #1 SMP Wed Dec 17 01:21:03 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
# kernel version
$ uname -r
2.6.32-504.3.3.el6.centos.plus.x86_64
# 具體含義: <內(nèi)核主版本>.<偶數(shù):穩(wěn)定版本/奇數(shù):開(kāi)發(fā)中版本>.<錯(cuò)誤修補(bǔ)的次數(shù)>-<?>
標(biāo)準(zhǔn)I/O
# 只輸出 腳本執(zhí)行異常信息
$ ./commands.sh 1>/dev/null 2>./error.log
# 完全不作輸出
$ ./commands.sh 1>/dev/null 2>&1
--
Shell編程
dirname
# 跳轉(zhuǎn)到缸夹,當(dāng)前腳本的文件目錄
cd `dirname $0`
.bashrc
# 在執(zhí)行腳本開(kāi)始的時(shí)候痪寻,載入環(huán)境變量
source ~/.bash_profile
cut string
# 將 string的前后各刪除一個(gè)字符
arr="[leader, election, zookeeper]"
arr=`echo ${arr:1:${#arr}-2}` # leader, election, zookeeper
command
# 通過(guò) `command`命令,可以在腳本開(kāi)始執(zhí)行前虽惭,對(duì)需要的命令進(jìn)行check
command -v nc >/dev/null 2>&1 || {
echo >&2 "I require nc but it's not installed. Try install..."; exit 1;
}
for loop
arr="leader, election, zookeeper"
OLD_IFS="$IFS"
IFS=$", "
arr=(${arr})
for a in ${arr[@]}; do
echo ${a}
done
IFS="$OLD_IFS"
# 設(shè)置IFS槽华,前面 "實(shí)戰(zhàn)技巧 - IFS設(shè)置" 已經(jīng)提到了
# 下面介紹一種 `fori`的遍歷方式
# 0 /election
# 0 /leader
# 2 /zookeeper
sorted_num=`echo ${sorted} | wc -l`
if [ ${sorted_num} -gt ${top_n} ]; then
sorted_num=${top_n}
fi
json="{"
for (( i=1; i<=${sorted_num}; i++ )); do
line=`echo "${sorted}" | sed -n "${i} p"`
json="${json}`echo ${line} | awk '{print $1}'`: `echo ${line} | awk '{print $2}'`"
if [ ${i} -lt ${sorted_num} ]; then
json="${json}, "
fi
done
json="${json}}"
# 當(dāng)然,也有其他的實(shí)現(xiàn)方法趟妥,比如下面 `seq`這種
# 但是,`seq`這種方式需要注意兩點(diǎn)
# 第一點(diǎn)佣蓉,$(seq 1 1 10)里面的 初始值披摄、步長(zhǎng)亲雪、最大值 都必須要是 Integer類(lèi)型的,如果是通過(guò) shell外部傳參進(jìn)來(lái)的疚膊,需要做類(lèi)型轉(zhuǎn)換
# 第二點(diǎn)义辕,`seq`方式在 console里面執(zhí)行沒(méi)問(wèn)題,但是寓盗,寫(xiě)在 shell腳本里面灌砖,可能會(huì)失效 (原因尚不明確)
for i in $(seq 1 2 10); do echo "skip by 2 step, value is $i"; done
readlink
# 獲取到文件
$ readlink -f logs/zookeeper.log
/home/zookeeper/logs/zookeeper.log
sed
# 先后從 zk_con里面,將 ":"冒號(hào)后面 和 "/"斜線(xiàn)之前的 都刪掉
zk_con=" /192.168.1.1:35632[1](queued=0,recved=146,sent=146,sid=0x25dd0c02a0a02a7,lop=PING,est=1503994626336,to=40000,lcxid=0x0,lzxid=0xffffffffffffffff,lresp=1503996561355,llat=0,minlat=0,avglat=0,maxlat=3)"
zk_con=`echo $zk_con | sed 's/:.*//g' | sed 's/.*\///g'` # 192.168.1.1
sort
# 通過(guò) `-k1`指定 針對(duì)第一列進(jìn)行排序
# 通過(guò) `-n`指定 針對(duì)數(shù)字進(jìn)行排序傀蚌,避免 9排在了 10前面
# 當(dāng)然也可以通過(guò)增加 `-r`基显,使得排序變成降序
# 如果,列與列之間的分隔符不是默認(rèn)的 \t善炫,則需要通過(guò) `-t`參數(shù)進(jìn)行指定
# 0 /election
# 0 /leader
# 2 /zookeeper
sorted=`echo ${result} | sort -k1 -n`
uniq
# 計(jì)數(shù)
echo -e "1\n1\n0" | uniq -c
# 2 1
# 1 0
exit 0
# 養(yǎng)成一個(gè)撩幽,腳本結(jié)尾,添加 `exit 0`的好習(xí)慣
exit 0
實(shí)用技巧
IFS設(shè)置
Shell 腳本中 IFS變量全稱(chēng) Internal Field Seprator 箩艺,內(nèi)部域分隔符
$ echo $IFS
$ echo "$IFS" | od -b
0000000 040 011 012 012
0000004
# 遍歷多行文本之前窜醉,設(shè)置 IFS為 \n
pids=`ps -ef | grep "${PROCESS_NAME}" | grep -v grep | grep -v "${SELF_NAME}" | awk '{print $2}'`
IFS=$'\n' read -rd '' -a pids <<<"$pids"
echo "pids: ${pids}"
for pid in "${pids}"; do
echo "kill -9 ${pid}"
kill -9 "${pid}"
done
每秒執(zhí)行一次
$ while true; do sleep 1; <command>; done
Windows相關(guān)
- Windows下執(zhí)行 shell腳本
# 安裝 git
$ doskey bash="%GIT_HOME%\bin\bash.exe" $*
$ doskey sh="%GIT_HOME%\bin\sh.exe" $*
$ bash shell.sh
# 類(lèi)似的可以設(shè)置 `np`為 `notepad++`的快捷啟動(dòng)命令
$ doskey np=D:\apps\Notepad++\notepad++.exe $*
- Cmd設(shè)置 Proxy
$ set http_proxy=http://your_proxy:your_port
$ set http_proxy=http://username:password@your_proxy:your_port
$ set https_proxy=https://your_proxy:your_port
$ set https_proxy=https://username:password@your_proxy:your_port
優(yōu)化實(shí)戰(zhàn)
關(guān)閉Swappiness
$ cat /proc/sys/vm/swappiness
# default: 60
# memory first: 0
# swap first: 100
# 使得 swappiness設(shè)置永久生效
$ vim /etc/sysctl.conf
vm.swappiness=10
# 可以配合 JVM中的 `-XX:+AlwaysPreTouch`參數(shù),在進(jìn)程啟動(dòng)的時(shí)候艺谆,讓 jvm通過(guò) demand-zeroed方式將內(nèi)存一次分配到位榨惰,提高 daemon常駐進(jìn)程性能
控制Overcommit
$ cat /proc/sys/vm/overcommit_memory
# 0: 表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應(yīng)用進(jìn)程使用
# 如果有足夠的可用內(nèi)存,內(nèi)存申請(qǐng)?jiān)试S静汤;否則琅催,內(nèi)存申請(qǐng)失敗,并把錯(cuò)誤返回給應(yīng)用進(jìn)程
# 1: 表示內(nèi)核允許分配所有的物理內(nèi)存撒妈,而不管當(dāng)前的內(nèi)存狀態(tài)如何
# 2: 表示內(nèi)核允許分配超過(guò)所有物理內(nèi)存和交換空間總和的內(nèi)存
禁用透明巨頁(yè)
- Page Size
$ getconf PAGE_SIZE
4096
- Huge Page Size
$ cat /proc/meminfo | grep Hugepagesize
Hugepagesize: 2048 kB
- Transparent Huge Pages
$ cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled
$ echo never > /sys/kernel/mm/transparent_hugepage/defrag
# Redhat的相關(guān)目錄: /sys/kernel/mm/redhat_transparent_hugepage/