多網(wǎng)卡綁定
ss 和 netstat 用來查看已啟動的進(jìn)程和端口的對應(yīng)關(guān)系
lsof -i :80 查看80端口被誰占用
把多塊物理網(wǎng)卡綁定在一起 谊囚,在邏輯上被當(dāng)做一塊網(wǎng)卡向外提供服務(wù)盗迟,既能
提高帶寬杨凑,加速傳輸效率 同時也能實現(xiàn)容錯
多網(wǎng)卡的綁定有個前提:多塊網(wǎng)卡應(yīng)該連接在同一個交換機(jī)上
在centos6上做綁定可以有多種模式 不同模式工作特性不一樣,有些模式需要交換機(jī)做一些配置
mode0:多塊網(wǎng)卡輪流處理,每塊網(wǎng)卡都分擔(dān)一部分流量
mode1:主備 其中一塊工作扯键,其他做備用
mode2:廣播 所有網(wǎng)卡都傳輸一樣的數(shù)據(jù)
主備模式的配置
其中 ifcfg-bond0 是新建的文件
BONDING_OPTS='miimon=100 mode=0'
mode=1用來指定是主備模式 miimon=100是指備用網(wǎng)卡每100毫秒查看主網(wǎng)卡一次 ,如果主網(wǎng)卡故障了珊肃,啟動備用網(wǎng)卡
然后在自己的物理網(wǎng)卡添加兩行
MASTER=bond0 SLAVE=yes
相當(dāng)于物理網(wǎng)卡不是獨立使用荣刑,而是由bond0來管理
當(dāng)做實驗的時候,要求主機(jī)的兩塊網(wǎng)卡連接到同一交換機(jī)(如果是虛擬機(jī)伦乔,都設(shè)置成NAT)
通過查看/proc/net/bonding/bondx
可以查看哪個網(wǎng)卡在工作
對于centos系列 更改網(wǎng)卡名字
在/etc/default/grub文件里面找到
grub_cmdline_linux 這行 厉亏,在后面添加net.ifnames=0
在centos7 里面要借助 grub2-mkconfig -o /boot/grub2/grub.cfg來生成 /boot/grub2/grub.cfg 使網(wǎng)卡改名成功
在ubuntu 上更改網(wǎng)卡名字與centos系列大體一致 主要是把 grub2-mkconfig 換成 grub-mkconfig,前面操作是一致的
centos6 更改主機(jī)名的配置文件是
/etc/sysconfig/network
centos7 主機(jī)名的配置文件是
/etc/hostname
centos7 更改主機(jī)名 更加便捷
systemctl set-hostname xxx
在centos7 上面 推薦使用nmcli 來設(shè)置網(wǎng)絡(luò)
主要使用nmcli device / connection
nmcli device 查看各個設(shè)備的網(wǎng)絡(luò)情況
nmcli device show eth0 查看網(wǎng)卡eth0 的詳細(xì)信息
nmcli connection 查看各網(wǎng)卡的網(wǎng)絡(luò)連接狀態(tài)
當(dāng)我們需要多套網(wǎng)絡(luò)環(huán)境的時候,我們可以在/etc/sysconfig/network-scripts里面 配置多個網(wǎng)卡文件烈和,應(yīng)對不同的網(wǎng)絡(luò)環(huán)境
nmcli connection add con-name xx ifname xxx type xxx ipv4.method manual ipv4.address xxxx/xxx
這樣就相當(dāng)于創(chuàng)建了一個新的網(wǎng)卡配置文件爱只,但是沒生效,
nmcli connection up xxx 即生效了
當(dāng)對網(wǎng)卡配置文件修改之后招刹, 通過nmcli connection 看不到時恬试,可以
nmcli connection reload 重新加載,在nmcli connection up xx 可生效
nmcli connection delete xxx
centos7 使用nmcli 實現(xiàn)多網(wǎng)卡綁定
創(chuàng)建一個邏輯上的綁定網(wǎng)卡
nmcli connection add con-name xxx type bond ifname bondx mode active-backup ipv4.method manual ipv4.address xxxxx/xxx
往綁定網(wǎng)卡里面添加物理網(wǎng)卡
nmcli connection add con-name xxx type bond-slave ifname xx master bondx
nmcli connection up xxx(邏輯上綁定網(wǎng)卡的名稱)
網(wǎng)絡(luò)組
示例
網(wǎng)橋
網(wǎng)橋( 交換機(jī))不同網(wǎng)段的主機(jī)連接到網(wǎng)橋以后蔗喂,能夠?qū)崿F(xiàn)通信
其實做網(wǎng)橋的這個實驗忘渔,就相當(dāng)于把兩臺主機(jī)插到網(wǎng)橋(交換機(jī))上 。
網(wǎng)橋(交換機(jī))在實現(xiàn)多臺主機(jī)通訊的時候缰儿,是不需要配置ip的畦粮,只有
在管理連接到交換機(jī)的主機(jī)時,才需要設(shè)置ip
臨時清理ip地址 : ifconfig 網(wǎng)卡名字 0.0.0.0
ubuntu 網(wǎng)絡(luò)配置
search 那行是表示 域名后綴補全
寫完之后乖阵,netplan apply 使其生效
進(jìn)程
守護(hù)進(jìn)程 :隨著計算機(jī)啟動而進(jìn)行宣赔,隨著計算機(jī)關(guān)閉而結(jié)束
進(jìn)程和線程的執(zhí)行管理都是由os來操作的
線程是os來調(diào)度 ,協(xié)程有程序員通過代碼來調(diào)度
在linux進(jìn)程眼里瞪浸,它擁有的內(nèi)存空間被稱作虛擬內(nèi)存空間(線性內(nèi)存)
MMU 負(fù)責(zé)虛擬內(nèi)存和物理內(nèi)存之間的轉(zhuǎn)換儒将,cpu最終是從物理內(nèi)存讀取數(shù)據(jù) MMU 在 cpu里面 TLB 是 虛擬內(nèi)存和物理內(nèi)存的緩存
用戶空間和內(nèi)核空間
進(jìn)程狀態(tài)切換
LRU
當(dāng)某個數(shù)據(jù)再次被訪問 ,調(diào)到最上面
ipc(進(jìn)程間通信)
進(jìn)程之間的資源是互相獨立的 (例如对蒲,內(nèi)存)
消息隊列 : 有一個公共的消息隊列服務(wù)器钩蚊,然后多個進(jìn)程中,當(dāng)某個進(jìn)程往消息隊列里面寫東西時蹈矮,其他進(jìn)程可以從消息隊列里面讀取內(nèi)容砰逻,進(jìn)而實現(xiàn)不同主機(jī)的進(jìn)程之間通訊
實時優(yōu)先級
實時進(jìn)程優(yōu)先級高的會搶占優(yōu)先級低的cpu資源
當(dāng)優(yōu)先級相同的時候,有兩種方式處理泛鸟,一種是等先運行的進(jìn)程結(jié)束之后蝠咆,在運行等待的進(jìn)程 即按順序來 還有一種是輪流(各自執(zhí)行一會,輪流交替執(zhí)行)
非實時進(jìn)程 100-139 可以通過nice來調(diào)整他們的優(yōu)先級,但是在nice里面用的不是100-139 而是用-20-19 來對應(yīng) 100 -139 (也是數(shù)字越小刚操,優(yōu)先級越高)
DMA :直接內(nèi)存訪問 當(dāng)需要從硬盤讀取數(shù)據(jù)到內(nèi)存的時候闸翅,cpu直接給DMA發(fā)送指令 ,DMA會直接把數(shù)據(jù)從硬盤讀取到內(nèi)存菊霜,讀取過程不需要cpu參與坚冀。從內(nèi)存把數(shù)據(jù)寫入磁盤 DMA也采取上述工作方式,cpu值負(fù)責(zé)發(fā)送一個指令鉴逞,傳輸過程不需要cpu參與
pstree -p 顯示進(jìn)程樹 加-p 顯示進(jìn)
程編號
pgrep -lt pts/1
查看運行在pts/1 上的進(jìn)程和pid
pgrep -P 1
查看pid為1的進(jìn)程的子進(jìn)程的pid
ps 當(dāng)前進(jìn)程的快照(默認(rèn)只顯示當(dāng)前終端的進(jìn)程)
常見選項 ps aux
在顯示的字段里面 vsz 表示os承諾分配的內(nèi)存 rss是真正分配的內(nèi)存
ps axo pid,%cpu,%mem,tty k %cpu
只顯示 pid cpu mem tty 且按照cpu正序排序
pidof 進(jìn)程 查看進(jìn)程的pid
ps axo pid,%cpu,%mem,tty,cmd k
-%mem 只顯示cpu mem tty cmd 按內(nèi)存倒序排序 加psr 查看 進(jìn)程運行在哪個cpu上
由于cpu里面有緩存遗菠,當(dāng)某個進(jìn)程在某個cpu里面運行的時候,進(jìn)程的數(shù)據(jù)被存儲在cpu緩存里华蜒,如果頻繁切換不同的cpu來執(zhí)行此進(jìn)程 效率大幅下降(緩存無法得到高效利用) ,如果把某個進(jìn)程綁定到指定的cpu豁遭,會大幅提高效率 叭喜,如果綁定不合理,會造成某個cpu負(fù)載過大
pgrep -lt pts/1 查看運行在pts/1上的進(jìn)程
pgrep -lu wang 表示以wang的身份(生效)運行的進(jìn)程
pgrep -lU wang 表示以wang的身份發(fā)起的進(jìn)程 (不一定生效)
比如 以wang身份運行passwd ,生效身份其實是root
發(fā)起passwd進(jìn)程的身份是wang
pgrep -l '^ba.*' 搜索以ba開頭的進(jìn)程
加 -l 顯示更加詳細(xì)
uptime 顯示開機(jī)時長 以及負(fù)載
top 實時監(jiān)控進(jìn)程的狀態(tài)
在top運行過程當(dāng)中蓖谢,
敲擊M 內(nèi)存倒序排序
敲擊P cpu倒序排序
累計占據(jù)cpu時長 T
當(dāng)一個進(jìn)程運行一段時間之后捂蕴,內(nèi)存應(yīng)該是穩(wěn)定的 如果占用內(nèi)存一直不斷增加,會導(dǎo)致內(nèi)存泄漏(內(nèi)部用光了)
在top字段里面有hi(硬中斷) si (軟中斷)
硬件之上是內(nèi)核闪幽,內(nèi)核之上是app,
當(dāng)app想要使用硬件完成某個功能啥辨,通過系統(tǒng)調(diào)用請求內(nèi)核來管理硬件,硬件是通過中斷來和內(nèi)核通訊的
free 查看內(nèi)存
buffer 字段的功能當(dāng)內(nèi)存里的數(shù)據(jù)要寫入磁盤的時候盯腌,并不是有一點數(shù)據(jù)都往磁盤寫 溉知,可以利用buffer 做容器
等存儲了一定數(shù)量的數(shù)據(jù)在一次性的寫入 ,減少了寫入次數(shù)腕够,提高效率级乍,而cache是從磁盤讀入數(shù)據(jù)到內(nèi)存的時候,如果把經(jīng)常讀入的數(shù)據(jù)放在cache里面帚湘,下次讀取的時候玫荣,就不必從磁盤讀取了,可以直接從cache里面讀取大诸,同樣也能提高效率捅厂。
vmstat 查看虛擬內(nèi)存的狀態(tài)
si so bi bo i或者o都是針對內(nèi)存而言的 例如 si 從swap出 進(jìn)內(nèi)存
bo 出內(nèi)存 進(jìn)塊設(shè)備(磁盤)
in 中斷 cs 進(jìn)程切換率 us 用戶空間 sy 內(nèi)核空間
iostat 顯示io信息
顯示io信心,每隔2秒顯示一次资柔,
pmap 查看一個進(jìn)程pid的內(nèi)存映射
pmap -x 1471
pid為1471的進(jìn)程的內(nèi)存映射
iftop(需要yum 安裝) 顯示網(wǎng)卡接口的流量情況
TX 是發(fā)送
RX 是接收
棧 : 后進(jìn)先出
堆:存放大量數(shù)據(jù)
iotop 可以用來查看某個進(jìn)程的磁盤讀寫利用情況
nload 實時查看網(wǎng)卡的流量情況
lsof 查看哪些文件正在被占用
lsof -a /etc/passwd
查看哪個進(jìn)程在使用/etc/passwd文件
kill -l 查看信號的種類
ss -nlt 查看處于監(jiān)聽狀態(tài) ip和port
之所以重啟某項服務(wù)之后焙贷,服務(wù)生效了,是因為重啟服務(wù)之后建邓,會讀取服務(wù)的配置文件
lsof -c xx xx進(jìn)程所打開的文件
kill 向進(jìn)程發(fā)送控制信號
kill -2 10411 把pid為10411 的進(jìn)程中斷 (相當(dāng)于ctrl +c )kill命令的參數(shù)是pid
kill -15 10411 -15 這個信號是殺死
上面的命令和 kill 10411 功能相同
kill -19 $(pidof ping)
此命令相當(dāng)于 ctrl + z
把 ping 放入后臺休眠
在linux里面正在使用的文件可以被刪除
lsof -i :port 查看port在被哪個進(jìn)程占用
pgrep -lt pts/1 看運行在pts/1上的進(jìn)程
pkill -t pts/1 殺死pts/1的所有進(jìn)程
kill -l 查看信號列表
kill + sig + pid
pkill 同kill 功能一致 (但支持正則)
常用信號
15 是正常殺死
killall + sig + processName
在后臺運行的程序盈厘,如果終端掛掉了,還是會導(dǎo)致程序無法運行官边。
nohup 剝離進(jìn)程和終端的關(guān)系
nohup cmd 當(dāng)關(guān)閉終端沸手,cmd進(jìn)程不會終止外遇,會作為pid為1的子進(jìn)程
kill %x 殺死后臺的進(jìn)程
-9 強力殺
前后臺轉(zhuǎn)換
xxx & 后臺執(zhí)行
jobs 查看后臺運行的程序編號
fg xx 后臺進(jìn)程轉(zhuǎn)前臺執(zhí)行
正在運行的程序 敲擊ctrl + z 轉(zhuǎn)后臺 并且 停止運行
bg 后臺停止的進(jìn)程恢復(fù)運行
kill -19 pid / killall -19 processName 后臺運行轉(zhuǎn)休眠
kill -0 pid / killall -0 processName 查看進(jìn)程是否運行正常
killall -0 httpd &> /dev/null || service httpd restart httpd服務(wù)出現(xiàn)故障,重啟服務(wù)
并行執(zhí)行腳本
cmd1;cmd2;cmd3
等待cmd1結(jié)束契吉,運行cmd2,依次類推
第一種
在腳本里面
cmd1 &
cmd2 &
cmd3 &
第二種
(a.sh &);(b.sh &);(c.sh &)
第三種
{ a.sh & b.sh & c.sh & }
注意:花括號這種 前后有空格
計劃任務(wù)
at 一次性任務(wù)
cron 周期性任務(wù)
at 計劃執(zhí)行依賴 atd服務(wù) 確保atd服務(wù)啟動才能使用at
計劃任務(wù)中的標(biāo)準(zhǔn)輸出以郵件方式發(fā)送給用戶(通過mail查看)
at 計劃任務(wù)是放在 /var/spool/at目錄里面
at time
以ctrl +d 結(jié)束
at -l 查看計劃任務(wù)列表
at -d 任務(wù)編號 刪除xx編號任務(wù)
在計劃任務(wù)腳本中跳仿,盡量避免出現(xiàn)標(biāo)準(zhǔn)輸出 (一旦有輸出 ,會不斷發(fā)郵件)
如果白名單和黑名單同時存在捐晶,那么生效的只有白名單(即黑名單無效),當(dāng)白名單不存在時惑灵,黑名單里面的用戶沒有權(quán)限執(zhí)行山上,黑名單之外的用戶可以執(zhí)行,兩個文件都不存在英支,所有用戶都被拒絕執(zhí)行佩憾,除了root
crontab 設(shè)置周期計劃任務(wù) (依賴 crond 服務(wù)的啟動)
創(chuàng)建好的計劃任務(wù)存放在/var/spool/cron里面
時間格式: 分 時 日 月 周
系統(tǒng)周期任務(wù)計劃 寫入/etc/crontab
用戶自定義的任務(wù)計劃 通過crontab 創(chuàng)建
天 和 周幾 是或的關(guān)系,其他都是且的關(guān)系
crontab -e
進(jìn)入編輯模式
0 8 * * 1,3,5 /usr/bin/wall "good morning!'
周一干花,三妄帘,五 早8點 執(zhí)行wall good morning
查看crontab 計劃列表
crontab -l
crontab -r -u xx 刪除指定用戶的計劃任務(wù)
crontab -l -u 查看指定用戶的計劃任務(wù)
/usr/bin/run-parts 會運行指定目錄下的所有腳本
- /usr/bin/run-parts /data/scripts 是指每分鐘都會運行/data/scripts里面的所有腳本
01 * * * * 是指每個小時的第一分鐘(例如 12:01)
@reboot xxx 下次重啟自動運行 xxx
30 21 * * * /usr/sbin/poweroff
每天晚上九點半關(guān)機(jī)
sleep 1 休眠1秒
usleep 1 休眠1微秒
1秒=1000毫秒
1毫秒=1000微秒
在計劃任務(wù)中,最好把要執(zhí)行的任務(wù)寫在腳本里面池凄,避免出現(xiàn)各種符號問題
- /usr/bin/run-parts /data/scripts 是指每分鐘都會運行/data/scripts里面的所有腳本
*/10 15-17 1 * * /usr/bin/echo 'hello'
每月一日的15點到17點 每隔10分鐘抡驼,執(zhí)行一次echo 'hello'
shell 腳本
for 循環(huán)
for xx in 類似列表形式的內(nèi)容都可以 ; do cmd ; done
for i in *.txt (表示文件的時候,不要加雙引號) 肿仑; do cmd; done
@ 獲取腳本的所有參數(shù)(每個參數(shù)是單獨的個體)
{1,100,3} 1,4,7,11....
declare -i sum=0
for i in {1..100};do
if [ $[i%2] -eq 1 ];then
let sum+=i
fi
done
tr -dc '[:alnum:]' < /dev/urandom | head -8
從/dev/urandom的標(biāo)準(zhǔn)輸入中 把數(shù)字和字母的補集刪除 (即留下數(shù)字和字母)可以用來制作 隨機(jī)密碼
echo sum=$sum
for i in {1..10};do
useradd user\$i
password=\`tr -dc '[:alnum:]' < /dev/urandom | head -8`
echo user\$i:\$password | tee -a (追加的含義) pass.txt | chpasswd
passwd -e user\$i(直接設(shè)置用戶密碼過期致盟,以便讓用戶登錄改口令) user\$i &> /dev/null
echo 'User:user\$i is created'
done
sed '/^alice/,$' /etc/passwd
把/etc/passwd 里面過濾出 以alice開頭的行一直到最后一行
NETID=172.16.128
for HOSTID in {1..254}; do
{ if ping -c1 -W1 \$NETID\.\$HOSTID &> /dev/null ;then
echo \$NETID.$HOSTID is up | tee -a hostlist.txt
fi } &
done
wait
{ xxxx } & 是指 大括號里的內(nèi)容被看作一個整體 放在后臺執(zhí)行 能夠?qū)崿F(xiàn)并行的效果(取決于cpu的核數(shù))并行執(zhí)行 不按順序執(zhí)行
wait 等待腳本執(zhí)行結(jié)束以后,自動顯示提示符
99乘法表
for i in {1..9};do
for j in \`seq \$i`;do
echo -e "\${i}x\${i}=$[i*j] \t"
done
echo
done
while 循環(huán)
while : ; do
xx
done 死循環(huán)
SLEEPTIME=10
while :; do
! xxx 是取反
if ! killall -0 php-fpm &> /dev/null ;then
systemctl restart php-fpm &> /dev/null
echo "AT \`data +'%F %T'` php-fpm is restarted "
fi
sleep SLEEPTIME
done
for ((i=0;i<10:i++));do
if [ $i -eq 5 ] ; then
continue
fi
echo i=$i
done
跳過5
for ((i=0;i<10;i++));do
if [ $i -eq 5 ]; then
break
fi
echo i=$i
done
碰到break 整個循環(huán)結(jié)束
for ((i=0;i<10;i++);do
for (j=0;j<10;j++);do
if [ $j -eq 5 ] ; then
continue 2
continue 2 是 連著跳2次 第一次跳過內(nèi)層循環(huán)柏副,第二次跳過外層循環(huán)
fi
echo j=$j
done
echo i=$i
done
echo finish
for ((i=0;i<10;i++);do
for ((j=0;j<10;j++);do
if [ $j -e1 5 ]; then
break 2 接連退出兩次 退出整個大循環(huán)
fi
echo j=$j
done
echo finish
如果 $1 非空 則為真 勾邦,否則為假
if [ "$1" ] ; do
useradd $1
echo $1 is created
shift 默認(rèn)把參數(shù)向左移動一位
done
N=[$RANDOM%10+1]
while read -p 'input a number(1-10):' NUM ;do
if [[ $NUM =~ ^[[:digit:]]+$]] ;then
if [ $NUM -eq $N ];then
echo ok
break
elif [ $NUM -gt $N ];then
echo too large
else
echo too small
fi
else
echo 'please input a number '
fi
done
while read xxx 接收標(biāo)準(zhǔn)輸入 逐行讀入
lastb 查看某個用戶的失敗登陸信息(例如密碼錯誤)
## select循環(huán)與菜單
PS2 是多行輸入重定向的提示符
![image.png](https://upload-images.jianshu.io/upload_images/18840398-8b24d9789d4e9cee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
PS3='please input a number :'
select menu in gongbaojidan kaoya haishen baoyu;do
case $REPLY in
1)
echo $menu price is 30
;;
2)
echo $menu price is 10
;;
3)
echo $menu price is 50
;;
4)
echo $menu price is 60
;;
5)
echo $menu price is 90
6)
break
;;
*)
echo 'please input again'
esac
done
函數(shù)
declare -f 查看已定義的函數(shù)和內(nèi)容
declare -F 只查看已定義的函數(shù)名
在當(dāng)前窗口定義的函數(shù)只在當(dāng)前窗口生效
unset funcname 刪除在窗口定義的函數(shù)
echo os version is `func_os_version`
func_os_version() {
sed -nr 's/.* ([0-9]+)\..*/\1/p' /etc/redhat-release
上面的寫法會報錯 ,函數(shù)要先定義割择,后使用
當(dāng)其他腳本想要使用此函數(shù)的時候眷篇,可以在腳本中重新定義一次,不過很麻煩 荔泳,所以比較好的做法是把定義好的函數(shù)統(tǒng)一放到一個文件里面蕉饼,需要的時候讀取此文件即可
函數(shù)里面的return xxx 可以用echo $?查看 xxx 的值
在 /etc/init.d/functions 里面存放很多已經(jīng)定義好的函數(shù),可以直接在腳本里面引用
num=200; func_test() { local num=100; echo $sum ; }
local xx 是定義局部變量 只在函數(shù)內(nèi)部有效 玛歌,如果不加local 會影響函數(shù)之外的與之同名變量的值
定義普通變量 n=xxx
定義環(huán)境變量 export n=xxx 或者
declare -f xxx
定義局部變量 local n=xxx
{ xxx; xxx;} 可以理解為匿名函數(shù)
遞歸: 函數(shù)自己調(diào)用自己
:(){:|:&}; fork 炸彈 管道會開啟大量子進(jìn)程導(dǎo)致內(nèi)存耗盡
其中:是函數(shù)名
trap 捕獲
trap 'echo press ctrl+c ' int
trap -p
for ((i=0;i<10;i++));do
echo $i
sleep 1
done
發(fā)送信號2 或者 ctrl+c 打印 ctrl+c
finish() {
echo finish is excuted
}
trap finish exit
for ((i=0;i<5;i++));do
echo $i
sleep 1
done
發(fā)生退出 觸發(fā)finish 函數(shù)
數(shù)組
數(shù)組賦值
引用數(shù)組
數(shù)組切片
NUM=({1..10})
echo ${NUM[@]} 全部元素
echo ${NUM[@]:2} 跳過前兩個
echo ${NUM[@]:2:3} 跳過前兩個,取三個
字符串切片
${#var} 字符串的長度
${var:3} 取跳過前3個字符的其他字符串
${var:2:3} 跳過前兩個字符昧港,取3個字符
echo ${var: -3} 注意 中間有一個空格
取后三個
echo ${var:2:-3} 跳過前兩個和后三個,取中間
echo ${var: -6:-4}在后6個里面 去掉后4個
echo ${var#root} 在var里面從左一直刪到第一個root
echo ${var##root} 在var里面從最左側(cè)一直刪到 最后一個root (貪婪模式)
echo ${var%root} 在var里面從最右側(cè)刪到碰到的第一個root
echo ${var%%root} 從右側(cè)往左刪 一直刪到最左側(cè)的root(貪婪模式)
url=http://www.magedu.com:80
echo ${url##:} 從最左側(cè)一直到: 刪除(包含:) --> 80
echo ${url%%:} 從最右側(cè)一直到:刪除 (包含:) --> http
echo ${var/root/admin} 替換var里面第一個root為admin
echo ${var//root/admin} 替換所有root為admin
echo ${var/#pattern/substr }
替換pattern 開頭的--> substr
echo ${var/%pattern/substr}
替換pattern 結(jié)尾的-->substr
echo ${var/root} 刪除var里面第一個root
echo ${var//root} 刪除var里面所有root
echo ${var^^} var里面所有小寫轉(zhuǎn)大寫
echo ${var,,} 大寫轉(zhuǎn)小寫
大小寫轉(zhuǎn)換并沒有修改原來的值
name=${title-mage}
title 空 值為空
title不存在 值為mage
title=a 值為a
declare 聲明
eval 兩次掃描
n=10
eval echo {1..$n} --> 1,2,3,4,5,...10
title=name
name=mage
eval echo \ $$title --> mage
echo ${! title} --> mage
mktemp xxxfile ---> 三位隨機(jī)數(shù)file
install 集 cp chgrp chmod chown 功能于一身
expect 交互轉(zhuǎn)腳本
spawn scp /etc/fstab 192.168.8.100:/app
expect {
'yes/no" {send
'yes/no';exp_continue}
'password' {send 'magedu\n'}
}
expect eof
用spawn激活scp進(jìn)程
用expect 監(jiān)聽 如果出現(xiàn)yes/no 代替手工輸入 yes\n exp_continue 繼續(xù)判斷 出現(xiàn)password 會輸入magedu\n 直到進(jìn)程運行結(jié)束
spawn ssh 192.168.8.100
expect {
'yes/no' {send
'yes/no';exp_continue}
'password' {send 'magedu\n'}
}
interact (登陸之后再轉(zhuǎn)交互模式)
set ip 192.168.8.100
set user root
set password magedu
set timeout 10 (設(shè)置超時時長)
spawn ssh $user@$ip
expect {
'yes/no' { send 'yes\n' ;exp_continue }
'password' { send '$password\n' }
}
interact
lindex $argv 0 代表第一個位置參數(shù)
set ip [lindex $argv 0 ]
set user [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh $user@$ip
expect {
'yes/no' { send 'yes\n' ;exp_continue}
'password' { send "$password\n' }
}
interact
set ip [lindex $argv 0]
set user [lindex $argv 1 ]
set password [lindex $argv 2]
set timeout 10
spawn ssh $user@$ip
expect {
'yes/no' { send 'yes\n' ;exp_continue}
'password' { send '$password\n' }
}
登陸之后繼續(xù)執(zhí)行其他命令
expect ']#' { send 'useradd haha\n' }
expect ']#' { send 'echo magedu | passwd --stdin haha \n' }
send 'exit \n'
expect eof
工作中常用的是在shell中調(diào)用expect
#! /bin/bash
ip =$1
user=$2
password=$3
expect << EOF
set timeout 20
spawn ssh $user@$ip
expect {
'yes/no' { send 'yes\n';exp_continue }
'password' { send '$password\n' }
}
expect ']#' { send 'useradd hehe\n' }
expect ']#' { send 'echo magedu | passwd --stdin hehe \n' }
expect ']#' { send 'exit\n ' }
expect eof
EOF
系統(tǒng)啟動
centeos 6啟動流程
加電自檢主要就是在開機(jī)時做硬件檢查
mbr 存放在某塊磁盤的第一個扇區(qū)支子,而其中的前446個字節(jié)存放的是bootloader 创肥,比較常見的bootloader 例如grub grub文件分幾個部分,第一部分放在mbr的前446字節(jié)里面 ,其他的存放在/boot/grub 里面叹侄,而其中g(shù)rub.conf 記錄了kernel 存放的位置
kernel 里面只存放最核心的內(nèi)容巩搏,其他非核心的(例如 文件系統(tǒng)驅(qū)動是以模塊的方式存放在其他地方)
驅(qū)動文件一般以.ko結(jié)尾
以模塊方式存放非核心的內(nèi)容的好處是可以按需加載
可以通過lsmod 查看已加載的模塊
initramfs xxxxx 模擬了根文件系統(tǒng) ,內(nèi)核通過此文件找到必須的驅(qū)動趾代,進(jìn)而啟動
缺少initramfs xxx 啟動無法啟動
1 可以重新安裝 kernel 包
2 mkinitrd /boot/initramfs-`uname -r`.img `uname -r ` 來恢復(fù)此文件
刪除initramfsxxx重啟之后修復(fù)
故障描述:針對centos 6
重啟之后贯底,出現(xiàn)菜單倒計時,之后黑屏 有個短橫杠一直閃爍
虛擬機(jī)在重新開機(jī)啟動時撒强,按f2進(jìn)入光盤引導(dǎo) ---> 救援光盤模式--->進(jìn)入shell 后 chroot /mnt/sysimage
cd /boot/ mkinitrd initramfs-`uname -r`.img `uname -r`
第二種方法 :
mount /dev/sr0 /mnt
rpm -ivh /mnt/Packagexxx --force