:strace -f g++ main.cpp &| vim 檢視g++編譯過程呼叫了哪些系統呼叫,通過管道符用vim接收
:%! grep execve
:%s/ , /\r /g 將檔案中的 ,+空格 換成\r, /g表示全域性替換
strace引數
-c 統計每一系統呼叫的所執行的時間,次數和出錯的次數等.
-d 輸出strace關於標準錯誤的偵錯資訊.
-f 跟蹤由fork呼叫所產生的子程序.
-ff 如果提供-o filename,則所有程序的跟蹤結果輸出到相應的filename.pid中,pid是各程序的程序號.
-F 嘗試跟蹤vfork呼叫.在-f時,vfork不被跟蹤.
-h 輸出簡要的幫助資訊.
-i 輸出系統呼叫的入口指標.
-q 禁止輸出關於脫離的訊息.
-r 列印出相對時間關於,,每一個系統呼叫.
-t 在輸出中的每一行前加上時間資訊.
-tt 在輸出中的每一行前加上時間資訊,微秒級.
-ttt 微秒級輸出,以秒了表示時間.
-T 顯示每一呼叫所耗的時間.
-v 輸出所有的系統呼叫.一些呼叫關於環境變數,狀態,輸入輸出等呼叫由於使用頻繁,預設不輸出.
-V 輸出strace的版本資訊.
-x 以十六進位制形式輸出非標準字串
-xx 所有字串以十六進位制形式輸出.
-a column
目錄 | |
---|---|
/bin | 存放二進位制可執行檔案(ls,cat,mkdir等),常用命令一般都在這裡。 |
/etc | 存放系統管理和組態檔 |
/home | 存放所有使用者檔案的根目錄,是使用者主目錄的基點,比如使用者user的主目錄就是/home/user,可以用~user表示 |
/usr | 用於存放系統應用程式,比較重要的目錄/usr/local 本地系統管理員軟體安裝目錄(安裝系統級的應用)。這是最龐大的目錄,要用到的應用程式和檔案几乎都在這個目錄。 /usr/x11r6 存放x window的目錄 /usr/bin 眾多的應用程式 /usr/sbin 超級使用者的一些管理程式 /usr/doc linux檔案 /usr/include linux下開發和編譯應用程式所需要的標頭檔案 /usr/lib 常用的動態連結庫和軟體包的組態檔 /usr/man 幫助檔案 /usr/src 原始碼,linux核心的原始碼就放在/usr/src/linux裡 /usr/local/bin 本地增加的命令 /usr/local/lib 本地增加的庫 |
/opt | 額外安裝的可選應用程式包所放置的位置。一般情況下,我們可以把tomcat等都安裝到這裡。 |
/proc | 不能動,虛擬檔案系統目錄,是系統記憶體的對映。可直接存取這個目錄來獲取系統資訊。 |
/sys | 不能動,linux核心, 硬體裝置的驅動程式資訊 |
/root | 超級使用者(系統管理員)的主目錄(特權階級o) |
/sbin | 存放二進位制可執行檔案,只有root才能存取。這裡存放的是系統管理員使用的系統級別的管理命令和程式。如ifconfig等。 |
/dev | 用於存放裝置檔案。 |
/mnt | 系統管理員安裝臨時檔案系統的安裝點,系統提供這個目錄是讓使用者臨時掛載其他的檔案系統。 |
/boot | 存放用於系統引導時使用的各種檔案,啟動時的核心檔案 |
/lib | 存放跟檔案系統中的程式執行所需要的共用庫及核心模組。共用庫又叫動態連結共用庫,作用類似windows裡的.dll檔案,存放了根檔案系統程式執行所需的共用檔案。 |
/tmp | 用於存放各種臨時檔案,是公用的臨時檔案儲存點。 |
/var | 用於存放執行時需要改變資料的檔案,也是某些大檔案的溢位區,比方說各種服務的紀錄檔檔案(系統啟動紀錄檔等。)等。 |
/lost+found | 這個目錄平時是空的,系統非正常關機而留下「無家可歸」的檔案(windows下叫什麼.chk)就在這裡 |
/srv | 不能動,service縮寫,存放一些服務啟動之後需要提取的資料, |
能:
(1) 分屏。
(2) 允許斷開Terminal連線後,繼續執行程序。
結構:
一個tmux可以包含多個session,一個session可以包含多個window,一個window可以包含多個pane。
範例:
tmux:
session 0:
window 0:
pane 0
pane 1
pane 2
...
window 1
window 2
...
session 1
session 2
...
操作:
(1) tmux:新建一個session,其中包含一個window,window中包含一個pane,pane裡開啟了一個shell對話方塊。
(2) 按下Ctrl + a後手指鬆開,然後按%:將當前pane左右平分成兩個pane。
(3) 按下Ctrl + a後手指鬆開,然後按"(注意是雙引號"):將當前pane上下平分成兩個pane。
(4) Ctrl + d:關閉當前pane;如果當前window的所有pane均已關閉,則自動關閉window;如果當前session的所有window均已關閉,則自動關閉session。
(5) 滑鼠點選可以選pane。
(6) 按下ctrl + a後手指鬆開,然後按方向鍵:選擇相鄰的pane。
(7) 滑鼠拖動pane之間的分割線,可以調整分割線的位置。
(8) 按住ctrl + a的同時按方向鍵,可以調整pane之間分割線的位置。
(9) 按下ctrl + a後手指鬆開,然後按z:將當前pane全螢幕/取消全螢幕。
(10) 按下ctrl + a後手指鬆開,然後按d:掛起當前session。
(11) tmux a:開啟之前掛起的session。
(12) 按下ctrl + a後手指鬆開,然後按s:選擇其它session。
方向鍵 —— 上:選擇上一項 session/window/pane
方向鍵 —— 下:選擇下一項 session/window/pane
方向鍵 —— 右:展開當前項 session/window
方向鍵 —— 左:閉合當前項 session/window
(13) 按下Ctrl + a後手指鬆開,然後按c:在當前session中建立一個新的window。
(14) 按下Ctrl + a後手指鬆開,然後按w:選擇其他window,操作方法與(12)完全相同。
(15) 按下Ctrl + a後手指鬆開,然後按PageUp:翻閱當前pane內的內容。
(16) 滑鼠滾輪:翻閱當前pane內的內容。
(17) 在tmux中選中文字時,需要按住shift鍵。(僅支援Windows和Linux,不支援Mac,不過該操作並不是必須的,因此影響不大)
(18) tmux中複製/貼上文字的通用方式:
(1) 按下Ctrl + a後鬆開手指,然後按[
(2) 用滑鼠選中文字,被選中的文字會被自動複製到tmux的剪貼簿
(3) 按下Ctrl + a後鬆開手指,然後按],會將剪貼簿中的內容貼上到遊標處
意區分 一般模式和編輯模式
vim 無法修改唯讀檔案,可以修改後 輸入 :w !sudo tee % --強制儲存 然後按 Ctrl + z 退出即可
進入一般模式後
yy 拷貝當前行 p貼上 5yy 拷貝當前行向下的5行
dd 刪除當前行 5dd 刪除當前行向下的五行
在vim底端命令列輸入 /要查詢的內容 即可找到第一個 輸入n尋找下一個 輸入N尋找上一個
命令列輸入 set nu --顯示行號 set nonu --不顯示行號
復原之前的編輯命令 --在一般模式下輸入u
遊標定位 --一般模式下 行號 shift+g 注意這裡是看不到輸入的行號的
功能:
(1) 命令列模式下的文字編輯器。
(2) 根據副檔名自動判別程式語言。支援程式碼縮排、程式碼高亮等功能。
(3) 使用方式:vim filename
如果已有該檔案,則開啟它。
如果沒有該檔案,則開啟個一個新的檔案,並命名為filename
模式:
(1) 一般命令模式
預設模式。命令輸入方式:類似於打遊戲放技能,按不同字元,即可進行不同操作。可以複製、貼上、刪除文字等。
(2) 編輯模式
在一般命令模式裡按下i,會進入編輯模式。
按下ESC會退出編輯模式,返回到一般命令模式。
(3) 命令列模式
在一般命令模式裡按下:/?三個字母中的任意一個,會進入命令列模式。命令列在最下面。
可以查詢、替換、儲存、退出、設定編輯器等。
操作:
(1) i:進入編輯模式
(2) ESC:進入一般命令模式
(3) h 或 左箭頭鍵:遊標向左移動一個字元
(4) j 或 向下箭頭:遊標向下移動一個字元
(5) k 或 向上箭頭:遊標向上移動一個字元
(6) l 或 向右箭頭:遊標向右移動一個字元
(7) n<Space>:n表示數位,按下數位後再按空格,遊標會向右移動這一行的n個字元
(8) 0 或 功能鍵[Home]:遊標移動到本行開頭
(9) $ 或 功能鍵[End]:遊標移動到本行末尾
(10) G:遊標移動到最後一行
(11) :n 或 nG:n為數位,遊標移動到第n行
(12) gg:遊標移動到第一行,相當於1G
(13) n<Enter>:n為數位,遊標向下移動n行
(14) /word:向遊標之下尋找第一個值為word的字串。
(15) ?word:向遊標之上尋找第一個值為word的字串。
(16) n:重複前一個查詢操作
(17) N:反向重複前一個查詢操作
(18) :n1,n2s/word1/word2/g:n1與n2為數位,在第n1行與n2行之間尋找word1這個字串,並將該字串替換為word2
(19) :1,$s/word1/word2/g:將全文的word1替換為word2
(20) :1,$s/word1/word2/gc:將全文的word1替換為word2,且在替換前要求使用者確認。
(21) v:選中文字
(22) d:刪除選中的文字
(23) dd: 刪除當前行
(24) y:複製選中的文字
(25) yy: 複製當前行
(26) p: 將複製的資料在遊標的下一行/下一個位置貼上
(27) u:復原
(28) Ctrl + r:取消復原
(29) 大於號 >:將選中的文字整體向右縮排一次
(30) 小於號 <:將選中的文字整體向左縮排一次
(31) :w 儲存
(32) :w! 強制儲存
(33) :q 退出
(34) :q! 強制退出
(35) :wq 儲存並退出
(36) :set paste 設定成貼上模式,取消程式碼自動縮排
(37) :set nopaste 取消貼上模式,開啟程式碼自動縮排
(38) :set nu 顯示行號
(39) :set nonu 隱藏行號
(40) gg=G:將全文程式碼格式化
(41) :noh 關閉查詢關鍵詞高亮
(42) Ctrl + q:當vim卡死時,可以取消當前正在執行的命令
例外處理:
每次用vim編輯檔案時,會自動建立一個.filename.swp的臨時檔案。
如果開啟某個檔案時,該檔案的swp檔案已存在,則會報錯。此時解決辦法有兩種:
(1) 找到正在開啟該檔案的程式,並退出
(2) 直接刪掉該swp檔案即可
在開啟檔案儲存後,:%!g++ main.c && ./a.out 直接編譯執行
:!% + x, x可以為任意命令,!%可以對vim的整個buffer呼叫命令列,並替換當前的buffer(用grep 過濾)
編輯二進位制唯讀檔案a.out,vim a.out; 然後修改指定位置字元后,:%!xxd 二進位制格式開啟, 修改後 :%!xxd -r 退出二進位制編輯
:w !sudo tee % 強制寫入
定義變數
定義變數,不需要加$符號,例如:
name1='svicen' # 單引號定義字串
name2="svicen" # 雙引號定義字串
name3=svicen # 也可以不加引號,同樣表示字串
使用變數
使用變數,需要加上$符號,或者${}符號。花括號是可選的,主要為了幫助直譯器識別變數邊界。
name=svicen
echo $name # 輸出svicen
echo ${name} # 輸出svicen
echo ${name}a # 輸出svicena
唯讀變數
使用readonly或者declare可以將變數變為唯讀。
name=svicen
readonly name
declare -r name # 兩種寫法均可
name=abc # 會報錯,因為此時name唯讀
刪除變數
unset可以刪除變數。
name=svicen
unset name
echo $name # 輸出空行
變數型別
自定義變數(區域性變數)
子程序不能存取的變數
環境變數(全域性變數)
子程序可以存取的變數
自定義變數改成環境變數:
acs@9e0ebfcd82d7:~$ name=svicen# 定義變數
acs@9e0ebfcd82d7:~$ export name # 第一種方法
acs@9e0ebfcd82d7:~$ declare -x name # 第二種方法
環境變數改為自定義變數:
acs@9e0ebfcd82d7:~$ export name=svicen# 定義環境變數
acs@9e0ebfcd82d7:~$ declare +x name # 改為自定義變數
shutdown -h now --立刻關機
shutdown -h 1 --1分鐘後關機
shutdown -r now --立刻重啟
halt --關機,作用同上
reboot --重啟,作用同上
sync --把記憶體的資料同步到磁碟
useradd -d /home 使用者名稱 --新增使用者,目錄在home下(不新增預設home),預設建一個與其同名的使用者組
passwd 使用者名稱 輸入密碼即可 --為新使用者設定密碼
id 使用者名稱 --檢視使用者所屬組
userdel 使用者名稱 --刪除使用者,但是保留家目錄
userdel -r 使用者名稱 --刪除使用者,同時刪除家目錄
whoami --檢視當前使用者資訊
groupadd 使用者組名 --新增使用者組
groupdel 使用者組名 --刪除使用者組
useradd -g 組名 使用者名稱 --新增使用者的同時將其加入指定組
使用者組相關檔案
/etc/passwd檔案
使用者的組態檔,記錄使用者各種 資訊
每行的含義:使用者名稱:口令:使用者標識號:組標識號:註釋性描述:主目錄:登入shell
/etc/shadow檔案
口令的組態檔
每行的含義:登入名:加密口令:最後一次修改時間:最小時間間隔:最大時間間隔:警告時間:不活動時間:失效時間:標誌
/etc/group檔案
組的組態檔,記錄Linux包含的組的資訊
每行含義:組名:口令:組標識號:組內使用者列表
執行級別0:系統停機狀態,系統預設執行級別不能設為0,否則不能正常啟動
執行級別1:單使用者工作狀態,root許可權,用於系統維護,禁止遠端登陸
執行級別2:多使用者狀態(沒有NFS),沒有網路連線。
執行級別3:完全的多使用者狀態(有NFS),登陸後進入控制檯命令列模式 最常用,Linux伺服器
執行級別4:系統未使用,保留
執行級別5:X11控制檯,登陸後進入圖形GUI模式
執行級別6:系統正常關閉並重啟,預設執行級別不能設為6,否則不能正常啟動
init 3 --切換執行級別
systemctl get-default --獲取當前執行級別
systemctl get-default mlti-user.target --設定為執行級別3
1、首先啟動系統,進入開機介面,在介面中按'e'進入編輯介面,注意要快 15s
2、進入編輯頁面,使用鍵盤上下鍵將遊標移動,找到以「Linux16」開頭的內容所在的行,在行的最後輸入:init=/bin/sh
3、輸入Ctrl+x啟動,進入單使用者模式
4、接著在遊標閃爍的位置輸入mount -o remount,rw / (各個單詞之間有空格),完成後按確認鍵
5、在新的一行輸入passwd ,按回車輸入密碼,然後再次確認密碼即可
6、接著,在滑鼠閃爍的位置(最後一行)插入:touch /.autorelabel(注意touch與/間有一個空格),完成後回車
7、繼續在遊標閃爍的位置,輸入:exec /sbin/init(exec與/之間有空格),完成後回車,等待即可,系統會自動重啟
幫助指令
man 命令 --獲得幫助資訊
ls -a --檢視所有檔案,包括隱藏檔案,linux下以.開頭的檔案為隱藏檔案
ls -l --單列顯示ls 還可以ls -la/ls -al
help --獲得shell內建命令的幫助資訊
pwd --顯示當前工作目錄的絕對路徑
cd ~ --家目錄
cd / --根目錄
mkdir --建立目錄 md /home/animal
mkdir -p --建立多級目錄 md -p /home/animal/dog
rmdir 目錄 --刪除空目錄 rm /home/animal
rmdir -rf 目錄 --遞迴刪除整個目錄 rm -rf /home/animal
cp 1.txt /test --拷貝檔案到指定目錄
cp -r /home/svicen /home/test --遞迴拷貝整個目錄到指定目錄,將svicen整個給test
\cp -r /home/svicen /home/test --遞迴拷貝,強制覆蓋原來的檔案
rm --刪除檔案或目錄 -r遞迴刪除整個資料夾 -f強制刪除不提示
mv test0 test01 --移動檔案與目錄或從重新命名 如果兩檔案在同一目錄則為重新命名
mv test /root/test01 --移動檔案並重新命名
mv /opt/bbb /home --移動整個目錄及其下的檔案
cat [-n] 檔名 --檢視檔案內容 -n 顯示行號
cat -n test | more --為了瀏覽方便,一般會加上 管道符|+more more往往是用來展示的
more -- 空格->向下翻一頁 回車->向下翻一行 q->離開more Ctrl+F->向下捲動一屏 Ctrl+B->向上一屏 :f->輸出檔名和當前行號
less 要檢視的檔案 --分配檢視檔案,與more類似,但並不是一次全部載入,根據顯示需要載入,效率更高
echo $PATH --輸出內容到控制檯
head -n 5 --顯示檔案前5行,預設顯示前10行
tail -n 5 --顯示後五行
taile -f 檔名 --監視制定檔案,如果其內內容發生變化,在此可以展示變化
重定向 > --覆蓋內容 >> --追加內容
ls -l /home > /home/info.txt --將home目錄下檔案以單列顯示方式寫入到info.txt中
ln -s 原始檔或目錄 軟連結名 --軟連線 ln -s /root /home/myroot -> 存取myroot就相當於存取root目錄
history --檢視歷史命令
!歷史命令編號 --可以執行歷史命令
date --顯示當前時間,年月日時分秒
date '+%Y-%m-%d' --顯示年月日,以-分隔 注意大小寫
date -s "2022-04-04 14:23:10" --設定系統日期
cal --檢視本月日曆 cal 2022 顯示2022整年的日曆
find /home -name hello.txt --在指定目錄下找著指定名的檔案
find /opt -user root | more --查詢指定目錄下使用者名稱稱為root的檔案
find / size +200M --查詢整個linux系統下大於200M的檔案 -200M為小於 預設為等於
ls -lh --按照人更直觀的方式顯示檔案大小
updatedb; locate 搜尋檔案 --可以快速定位檔案路徑 注意需要先寫 updatedb
cat 1.txt | grep -n "hello" --grep過濾查詢,管道符| 表示將前一個命令的結果傳遞給後面的命令處理
grep -n "hello" /home/1.txt --與上相同
gzip /home/hello.txt --壓縮檔案
gunzip /home/hello.txt.gz --解壓檔案
zip --壓縮檔案或資料夾,在專案打包釋出中很有用
zip -r myhome.zip /home/ --將home及home目錄下的所有檔案及資料夾都壓縮 -r 遞迴壓縮
unzip --解壓縮檔案/資料夾
unzip -d /opt/tmp /home/myhome.zip --解壓到opt/tmp資料夾下
tar --打包命令,最後打包好的是.tar.gz檔案
-c 產生.tar打包檔案 -V 顯示詳細資訊 -f 指定壓縮後檔名 -z 打包同時壓縮 -x 解壓.tar檔案
tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt 多個檔案壓縮為pc.tar.gz
tar -zxvf pc.tar.gz -C opt/tmp --解壓縮到指定目錄opt/tmp
對於linux的檔案,有三個概念所有者,所在組,其他組
所有者-誰建立的誰為所有者 檢視檔案所有者ls -ahl 或者 ll
組的建立 groupadd 當一個使用者建立一個檔案時,該檔案所屬的組就是該使用者所屬的組
chgrp 組名 檔名 --修改檔案所在組
其他組 --除了所在組及所有者,系統的其他使用者所在組都是其他組
usermod -g 新組名 使用者名稱 --修改使用者所在組
usermod -d 目錄名 使用者名稱 --改變使用者初始目錄, 前提使用者需要有進入到該目錄的許可權
最左邊一列有10位
1.第0位確定檔案型別(d是目錄,l是連結,b是塊裝置,硬碟 -是普通檔案 c是字元裝置檔案,滑鼠鍵盤)
2.第1-3為確定所有者(該檔案的所有者)擁有該檔案的許可權 ---User
3.第4-6位確定所屬組擁有該檔案的許可權 --group
4.第7-9位確定其他使用者擁有該檔案的許可權 --other
左數第二列的數位:檔案即為1,為目錄即其子目錄數與子檔案總和
左數第三四列:檔案所有者 和 檔案所在組
左數第五列:檔案大小按位元組數
左數第六列:最近修改日期
rwx作用詳解
1.[r]代表read,可以讀取,檢視
2.[w]代表write,可以修改,但是不一定可以刪除該檔案,刪除一個檔案的前提是對該檔案所在的目錄有寫許可權。
3.[x]代表execute,可以執行
r=4,w=2,x=1 因此 rwx=4+2+1=7
1.[r]代表read,可以讀取,ls檢視目錄內容
2.[w]代表write,可以修改,對目錄內建立檔案、刪除檔案,重新命名目錄
3.[x]代表execute,可以進入該目錄,但不可以ls
chmod修改檔案或目錄的許可權 u-所有者 g-所有組 o-其他 a-所有人
第一種方式:+ - = 變更許可權
chmod u=rwx,g=rx,o=x 檔案/目錄名
chmod o+w 檔案/目錄名 --給檔案的其他使用者賦予修改許可權
chmod a-x 檔案/目錄名 --對所有人去掉可執行許可權
第二種方式:通過數位變更許可權 r=4,w=2,x=1
chmod u=rwx,g=rx,o=x abc 相當於 chmod 751 abc
修改檔案所有者-chown
chown newowner 檔案/目錄 --改變檔案所有者為王newowner
chown -R newowner /home/test --遞迴改變檔案和其目錄下所有檔案的所有者為newowner
修改檔案/目錄所在組chgrp
chgrp newgroup 檔案/目錄 --改變所在組
chgrp -R newgroup /home/test --遞迴修改test目錄下所有檔案的所在組為newgroup
對於目錄
1.被賦予x執行許可權的使用者,該使用者可以進入目錄,但不能讀取目錄,不能使用ls,但是對於該目錄下的檔案該擁有的許可權還是有的
可以修改或讀取有指定許可權的檔案 1.txt的內容因此被修改
2.賦予w寫許可權的使用者,可以對該目錄下的檔案進行建立、修改 --可以把目錄看成檔案 一切皆檔案
3.賦予r讀許可權的使用者,可以在進入該目錄後ls,但只賦予讀許可權是不能進入檔案目錄的
-e 編輯crontab定時任務
-l 列出當前有哪些crontab任務
-r 刪除當前使用者所有的crontab任務
*/1****ls -l /etc/ > /tmp/to.txt
意思是每小時的每分鐘執行ls -l /etc/ > /tmp/to.txt目錄
專案 | 含義 | 範圍 |
---|---|---|
第一個* | 一小時當中的第幾分鐘 | 0-59 |
第二個* | 一天當中的第幾小時 | 0-23 |
第三個* | 一個月當中的第幾天 | 1-31 |
第四個* | 一年當中的第幾月 | 1-12 |
第五個* | 一週當中的星期幾 | 0-7(0和7都代表星期日) |
crontab -e --編輯定時任務
特殊符號 | 含義 |
---|---|
* | 代表任何時間 |
, | 代表不連續的時間,比如"0 8,12,16 * * *"命令代表在每天的8點0分,12點0分,16點0分都執行一次命令 |
- | 代表連續的時間範圍,比如"0 5 * * 1-6"命令代表在週一到週六的凌晨5點0分執行命令 |
*/n | 代表每隔多久執行一次,比如"* /10* * * *"命令代表每隔10分鐘執行一次命令 |
0 0 1,15 * 1 命令表示每月1號和15號且是週一的凌晨0點0分執行命令,注意星期幾和幾號最好不要同時寫
基本介紹
1.at命令是一次性定時任務,at的守護行程atd會以後臺模式執行,檢查作業佇列來執行
2.預設情況下,atd守護行程每60秒檢查作業佇列,有作業時,會檢查作業執行時間,如果時間與當前時間匹配,則執行該作業
3.at命令是一次性定時任務,執行完一個任務後便不再執行
4.在使用at命令時,一定要保證atd程序的啟動,可以使用相關指令來檢視 ps -ef | grep atd
at命令格式
at [選項] [時間] 寫完後兩次Ctrl + D代表輸入結束
at now + 2 minutes
>at date > /home/mydate.log 兩分鐘後執行該命令,先要將at服務啟動sudo /etc/init.d/atd start
at 5pm tomorrow
>at /bin/sh ls /home 明天下午5點用sh執行ls命令
at 5pm + 2 days
>at /root/my.sh 兩天後5點執行指令碼my.sh,前提指令碼存在且有執行許可權
atrm 2 刪除任務佇列號為2的任務
atq 檢視當前任務佇列
分割區的方式
Linux分割區
硬碟說明
掛載的經典案例
虛擬機器器新增硬碟 ---設定->硬碟->新增
分割區:fdsk /dev/sdb -- 設定分割區號 Ctrl + backspace 刪除 回車確認 命令哪裡輸入w 寫入並退出
格式化:mkfs -t ext4 /dev/sdb1 格式化後就有了UUID號
掛載:新建目錄:mkdir /home/newdisk;掛載:mount /dev/sdb1 /home/newdisk
命令列下掛載,重啟命令列便無效了
設定可以自動掛載(永久掛載):重啟系統後,仍然可以掛載。vim etc/fstab 增加掛載資訊賦值修改 UUID或者在UUID的位置寫裝置名/dev/sdb1,之後輸入mount -a或reboot生效
磁碟情況查詢:df -h / df -l
查詢指定目錄的磁碟佔用情況:du -h /目錄,預設為當前目錄
範例:du -hac --max-depth=1 /opt
磁碟情況-工作實用指令
統計/home資料夾下檔案的個數:ls -l /home | grep "^-" | wc -l
以 - 開頭的為檔案
統計/home資料夾下目錄的個數:ls -l /home | grep "^d" | wc -l
以 d 開頭的為資料夾
統計/home資料夾下檔案的個數,包括子資料夾裡的:ls -lR /home | grep "^-" | wc -l
統計資料夾下目錄的個數,包括子資料夾裡的:ls -lR /home | grep "^d" | wc -l
以樹狀顯示目錄結構:首先安裝tree指令:yum install tree,tree /home
tree /home -d --僅列出目錄 tree -l 不給出指定目錄則為當前目錄
指定固定IP:直接修改組態檔來指定IP,並可以連線到外網,編輯:vim /etc/sysconfig/network-scripts/ifcfg-eth0
修改:靜態分配IP:BOOTPROTO="static"
IP地址:IPADDR=192.168.1.100
閘道器:GATEWAY = 192.168.200.2
DNS域名解析器DNS1=192.168.200.2
接著開啟虛擬機器器,編輯->虛擬網路編輯器->Vmnet8 -> 下的子網IP改為 192.168.200.1 與網路卡和DNS解析器在同一網段
同時在虛擬網路編輯器下 - > NAT設定 -> 修改閘道器IP為 192.168.200.2
重啟網路服務:service network restart
設定主機名和hosts對映
在Windows下 C:\Windows\System32\drivers\etc\hosts
在Linux下 在/etc/hosts檔案指定 寫上 IP地址 和 主機名對映 即可
主機名解析機制
1.瀏覽器先檢查瀏覽器快取中有沒有該域名解析IP地址,有就先呼叫這個IP完成解析,如果沒有則檢查DNS解析器快取,如果有直接返回IP完成解析。 這兩個快取可以理解為本地解析器快取。
2.一般來說,當電腦第一次成功存取某一網站後,在一定時間內,瀏覽器或作業系統會快取他的IP地址(DNS解析記錄)
ipconfig /displaydns //DNS域名解析快取
ipconfig /flushdns //手動清理DNS快取
3.如果本地解析器快取沒有找到對應對映,檢查系統中hosts檔案中有沒有設定對應的域名IP對映,有則完成解析
4.如果本地DNS解析器快取和hosts檔案中均沒有找到對應IP則到DNS伺服器進行解析
在Linux中,每個執行的程式(程式碼)都稱為一個程序。每個程序都分配一個ID號
每一個程序,都會對應一個父程序,而這個父程序可以複製多個子程序。例如www伺服器。
每個程序都可能以兩種方式存在:前臺和後臺。
一般系統的服務都是以後臺程序的方式存在,而且都會常駐在系統中,直到關機才結束。
顯示系統執行的程序
ps:檢視目前系統中,有哪些正在執行,以及它們執行的狀況。可以不加任何引數。PID:程序識別號;TTY:終端機號;TIME:此程序所消耗的CPU時間;CMD:正在執行的命令或程序名; RSS:佔實體記憶體的情況 VSZ: 佔虛擬記憶體的情況
STAT:程序狀態,S-睡眠 R-正在執行 D-短期等待 Z-僵死程序,需要定時清除 T-被跟蹤或者被停止
ps -a:顯示當前終端的所有程序資訊。
ps -u:以使用者的格式顯示程序資訊。
ps -x:顯示後臺程序執行的引數。
ps -axu | grep xxx:過濾得到xxx的資訊。 ps -axu | grep sshd
ps -ef:以全格式顯示當前所有的程序,檢視程序的父程序PPID。
-e:顯示所有程序。
-f:全格式。
終止程序
kill [選項] 程序號:通過程序號殺死程序
killall 程序名稱:通過程序名稱殺死程序,也支援萬用字元,這在系統因負載過大而變得很慢時很有用
-9:表示強迫程序立刻停止
案例1:踢掉非法使用者:kill 程序號
案例2:終止遠端登入服務sshd,在適當時候再次重啟sshd服務
kill sshd對應的程序號; /bin/systemctl start sshd.service --重啟sshd服務
案例3:終止多個gedit編輯器:killall 程序名稱
killall gedit
案例4:強制殺掉一個終端:kill -9 程序號 對於正在執行的終端直接kill 程序號 系統會認為是誤操作
檢視程序樹:pstree [選項]
服務(service)管理
service管理指令:service 服務名 [start | stop | restart | reload | status]
在CentOS7.0之後,不再使用service,而是systemctl,被service管理的服務主要是/etc/init.d下的服務
service network stop --停止網路服務 service network start --啟動網路服務
檢視防火牆情況:
測試某個埠是否在監聽:telnet
檢視服務名:
方式1:使用setup->系統服務就可以看到
前面帶*的為自啟動的,遊標停在上面按空格可以取消自啟動 按tab退出
方式2:/etc/init.d/服務名稱 ls -l /etc/init.d --檢視init.d下的服務名稱
服務的執行級別(runlevel):
檢視或修改預設級別:systemctl get-default --檢視當前服務級別 systemctl set-default multi-user. target
vim /etc/inittab
每個服務對應的每個執行級別都可以設定
如果不小心將預設的執行級別設定成0或者6,怎麼處理?
chkconfig:可以給每個服務的各個執行級別設定自啟動/關閉 ---不適用於Ubuntu系統可用 sudo apt-get install sysv-rc-conf
檢視xxx服務:chkconfig –list | grep xxx
檢視服務的狀態:chkconfig 服務名 --list
給服務的執行級別設定自啟動:chkconfig –level 5 服務名 on/off
要所有執行級別關閉或開啟:chkconfig 服務名 on/off
應用範例檢視防火牆狀況,關閉和重啟防火牆
wsl2裡面沒有
systemd
命令,我們需要用sudo /etc/init.d/docker start
代替sudo systemctl start docker
systemctl stop firewalld systemctl start firewalld 臨時生效
systemctl is-enabled firewalld --判斷是否是自啟動 systemcal disable firewalld --設定為開機不自啟動
注:上面兩個命令對於Centos 7 以後的系統的3和5執行級別同時生效
firewall指令
動態監控程序
top [選項]
top和ps命令很相似。它們都用來顯示正在執行的程序。top和ps最大的不同之處在於top在執行一段時間可以更新正在執行的程序。
-d 秒數:指定top命令每隔幾秒更新。預設是3秒。
-i:使top不顯示任何閒置或者僵死程序。
-p:通過指定監控程序ID來僅僅監控某個程序的狀態。
案例1:監控特定使用者:top檢視程序;u輸入使用者名稱。
top ; u ; 輸入使用者: Tom
案例2:終止指定的程序:top檢視程序;k輸入要結束的程序。
案例3:指定系統狀態更新的時間(每隔10秒自動更新,預設是3秒):top -d 10
互動操作說明:
監控網路狀態
RPM:RedHat Package Manager,紅帽軟體包管理工具。
RPM查詢已安裝的rpm列表:rpm -qa | grep xx
範例:檢視當前系統是否安裝Firefox:rpm -qa | grep firefox
rpm包的其它查詢指令:
解除安裝rpm包:rpm -e 軟體包名稱 強制刪除 rpm -e --nodeps foo
刪除時可能會發生依賴錯誤,忽視依賴強制刪除的方法:rpm -e --nodeps 軟體包名稱
安裝rpm包:rpm -ivh 軟體包全路徑名稱
vim hello.sh
#!/bin/bash(zsh)
echo "helloworld!"
指令碼的常用執行方式
Shell的變數
變數分為:系統變數和使用者自定義變數
shell變數的定義
案例
定義變數A
vim var.sh
#!/bin/bash(zsh)
A=100
echo $A # ./var.sh --100
echo A=$A # ./var.sh --A=100
echo "A=$A" # ./var.sh --A=100
復原變數
unset A
宣告靜態變數
readonly B=2 # 還可以 declare -r B 宣告為唯讀變數
echo "B=$B"
#unset B --不可以unset B
#顯示行號 :nu
shell變數命名規則
將命令的返回值賦給變數
A=`date` #反引號,執行裡面的命令,並把結果返回給變數A
A=$(date) #等價於反引號
設定環境變數
export 變數名=變數值 #功能描述:將shell變數輸出為環境變數/全域性變數
source 組態檔 #功能描述:讓修改後的設定資訊立即生效
echo $變數名 #功能描述:查詢環境變數的值
快速入門
#1.在/etc/profile檔案中定義TOMCAT_HOME環境變數
tomcat位於/opt/ 檔案目錄下
vim /etc/profile
export TOMCAT_HOME=/opt/tomcat
sourse /etc/profile
#2.檢視環境變數的值
echo $TOMCAT_HOME
#3.在另外一個shell程式中使用TOMCAT_HOME
vim var.sh
echo "tomcat_home=$TOMCAT_HOME"
:<<!
多行註釋
!
位置引數變數
當我們執行一個shell指令碼時,如果希望獲取到命令列的引數資訊,就可以使用到未知引數變數
基本語法
案例:
編寫一個shell指令碼,position.sh,在指令碼中獲取到命令列的各個引數資訊
預定義變數
就是shell設計者事先已經定義好的變數,可以直接在shell指令碼中使用
運運算元
基本語法
範例
計算(2+3)*4的值
vim operator.sh
#!bin/bash
#第一種方式:
RES1=$(((2+3)*4))
echo "res1=$RES1"
#第二種方式
RES2=$[(2+3)*4]
echo "res2=$RES2" #推薦使用
#第三種方式
TEMP=`expr 2 + 3` #注意要用空格,否則輸出結果為 2+3
RES3=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res3=$RES3"
求出命令列的兩個引數[整數]的和 20 50
SUM=$[$1+$2]
echo "sum=$SUM"
然後再命令列輸入 ./operator.sh 20 50 --輸出結果 sum=70
條件判斷
基本語法
if [ condition ] (注意condition前後要有空格) 非空返回true,可使用$?驗證(0為true,>1為false)
範例
[ abc ] --返回true [] --返回false [ condition ] && echo ok || echo notok 條件滿足執行後邊的語句
判斷語句
常用判斷條件
1)= 字串比較,判斷兩個字串是否相等
2)兩個整數的比較
-lt 小於
-le 小於等於
-eq 等於
-gt 大於
-ge 大於等於
-ne 不等於
3)按照檔案許可權劃分
-r 有讀的許可權
-w 有寫的許可權
-x 有執行的許可權
4)按照檔案型別劃分
-f 檔案存在並且是一個常規檔案
-e 檔案存在
-d 檔案存在並是一個目錄
應用範例
vim ifdemo.sh
#!bin/bash
#案例1:判斷"ok"是否等於"ok"
if [ "ok" = "ok" ]
then
echo "equal"
fi
#案例2:23是否大於等於22
if [ 23 -ge 22 ]
then
echo "大於"
fi
#案例3:/root/shcode/aaa.txt 判斷目錄中的檔案是否存在
if [ -f /root/shcode/aaa.txt ]
then
echo "存在"
fi
流程控制
多分支語句
案例:如果輸入的引數大於60,則輸出及格了,否則輸出不及格
#!/bin/bash
if [ $1 -ge 60 ]
then
echo "及格了"
elif [ $1 -lt 60 ]
then
echo "不及格"
case語句
#!/bin/bash
case $1 in
"1")
echo "週一"
;;
"2")
echo "週二"
;;
"3")
echo "週三"
;;
*)
echo "Other.."
;;
esac
for語句
vim testFor1.sh
#!/bin/bash
#基本語法1
<< comment
for 變數 in 值1 值2 值3...
do
程式主程式碼
done
comment
#案例1:列印命令列輸入的引數
for i in "$*" # $*把所有的引數看成一個整體
do
echo "num is $i" #這裡只會輸出一句話
done
for j in "$@" #$@把每個引數區分對待
do
echo "num is $j"
done
#基本語法2
for ((初始值;迴圈控制條件;變數變化))
do
主程式程式碼
done
#案例2:從1到100的值累加顯示
SUM=0
for ((i=1; i<=100; i++))
do
SUM=$[$SUM+$I]
done
echo "sum=$SUM"
while語句
while [ 條件判斷式 ]
do
程式
done
vim testWhile.sh
#!/bin/bash
#案例1:從命令列輸入一個引數n,統計1+2+..+n
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
# i自增
i=$[$i+1]
done
echo "結果=$SUM"
read獲取控制檯輸入
read(選項)(引數)
選項:
-p:指定讀取值時的提示符
-t:指定讀取值時等待的時間(秒),如果沒有在指定時間內輸入,就不再等待了
引數:變數:指定讀取值的變數名
#範例:testRead.sh
#案例1:讀取控制檯輸入一個num值
#!/bin/bash
read -P "請輸入一個數num=" NUM1
echo "你輸入的num=$NUM1"
#案例2:讀取控制檯輸入一個num值,在10秒內輸入
read -t 10 -P "請輸入一個數num=" NUM2
echo "你輸入的num=$NUM2"
函數
系統函數
basename:功能為返回完整路徑的最後/的部分,常用於獲取檔名
basename [pathname] [suffix] (選項suffix為字尾,如果suffix被指定了,basename會將pathname或string的suffix去掉)
basename [string] [suffix] (功能:basename命令後會刪掉所有的字首包括最後一個/字元,然後將字串顯示出來)
#案例1:返回/home/aaa/test.txt的"test.txt"部分
basename /home/aaa/test.txt --test.txt
basename /home/aaa/test.txt .tst --test
dirname:功能為返回完整路徑最後/的前面部分,常用於返回路徑部分
dirname /home/aaa/test.txt --/home/aaa
自定義函數
function funname ()
{
Action;
[return int;]
}
#呼叫時直接寫函數名:funname [引數值]
#案例1:計算輸入的兩個引數的和(動態獲取)
vim testFunc.sh
#!/bin/bash
#定義函數
function getSum(){
SUM=$[$n1+$n2]
echo "和=$SUM"
}
#控制檯輸入兩個值
read -P "請輸入一個數n1=" n1
read -P "請輸入一個數n2=" n2
#呼叫
getSum $n1 $n2
expr
表示式說明:
用空格隔開每一項
用反斜槓放在shell特定的字元前面(發現表示式執行錯誤時,可以試試跳脫)
對包含空格和其他特殊字元的字串要用引號括起來
expr會在stdout中輸出結果。如果為邏輯關係表示式,則結果為真,stdout為1,否則為0。
expr的exit code:如果為邏輯關係表示式,則結果為真,exit code為0,否則為1。
字串表示式
length STRING
返回STRING的長度
index STRING CHARSET
CHARSET中任意單個字元在STRING中最前面的字元位置,下標從1開始。如果在STRING中完全不存在CHARSET中的字元,則返回0。
substr STRING POSITION LENGTH
返回STRING字串中從POSITION開始,長度最大為LENGTH的子串。如果POSITION或LENGTH為負數,0或非數值,則返回空字串。
範例:
str="Hello World!"
echo `expr length "$str"` # ``不是單引號,表示執行該命令,輸出12
echo `expr index "$str" aWd` # 輸出7,下標從1開始
echo `expr substr "\$str" 2 3` # 輸出 ell
整數表示式
expr
支援普通的算術操作,算術表示式優先順序低於字串表示式,高於邏輯關係表示式。
+ -
加減運算。兩端引數會轉換為整數,如果轉換失敗則報錯。
* / %
乘,除,取模運算。兩端引數會轉換為整數,如果轉換失敗則報錯。
() 可以改變優先順序,但需要用反斜槓跳脫
邏輯關係表示式
或運運算元 |
如果第一個引數非空且非0,則返回第一個引數的值,否則返回第二個引數的值,但要求第二個引數的值也是非空或非0,否則返回0。如果第一個引數是非空或非0時,不會計算第二個引數。
與運運算元 &
如果兩個引數都非空且非0,則返回第一個引數,否則返回0。如果第一個參為0或為空,則不會計算第二個引數。
比較運運算元 < <= = == != >= >
比較兩端的引數,如果為true,則返回1,否則返回0。」==」是」=」的同義詞。」expr」首先嚐試將兩端引數轉換為整數,並做算術比較,如果轉換失敗,則按字元集排序規則做字元比較。
() 可以改變優先順序,但需要用反斜槓跳脫
Shell程式設計綜合案例
需求分析:
1.每天凌晨``2:30備份資料庫
hspedu到
/data/backup/db`
2.備份開始和結束能夠給出相應的提示資訊
3.備份後的檔案要求以備份時間為檔名,並打包成.tar.gz
的形式,比如2021-04-10_104515.tar.gz
4.在備份的同時,檢查是否有10天前備份的資料庫檔案,如果有就將其刪除
#!/bin/bash
#備份目錄
BACKUP=/data/backup/db
#獲取當前時間
DATETIME=$(date +%Y-%m-%d_%H%M%S)
#資料庫的地址
HOST=localhost
#資料庫使用者名稱
DB_USER=root
#資料庫密碼
DB_PW=root
#備份的資料庫
DATABASE=hspedu
#建立備份目錄,如果不存在就建立,如果存在就直接使用
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}" #! -d 表示如果不是一個目錄 {}為可選的
#備份資料庫 -q -R表示若有多個資料庫都備份
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --datebases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
#將檔案處理成tar.gz形式
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME} # 將${DATETIME}壓縮為$DATETIME.tar.gz
#刪除備份的資料夾目錄及之下的檔案
rm -rf ${BACKUP}/${DATETIME}
#檢查是否有十天前備份的檔案,將其刪除
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \; #-atime +10 查詢十天前建立的備份檔案
echo "備份資料庫${DATABASE}成功"
#設定定時任務
crontab -e
30 2 * * * /usr/sbin/mysql_db_backup.sh(以上所寫指令碼檔案所在目錄)