常用命令
目錄相關
find 命令
- 查找指定文件名的文件(不區分大小寫):
find -iname "MyProgram.c"
。 - 對找到的文件執行某個命令:
find -iname "MyProgram.c" -exec md5sum {} \;
。 - 查找 home 目錄下的所有空文件:
find ~ -empty
。
? 【常用】如何在 /usr 目錄下找出大小超過 10MB 的文件?
-
輸入命令
find /usr -type f -size +10240k
命令。 -
輸出結果如下:
/usr/lib/locale/locale-archive /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64/jre/lib/amd64/server/classes.jsa /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64/jre/lib/amd64/server/libjvm.so /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64/jre/lib/rt.jar // ... 省略
另外,du 命令也可以做類似的事情,可以看看 《查找 Linux 系統中的佔用磁盤空間最大的前 10 個文件或文件夾》 文章。
? 如何在 /var 目錄下找出 90 天之內未被訪問過的文件?
- 輸入命令:
find /var \! -atime -90
。
? 如何在 /home 目錄下找出 120 天之前被修改過的文件?
- 輸入命令:
find /home -mtime +120
。
? 在整個目錄樹下查找文件 “core” ,如發現則無需提示直接刪除它們?
- 輸入命令:
find / -name core -exec rm {} \;
。
ls 命令
- 以易讀的方式顯示文件大小(顯示爲 MB,GB…):
ls -lh
。 - 以最後修改時間升序列出文件:
ls -ltr
。 - 在文件名後面顯示文件類型:
ls -F
。
pwd 命令
- 輸出當前工作目錄:
pwd
。
cd 命令
cd
:可以在最近工作的兩個目錄間切換。
mkdir 命令
- 在 home 目錄下創建一個名爲 temp 的目錄:
mkdir ~/temp
。 - 使用
-p
選項可以創建一個路徑上所有不存在的目錄:mkdir -p dir1/dir2/dir3/dir4/
。
df 命令
- 顯示文件系統的磁盤使用情況,默認情況下
df -k
將以字節爲單位輸出磁盤的使用量。 - 使用
df -h
選項可以以更符合閱讀習慣的方式顯示磁盤使用量。 - 使用
df -T
選項顯示文件系統類型。
rm 命令
- 刪除文件前先確認:
rm -i filename.txt
。 - 在文件名中使用 shell 的元字符會非常有用。刪除文件前先打印文件名並進行確認:
rm -i file*
。 - 遞歸刪除文件夾下所有文件,並刪除該文件夾:
rm -r example
。
mv 命令
- 將 file1 重命名爲 file2 ,如果 file2 存在則提示是否覆蓋:
mv -i file1 file2
。 -v
會輸出重命名的過程,當文件名中包含通配符時,這個選項會非常方便:mv -v file1 file2
。
cp 命令
- 拷貝 file1 到 file2 ,並保持文件的權限、屬主和時間戳:
cp -p file1 file2
。 - 拷貝 file1 到 file2 ,如果 file2 存在會提示是否覆蓋:
cp -i file1 file2
。
? 有一普通用戶想在每週日凌晨零點零分定期備份 /user/backup到 /tmp 目錄下,該用戶應如何做?
-
配置如下:
crontab -e 0 0 * * 7 /bin/cp /user/backup /tmp
- 點將 /tmp/logs 目錄下面的後綴爲 *.log 的所有文件 rsync 同步到備份服務器 192.168.1.100 中同樣的目錄下面
-
配置如下:
crontab -e 00 15 * * 1 rsync -avzP /tmp/logs/*.log [email protected]:/tmp/logs
相比來說,rsync
比 scp
的性能更好。具體可以看看 《scp 與 rsync 性能實測》 文章。
mount 命令
-
如果要掛載一個文件系統,需要先創建一個目錄,然後將這個文件系統掛載到這個目錄上:
# mkdir /u01 # mount /dev/sdb1 /u01
- 1
- 2
- 3
- 4
-
也可以把它添加到 fstab 中進行自動掛載,這樣任何時候系統重啓的時候,文件系統都會被加載:
/dev/sdb1 /u01 ext2 defaults 0 2
cat 命令
- 你可以一次查看多個文件的內容,下面的命令會先打印 file1 的內容,然後打印 file2 的內容:
cat file1 file2
。 -n
命令可以在每行的前面加上行號:cat -n /etc/logrotate.conf
。
? 如何看當前 Linux 系統有幾顆物理 CPU 和每顆 CPU 的核數?
[root@centos6 ~ 10:55 #35]# cat /proc/cpuinfo|grep -c 'physical id'
4
[root@centos6 ~ 10:56 #36]# cat /proc/cpuinfo|grep -c 'processor'
4
tail 命令
- tail 命令默認顯示文件最後的 10 行文本:
tail filename.txt
。 - 你可以使用
-n
選項指定要顯示的行數:tail -n N filename.txt
。 - 你也可以使用
-f
選項進行實時查看,這個命令執行後會等待,如果有新行添加到文件尾部,它會繼續輸出新的行,在查看日誌時這個選項會非常有用。你可以通過CTRL-C
終止命令的執行:tail -f log-file
。
less 命令
-
這個命名可以在不加載整個文件的前提下顯示文件內容,在查看大型日誌文件的時候這個命令會非常有用:
less huge-log-file.log
。 -
當你用 less 命令打開某個文件時,下面兩個按鍵會給你帶來很多幫助,他們用於向前和向後滾屏:
CTRL+F – forward one window CTRL+B – backward one window
通用命令
grep 命令
- 在文件中查找字符串(不區分大小寫):
grep -i "the" demo_file
。 - 輸出成功匹配的行,以及該行之後的三行:
grep -A 3 -i "example" demo_text
。 - 在一個文件夾中遞歸查詢包含指定字符串的文件:
grep -r "ramesh" *
。
sed 命令
- 當你將 Dos 系統中的文件複製到 Unix/Linux 後,這個文件每行都會以
\r\n
結尾,sed 可以輕易將其轉換爲 Unix 格式的文件,使用\n
結尾的文件:sed 's/.$//' filename
。 - 反轉文件內容並輸出:
sed -n '1!G; h; p' filename
。 - 爲非空行添加行號:
sed '/./=' thegeekstuff.txt | sed 'N; s/\n/ /'
。
? 用 sed 命令將指定的路徑 /usr/local/http 替換成爲 /usr/src/local/http ?
[root@centos7 ~]# echo "/usr/local/http/" | sed 's#/usr/local/#/usr/src/local/#'
- 1
- 2
? 打印 /etc/ssh/sshd_config 的第一百行?
sed -n '100p' /etc/ssh/sshd_config
? 用 sed 命令永久關閉防火牆?
[root@centos7 ~]# sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@centos7 ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
awk 命令
- 刪除重複行:
$ awk '!($0 in array) { array[$0]; print}' temp
。 - 打印
/etc/passwd
中所有包含同樣的 uid 和 gid 的行:awk -F ':' '$3=$4' /etc/passwd
。 - 打印文件中的指定部分的字段:
awk '{print $2,$5;}' employee.txt
。
可能會有胖友剛開始會懵逼,awk 和 sed 命令不是類似的麼,那麼就可以看看 《【總結】awk 與 sed 的區別》 。
? 打印 /etc/passwd 的 1 到 3 行?
-
使用 sed 命令:
[root@centos7 ~]# sed -n '1,3p' /etc/passwd root:x:0:0:root:/root:/bin/bash system:x:0:0::/home/system:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
-
使用 awk 命令:
[root@centos7 ~]# awk 'NR>=1&&NR<=3{print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash system:x:0:0::/home/system:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
vim 命令
- 打開文件並跳到第 10 行:
vim +10 filename.txt
。 - 打開文件跳到第一個匹配的行:
vim +/search-term filename.txt
。 - 以只讀模式打開文件:
vim -R /etc/passwd
。
diff 命令
貌似不太常用,當學習下。
- 比較的時候忽略空白符:
diff -w name_list.txt name_list_new.txt
。
sort 命令
貌似不太常用,當學習下。
- 以升序對文件內容排序:
sort names.txt
。 - 以降序對文件內容排序:
sort -r names.txt
。 - 以第三個字段對
/etc/passwd
的內容排序:sort -t: -k 3n /etc/passwd | more
。
? **
xargs 命令
- 將所有圖片文件拷貝到外部驅動器:
ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory
。 - 將系統中所有 jpg 文件壓縮打包:
find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
。 - 下載文件中列出的所有 url 對應的頁面:
cat url-list.txt | xargs wget –c
。
? 把當前目錄下所有後綴名爲 .txt 的文件的權限修改爲 777 ?
- 方式一,使用 xargs 命令:
find ./ -type f -name "*.txt" |xargs chmod 777
。 - 方式二,使用 exec 命令:
find ./ -type f -name "*.txt" -exec chmod 777 {}
。
壓縮相關
tar 命令
- 創建一個新的 tar 文件:
tar cvf archive_name.tar dirname/
。 - 解壓 tar 文件:
tar xvf archive_name.tar
。 - 查看 tar 文件:
tar tvf archive_name.tar
。
gzip 命令
- 創建一個
*.gz
的壓縮文件:gzip test.txt
。 - 解壓
*.gz
文件:gzip -d test.txt.gz
。 - 顯示壓縮的比率:
gzip -l *.gz
。
bzip2 命令
- 創建
*.bz2
壓縮文件:bzip2 test.txt
。 - 解壓
*.bz2
文件:bzip2 -d test.txt.bz2
。
unzip 命令
- 解壓
*.zip
文件:unzip test.zip
。 - 查看
*.zip
文件的內容:unzip -l jasper.zip
。
系統命令
export 命令
- 輸出跟字符串 oracle 匹配的環境變量:
export | grep ORCALE
。 - 設置全局環境變量:
export ORACLE_HOME=/u01/app/oracle/product/10.2.0
。
kill 命令
kill 用於終止一個進程。一般我們會先用 ps -ef
查找某個進程得到它的進程號,然後再使用 kill -9
進程號終止該進程。你還可以使用killall、pkill、xkill 來終止進程
艿艿:注意,
-9
表示強制終止指定進程。實際場景下,不會這麼做。但一般情況下,只需要
kill 進程編號
就可結束。
$ ps -ef | grep vim
ramesh 7243 7222 9 22:43 pts/2 00:00:00 vim
$ kill -9 7243
passwd 命令
- passwd 用於在命令行修改密碼,使用這個命令會要求你先輸入舊密碼,然後輸入新密碼:
passwd
。 - 超級用戶可以用這個命令修改其他用戶的密碼,這個時候不需要輸入用戶的密碼:
passwd USERNAME
。 - passwd 還可以刪除某個用戶的密碼,這個命令只有 root 用戶才能操作,刪除密碼後,這個用戶不需要輸入密碼就可以登錄到系統:
passwd -d USERNAME
。
su 命令
-
su 命令用於切換用戶賬號,超級用戶使用這個命令可以切換到任何其他用戶而不用輸入密碼:
su - USERNAME
。 -
用另外一個用戶名執行一個命令下面的示例中用戶 john 使用 raj 用戶名執行 ls 命令,執行完後返回 john 的賬號:
[john@dev-server]$ su - raj -c 'ls' [john@dev-server]$
- 1
- 2
- 3
- 4
-
用指定用戶登錄,並且使用指定的 shell 程序,而不用默認的:
su -s 'SHELLNAME' USERNAME
。
yum 命令
- 使用 yum 安裝 apache :
yum install httpd
。 - 更新 apache :
yum update httpd
。 - 卸載/刪除 apache :
yum remove httpd
。
rpm 命令
- 使用 rpm 安裝 apache :
rpm -ivh httpd-2.2.3-22.0.1.el5.i386.rpm
。 - 更新 apache :
rpm -uvh httpd-2.2.3-22.0.1.el5.i386.rpm
。 - 卸載/刪除 apache :
rpm -ev httpd
。
shutdown 命令
- 關閉系統並立即關機:
shutdown -h now
。 - 10 分鐘後關機:
shutdown -h +10
。 - 重啓:
shutdown -r now
。 - 重啓期間強制進行系統檢查:
shutdown -Fr now
。
crontab 命令
- 查看某個用戶的 crontab 配置:
crontab -u user -l
。 - 設置一個每十分鐘執行一次的計劃任務:
*/10 * * * * /home/ramesh/check-disk-space
。【前提是,在 crontab 下】
service 命令
- service 命令用於運行 System V init 腳本,這些腳本一般位於
/etc/init.d
文件下,這個命令可以直接運行這個文件夾裏面的腳本,而不用加上路徑。 - 查看服務狀態:
service ssh status
。 - 查看所有服務狀態:
service --status-all
。 - 重啓服務:
service ssh restart
。
另外,使用 chkconfig 命令,可以設置服務在系統啓動時,是否自動啓動。詳細的,見 《Linux 命令大全 —— chkconfig 命令》 文章。
chmod 命令
- chmod 用於改變文件和目錄的權限。
- 給指定文件的屬主和屬組所有權限(包括讀、寫、執行):
chmod ug+rwx file.txt
。 - 刪除指定文件的屬組的所有權限:
chmod g-rwx file.txt
。 - 修改目錄的權限,以及遞歸修改目錄下面所有文件和子目錄的權限:
chmod -R ug+rwx file.txt
。
chown 命令
- chown 用於改變文件屬主和屬組。
- 同時將某個文件的屬主改爲 oracle ,屬組改爲 db :
chown oracle:dba dbora.sh
。 - 使用
-R
選項對目錄和目錄下的文件進行遞歸修改:chown -R oracle:dba /home/oracle
。
uname 命令
- uname 可以顯示一些重要的系統信息,例如內核名稱、主機名、內核版本號、處理器類型之類的信息:
uname -a
。
whereis 命令
- 當你不知道某個命令的位置時可以使用 whereis 命令,下面使用 whereis 查找 ls 的位置:
whereis ls
。 - 當你想查找某個可執行程序的位置,但這個程序又不在 whereis 的默認目錄下,你可以使用
-B
選項,並指定目錄作爲這個選項的參數。下面的命令在/tmp
目錄下查找 lsmk 命令:whereis -u -B /tmp -f lsmk
。
locate 命令
- locate 命名可以顯示某個指定文件(或一組文件)的路徑,它會使用由 updatedb 創建的數據庫。
- 下面的命令會顯示系統中所有包含 crontab 字符串的文件:
locate crontab
。
另外,胖友如果使用 CentOS 找不到 locate 命令,可以看看 《CentOS 系統找到 locate 命令及 locate 搜索不到存在的文件》 文章。
man 命令
-
顯示某個命令的 man 頁面:
man crontab
。 -
些命令可能會有多個 ma n頁面,每個 man 頁面對應一種命令類型:
man SECTION-NUMBER commandname
。 -
命令類型:
-
man 頁面一般可以分爲 8 種命令類型。
-
- 用戶命令
-
- 系統調用
-
- c 庫函數
-
- 設備與網絡接口
-
- 文件格式
-
- 遊戲與屏保
-
- 環境、表、宏
-
- 系統管理員命令和後臺運行命令
-
-
例如,我們執行
whatis crontab
,你可以看到 crontab 有兩個命令類型 1 和 5 ,所以我們可以通過下面的命令查看命令類型 5 的 man 頁面:$ whatis crontab crontab (1) - maintain crontab files for individual users (V3) crontab (5) - tables for driving cron $ man 5 crontab
-
網絡相關
ifconfig 命令
- ifconfig 用於查看和配置 Linux 系統的網絡接口。
- 查看所有網絡接口及其狀態:
ifconfig -a
。 - 使用 up 和 down 命令啓動或停止某個接口:
ifconfig eth0 up
和ifconfig eth0 down
。
? 用一條命令顯示本機 eth0 網卡的 IP 地址,不顯示其它字符?
-
輸入命令任一一個命令即可:
# 方法一: ifconfig eth0|grep inet|awk -F ':' '{print $2}'|awk '{print $1}' # 方法二 ifconfig eth0|grep "inet addr"|awk -F '[ :]+' '{print $4}' # 方法三: ifconfig eth0|awk -F '[ :]+' 'NR==2 {print $4}' # 方法四: ifconfig eth0|sed -n '2p'|sed 's#^.*addr:##g'|sed 's# Bc.*$##g' # 方法五: ifconfig eth0|sed -n '2p'|sed -r 's#^.*addr:(.*) Bc.*$#\1#g' # 方法六(CENTOS7 也適用): ip addr|grep eth0|grep inet|awk '{print $2}'|awk -F '/' '{print $1}'
ping 命令
- ping 一個遠程主機,只發 5 個數據包:
ping -c 5 gmail.com
。
? 如何禁止服務器被 ping ?
[root@node0 ~]# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all // 這個時候,別人是可以 ping 通自己的
[root@node1 ~]# ping 192.168.6.6
PING 192.168.6.6 (192.168.6.6) 56(84) bytes of data.
64 bytes from 192.168.6.6: icmp_seq=1 ttl=64 time=1.79 ms
64 bytes from 192.168.6.6: icmp_seq=2 ttl=64 time=0.597 ms
[root@node0 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
[root@node1 ~]# ping 192.168.6.6 // ping 不能了
PING 192.168.6.6 (192.168.6.6) 56(84) bytes of data.
--- 192.168.6.6 ping statistics ---
93 packets transmitted, 0 received, 100% packet loss, time 92168ms
curl 命令
如果我們使用 ping 測試某個地址是否能連接,那麼 curl 測試用個 URL 是否可以訪問。
? 寫出一個 curl 命令,訪問指定服務器 61.135.169.121 上的如下 URL :http://www.baidu.com/s?wd=test ,訪問的超時時間是 20 秒
- 輸入命令
curl --connect-timeout 20 http://61.135.169.121/s?wd=test
。
wget 命令
- 使用 wget 從網上下載軟件、音樂、視頻:
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.1.tar.gz
。 - 下載文件並以指定的文件名保存文件:
wget -O taglist.zip http://www.vim.org/scripts/download_script.php?src_id=7701
。
ftp 命令
-
ftp 命令和 sftp 命令的用法基本相似。
-
連接 ftp 服務器並下載多個文件:
$ ftp IP/hostname ftp> mget *.html
-
顯示遠程主機上文件列表:
ftp> mls *.html - /ftptest/features.html /ftptest/index.html /ftptest/othertools.html /ftptest/samplereport.html /ftptest/usage.html
ssh 命令
- 登錄到遠程主機:
ssh [email protected]
。 - 顯示 ssh 客戶端版本:
ssh -V
。
##【重要】服務器狀態相關
通過如下命令,我們可以知道 Linux 服務器運行情況,從而可以排查性能的情況。
因爲我們是每小節一個命令,胖友後面可以看看 《Linux 性能分析工具介紹(CPU,內存,磁盤 I/O,網絡)》 文章,它將本小節的命令,又做了一次歸類,和介紹。所以,可以結合着一起讀讀。
ps 命令
- ps 命令用於顯示正在運行中的進程的信息。
- 查看當前正在運行的所有進程:
ps -ef | more
。 - 以樹狀結構顯示當前正在運行的進程,H 選項表示顯示進程的層次結構:
ps -efH | more
。
? 查看後臺所有 java 進程?
- 方式一:
ps -ef |grep java
。 - 方式二:
jps -m
。
uptime 命令
這個命令可以快速查看機器的負載情況。在 Linux 系統中,這些數據表示等待 CPU 資源的進程和阻塞在不可中斷 IO 進程(進程狀態爲 D)的數量。這些數據可以讓我們對系統資源使用有一個宏觀的瞭解。
命令的輸出分別表示 1 分鐘、5 分鐘、15 分鐘的平均負載情況。通過這三個數據,可以瞭解服務器負載是在趨於緊張還是趨於緩解。
- 如果 1 分鐘平均負載很高,而 15 分鐘平均負載很低,說明服務器正在命令高負載情況,需要進一步排查 CPU 資源都消耗在了哪裏。
- 反之,如果 15 分鐘平均負載很高,1 分鐘平均負載較低,則有可能是 CPU 資源緊張時刻已經過去。
- 上面例子中的輸出,可以看見最近 1 分鐘的平均負載非常高,且遠高於最近 15 分鐘負載,因此我們需要繼續排查當前系統中有什麼進程消耗了大量的資源。可以通過下文將會介紹的 vmstat、mpstat 等命令進一步排查。
另外,還有一個 《Linux 命令大全 —— w 命令》 ,也是使用比較方便的,快速查看系統負載情況的命令。
dmesg 命令
該命令會輸出系統日誌的最後 10 行。示例中的輸出,可以看見一次內核的 oom kill 和一次 TCP 丟包。這些日誌可以幫助排查性能問題。千萬不要忘了這一步。
vmstat 命令
vmstat 命令,每行會輸出一些系統核心指標,這些指標可以讓我們更詳細的瞭解系統狀態。後面跟的參數 1 ,表示每秒輸出一次統計信息,表頭提示了每一列的含義,這幾介紹一些和性能調優相關的列:
- r:等待在 CPU 資源的進程數。這個數據比平均負載更加能夠體現 CPU 負載情況,數據中不包含等待 IO 的進程。如果這個數值大於機器 CPU 核數,那麼機器的 CPU 資源已經飽和。
- free:系統可用內存數(以千字節爲單位),如果剩餘內存不足,也會導致系統性能問題。下文介紹到的 free 命令,可以更詳細的瞭解系統內存的使用情況。
- si,so:交換區寫入和讀取的數量。如果這個數據不爲 0 ,說明系統已經在使用交換區(swap),機器物理內存已經不足。
- us, sy, id, wa, st:這些都代表了 CPU 時間的消耗,它們分別表示用戶時間(user)、系統(內核)時間(sys)、空閒時間(idle)、IO等待時間(wait)和被偷走的時間(stolen,一般被其他虛擬機消耗)。
上述這些 CPU 時間,可以讓我們很快了解 CPU 是否處於繁忙狀態。一般情況下,如果用戶時間和系統時間相加非常大,CPU 出於忙於執行指令。如果IO等待時間很長,那麼系統的瓶頸可能在磁盤 IO 。
示例命令的輸出可以看見,大量 CPU 時間消耗在用戶態,也就是用戶應用程序消耗了 CPU 時間。這不一定是性能問題,需要結合 r 隊列,一起分析。
mpstat 命令
該命令可以顯示每個 CPU 的佔用情況,如果有一個 CPU 佔用率特別高,那麼有可能是一個單線程應用程序引起的。
pidstat 命令
pidstat 命令輸出進程的 CPU 佔用率,該命令會持續輸出,並且不會覆蓋之前的數據,可以方便觀察系統動態。如上的輸出,可以看見兩個 JAVA 進程佔用了將近 1600% 的CPU時間,既消耗了大約 16 個 CPU 核心的運算資源。
iostat 命令
- r/s, w/s, rkB/s, wkB/s:分別表示每秒讀寫次數和每秒讀寫數據量(千字節)。讀寫量過大,可能會引起性能問題。
- await:IO 操作的平均等待時間,單位是毫秒。這是應用程序在和磁盤交互時,需要消耗的時間,包括 IO 等待和實際操作的耗時。如果這個數值過大,可能是硬件設備遇到了瓶頸或者出現故障。
- avgqu-sz:向設備發出的請求平均數量。如果這個數值大於 1 ,可能是硬件設備已經飽和(部分前端硬件設備支持並行寫入)。
- %util:設備利用率。這個數值表示設備的繁忙程度,經驗值是如果超過 60 ,可能會影響 IO 性能(可以參照 IO 操作平均等待時間)。如果到達 100% ,說明硬件設備已經飽和。
如果顯示的是邏輯設備的數據,那麼設備利用率不代表後端實際的硬件設備已經飽和。值得注意的是,即使 IO 性能不理想,也不一定意味這應用程序性能會不好,可以利用諸如預讀取、寫緩存等策略提升應用性能。
free 命令
free 命令可以查看系統內存的使用情況,-m
參數表示按照兆字節展示。最後兩列分別表示用於IO緩存的內存數,和用於文件系統頁緩存的內存數。需要注意的是,第二行 -/+ buffers/cache
,看上去緩存佔用了大量內存空間。
這是 Linux 系統的內存使用策略,儘可能的利用內存,如果應用程序需要內存,這部分內存會立即被回收並分配給應用程序。因此,這部分內存一般也被當成是可用內存。
如果可用內存非常少,系統可能會動用交換區(如果配置了的話),這樣會增加 IO 開銷(可以在 iostat 命令中體現),降低系統性能。
? 【重要】Linux系統裏,您知道 buffer 和 cache 如何區分嗎?
Buffer 和 Cache 都是內存中的一塊區域。
- 當 CPU 需要寫數據到磁盤時,由於磁盤速度比較慢,所以 CPU 先把數據存進 Buffer ,然後 CPU 去執行其他任務,Buffer中的數據會定期寫入磁。
- 當 CPU 需要從磁盤讀入數據時,由於磁盤速度比較慢,可以把即將用到的數據提前存入 Cache ,CPU 直接從 Cache中 拿數據要快的多。
詳細的,可以看看 《Linux中 buffer/cache、swap、虛擬內存和Page》 。
sar 命令
- sar 命令在這裏可以查看網絡設備的吞吐率。在排查性能問題時,可以通過網絡設備的吞吐量,判斷網絡設備是否已經飽和。如示例輸出中,eth0 網卡設備,吞吐率大概在 22 Mbytes/s ,既 176 Mbits/sec ,沒有達到 1Gbit/sec 的硬件上限。
- sar命令在這裏用於查看 TCP 連接狀態,其中包括:
- active/s:每秒本地發起的TCP連接數,既通過connect調用創建的TCP連接;
- passive/s:每秒遠程發起的TCP連接數,即通過accept調用創建的TCP連接;
- retrans/s:每秒TCP重傳數量;
TCP 連接數可以用來判斷性能問題是否由於建立了過多的連接,進一步可以判斷是主動發起的連接,還是被動接受的連接。TCP 重傳可能是因爲網絡環境惡劣,或者服務器壓力。
? 我們可以使用哪個命令查看系統的歷史負載(比如說兩天前的)?
sar -q -f /var/log/sa/sa22 # 查看 22 號的系統負載
top 命令
top 命令包含了前面好幾個命令的檢查的內容。比如系統負載情況(uptime)、系統內存使用情況(free)、系統 CPU 使用情況(vmstat)等。因此通過這個命令,可以相對全面的查看系統負載的來源。同時,top 命令支持排序,可以按照不同的列排序,方便查找出諸如內存佔用最多的進程、CPU佔用率最高的進程等。
但是,top 命令相對於前面一些命令,輸出是一個瞬間值,如果不持續盯着,可能會錯過一些線索。這時可能需要暫停 top 命令刷新,來記錄和比對數據。
netstat 命令
? 如何查看系統都開啓了哪些端口?
[root@centos6 ~ 13:20 #55]# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1035/sshd
tcp 0 0 :::22 :::* LISTEN 1035/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 931/dhclient
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 6825 1/init @/com/ubuntu/upstart
unix 2 [ ACC ] STREAM LISTENING 8429 1003/dbus-daemon /var/run/dbus/system_bus_socket
- 網絡連接狀況?
[root@centos6 ~ 13:22 #58]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 192.168.147.130:22 192.168.147.1:23893 ESTABLISHED
tcp 0 0 :::22 :::* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*
// ... 省略其它
? 如何統計系統當前進程連接數?
- 輸入命令
netstat -an | grep ESTABLISHED | wc -l
。 - 輸出結果
177
。一共有 177 連接數。
? 用 netstat 命令配合其他命令,按照源 IP 統計所有到 80 端口的 ESTABLISHED 狀態鏈接的個數?
嚴格來說,這個題目考驗的是對 awk 的使用。
-
首先,使用
netstat -an|grep ESTABLISHED
命令。結果如下:tcp 0 0 120.27.146.122:80 113.65.18.33:62721 ESTABLISHED tcp 0 0 120.27.146.122:80 27.43.83.115:47148 ESTABLISHED tcp 0 0 120.27.146.122:58838 106.39.162.96:443 ESTABLISHED tcp 0 0 120.27.146.122:52304 203.208.40.121:443 ESTABLISHED tcp 0 0 120.27.146.122:33194 203.208.40.122:443 ESTABLISHED tcp 0 0 120.27.146.122:53758 101.37.183.144:443 ESTABLISHED tcp 0 0 120.27.146.122:27017 23.105.193.30:50556 ESTABLISHED // ... 省略其它
-
然後,進一步修改命令,使用
netstat -an|grep ESTABLISHED|grep ":80"|awk 'BEGIN{FS="[[:space:]:]+"}{print $4}'
命令。結果如下:120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 10.47.111.216 // ... 省略其它
- 說明:
FS
是字段分隔符,簡單的可以用多個 awk 過濾。
- 說明:
-
最後,再進一步修改命令,使用
netstat -an|grep ESTABLISHED|grep ":80"|awk 'BEGIN{FS="[[:space:]:]+"}{print $4}'|sort|uniq -c|sort -nr
命令。結果如下:47 120.27.146.122 1 10.47.111.216
- 第一列爲連接數,第二列爲 IP 。
雖然我們這裏羅列了很多的命令,下面,還是會有其它命令。
Linux 概述
Linux 的體系結構
從大的方面講,Linux 體系結構可以分爲兩塊:Linux 體系結構
- 用戶空間(User Space) :用戶空間又包括用戶的應用程序(User Applications)、C 庫(C Library) 。
- 內核空間(Kernel Space) :內核空間又包括系統調用接口(System Call Interface)、內核(Kernel)、平臺架構相關的代碼(Architecture-Dependent Kernel Code) 。
? 爲什麼 Linux 體系結構要分爲用戶空間和內核空間的原因?
- 1、現代 CPU 實現了不同的工作模式,不同模式下 CPU 可以執行的指令和訪問的寄存器不同。
- 2、Linux 從 CPU 的角度出發,爲了保護內核的安全,把系統分成了兩部分。
用戶空間和內核空間是程序執行的兩種不同的狀態,我們可以通過兩種方式完成用戶空間到內核空間的轉移:1)系統調用;2)硬件中斷。
什麼是 Linux 內核?
瞭解即可。
Linux 系統的核心是內核。內核控制着計算機系統上的所有硬件和軟件,在必要時分配硬件,並根據需要執行軟件。
- 系統內存管理
- 應用程序管理
- 硬件設備管理
- 文件系統管理
詳細的,可以看看 《是時候深入瞭解 Linux 的系統結構了》 。
Linux 開機啓動過程?
瞭解即可。
-
1、主機加電自檢,加載 BIOS 硬件信息。
-
2、讀取 MBR 的引導文件(GRUB、LILO)。
艿艿:比較“閒”的胖友,可以感興趣看看 《引導加載程序之爭:瞭解 LILO 和 GRUB》 文章。
-
3、引導 Linux 內核。
-
4、運行第一個進程 init (進程號永遠爲 1 )。
-
5、進入相應的運行級別。
-
6、運行終端,輸入用戶名和密碼。
? Linux系 統缺省的運行級別?
-
- 關機。
-
- 單機用戶模式。
-
- 字符界面的多用戶模式(不支持網絡)。
-
- 字符界面的多用戶模式。
-
- 未分配使用。
-
- 圖形界面的多用戶模式。
-
- 重啓。
Linux 使用的進程間通信方式?
瞭解即可,不需要太深入。
- 1、管道(pipe)、流管道(s_pipe)、有名管道(FIFO)。
- 2、信號(signal) 。
- 3、消息隊列。
- 4、共享內存。
- 5、信號量。
- 6、套接字(socket) 。
詳細的,可以看看:
Linux 有哪些系統日誌文件?
參見 《Linux 系統日誌及日誌分析》 文章,比較重要的是 /var/log/messages
日誌文件。
該日誌文件是許多進程日誌文件的彙總,從該文件可以看出任何入侵企圖或成功的入侵。
另外,如果胖友的系統裏有 ELK 日誌集中收集,它也會被收集進去。
Linux 虛擬內存是什麼?
艿艿:選讀,面試不問。作爲一個知識點,比較底層~
直接看 《虛擬內存的那點事兒》 文章。
磁盤、目錄、文件
簡單 Linux 文件系統?
在 Linux 操作系統中,所有被操作系統管理的資源,例如網絡接口卡、磁盤驅動器、打印機、輸入輸出設備、普通文件或是目錄都被看作是一個文件。
也就是說在 Linux 系統中有一個重要的概念:一切都是文件。其實這是 Unix 哲學的一個體現,而 Linux 是重寫 Unix 而來,所以這個概念也就傳承了下來。在 Unix 系統中,把一切資源都看作是文件,包括硬件設備。UNIX系統把每個硬件都看成是一個文件,通常稱爲設備文件,這樣用戶就可以用讀寫文件的方式實現對硬件的訪問。
Linux 支持 5 種文件類型,如下圖所示:
Linux 的目錄結構是怎樣的?
艿艿:這個問題,一般不會問。更多是實際使用時,需要知道。
Linux 文件系統的結構層次鮮明,就像一棵倒立的樹,最頂層是其根目錄:
常見目錄說明:
- /bin: 存放二進制可執行文件(ls,cat,mkdir等),常用命令一般都在這裏;
- /etc: 存放系統管理和配置文件;
- /home: 存放所有用戶文件的根目錄,是用戶主目錄的基點,比如用戶user的主目錄就是/home/user,可以用~user表示;
- /usr : 用於存放系統應用程序;
- /opt: 額外安裝的可選應用程序包所放置的位置。一般情況下,我們可以把tomcat等都安裝到這裏;
- /proc: 虛擬文件系統目錄,是系統內存的映射。可直接訪問這個目錄來獲取系統信息;
- /root: 超級用戶(系統管理員)的主目錄(特權階級o);
- /sbin: 存放二進制可執行文件,只有root才能訪問。這裏存放的是系統管理員使用的系統級別的管理命令和程序。如ifconfig等;
- /dev: 用於存放設備文件;
- /mnt: 系統管理員安裝臨時文件系統的安裝點,系統提供這個目錄是讓用戶臨時掛載其他的文件系統;
- /boot: 存放用於系統引導時使用的各種文件;
- /lib : 存放着和系統運行相關的庫文件 ;
- /tmp: 用於存放各種臨時文件,是公用的臨時文件存儲點;
- /var: 用於存放運行時需要改變數據的文件,也是某些大文件的溢出區,比方說各種服務的日誌文件(系統啓動日誌等。)等;
- /lost+found: 這個目錄平時是空的,系統非正常關機而留下“無家可歸”的文件(windows下叫什麼.chk)就在這裏。
什麼是 inode ?
艿艿:一般來說,面試不會問 inode 。但是 inode 是一個重要概念,是理解 Unix/Linux 文件系統和硬盤儲存的基礎。
查看 《理解 inode》 文章。
? 簡述 Linux 文件系統通過 i 節點把文件的邏輯結構和物理結構轉換的工作過程?
如果看的一臉懵逼,也沒關係。一般來說,面試官不太會問這個題目。
Linux 通過 inode 節點表將文件的邏輯結構和物理結構進行轉換。
- inode 節點是一個 64 字節長的表,表中包含了文件的相關信息,其中有文件的大小、文件所有者、文件的存取許可方式以及文件的類型等重要信息。在 inode 節點表中最重要的內容是磁盤地址表。在磁盤地址表中有 13 個塊號,文件將以塊號在磁盤地址表中出現的順序依次讀取相應的塊。
- Linux 文件系統通過把 inode 節點和文件名進行連接,當需要讀取該文件時,文件系統在當前目錄表中查找該文件名對應的項,由此得到該文件相對應的 inode 節點號,通過該 inode 節點的磁盤地址表把分散存放的文件物理塊連接成文件的邏輯結構。
什麼是硬鏈接和軟鏈接?
1)硬鏈接
由於 Linux 下的文件是通過索引節點(inode)來識別文件,硬鏈接可以認爲是一個指針,指向文件索引節點的指針,系統並不爲它重新分配 inode 。每添加一個一個硬鏈接,文件的鏈接數就加 1 。
- 不足:1)不可以在不同文件系統的文件間建立鏈接;2)只有超級用戶纔可以爲目錄創建硬鏈接。
2)軟鏈接
軟鏈接克服了硬鏈接的不足,沒有任何文件系統的限制,任何用戶可以創建指向目錄的符號鏈接。因而現在更爲廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器、不同網絡對文件進行鏈接。
- 不足:因爲鏈接文件包含有原文件的路徑信息,所以當原文件從一個目錄下移到其他目錄中,再訪問鏈接文件,系統就找不到了,而硬鏈接就沒有這個缺陷,你想怎麼移就怎麼移;還有它要系統分配額外的空間用於建立新的索引節點和保存原文件的路徑。
? 實際場景下,基本是使用軟鏈接。詳細的,胖友可以看看 《關於硬鏈接和軟連接(符號鏈接)的區別》 。總結區別如下:
- 硬鏈接不可以跨分區,軟件鏈可以跨分區。
- 硬鏈接指向一個 inode 節點,而軟鏈接則是創建一個新的 inode 節點。
- 刪除硬鏈接文件,不會刪除原文件,刪除軟鏈接文件,會把原文件刪除。
RAID 是什麼?
RAID 全稱爲獨立磁盤冗餘陣列(Redundant Array of Independent Disks),基本思想就是把多個相對便宜的硬盤組合起來,成爲一個硬盤陣列組,使性能達到甚至超過一個價格昂貴、 容量巨大的硬盤。RAID 通常被用在服務器電腦上,使用完全相同的硬盤組成一個邏輯扇區,因此操作系統只會把它當做一個硬盤。
RAID 分爲不同的等級,各個不同的等級均在數據可靠性及讀寫性能上做了不同的權衡。在實際應用中,可以依據自己的實際需求選擇不同的 RAID 方案。
詳細的,胖友可以看看 《RAID 技術介紹和總結》 。當然,因爲很多公司都使用雲服務,大家很難接觸到 RAID 這個概念,更多的可能是普通雲盤、SSD 雲盤醬紫的概念。
網絡
iptables 命令
iptables ,是一個配置 Linux 內核防火牆的命令行工具。功能非常強大,對於我們開發來說,主要掌握如何開放端口即可。例如:
-
把來源 IP 爲 192.168.1.101 訪問本機 80 端口的包直接拒絕:
iptables -I INPUT -s 192.168.1.101 -p tcp --dport 80 -j REJECT
。 -
開啓 80 端口,因爲web對外都是這個端口
iptables -A INPUT -p tcp --dport 80 -j ACCEP
-
另外,要注意使用
iptables save
命令,進行保存。否則,服務器重啓後,配置的規則將丟失。
詳細的,可以看看:
- 《Linux 命令大全 —— iptables 命令》
- 《Linux 面試經歷:iptables 面試題》
- 《百度 Linux 運維防火牆 iptables 的面試題》
- 《奇虎 360 Linux 運維工程師 iptables 防火牆面試題》
route 命令
? 添加一條到 192.168.3.0/24 的路由,網關爲 192.168.1.254 ?
- 輸入命令
route add -net 192.168.3.0/24 netmask 255.255.255.0 gw 192.168.1.254
。
? 查看本機路由的三種方式?
[root@centos6 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.220.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
[root@centos6 ~]# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.220.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
[root@centos6 ~]# ip route
192.168.220.0/24 dev eth1 proto kernel scope link src 192.168.220.157 metric 1
169.254.0.0/16 dev eth0 scope link metric 1002
172.16.0.0/16 dev eth0 proto kernel scope link src 172.16.251.6
default via 172.16.0.1 dev eth0 proto static
tcpdump 命令
? 在 Linux 系統下如何按照下面要求抓包:只過濾出訪問 HTTP 服務的,目標 IP 爲 192.168.0.111 ,一共抓 1000 個包,並且保存到 1.cap 文件中??
tcpdump -nn -s0 host 192.168.0.111 and port 80 -c 1000 -w 1.cap
如何配置靜態 IP ?
參見文章 《Linux 設置靜態IP》 。這是一個必備技能。
? 是否可以給一個網卡配置多個 IP?
可以,參見文章 《Linux 下一個網卡配置多個 IP【虛擬ip】》 。不過,一般比較少這麼做。更多的是,一臺服務器有兩個網卡,配置了兩個不同的 IP 。
? 如何查看某個網卡是否連接着交換機?
艿艿:原來還有醬紫的命令!學習到新技能了。
不過阿里雲不支持醬紫的操作。
mii-tool eth0
或者 mii-tool eth1
。
設置 DNS 需要修改哪個配置文件?
- 全局的配置,可以在
/etc/resolv.conf
文件中配置。 - 指定網卡的配置,可以在
/etc/sysconfig/network-scripts/ifcfg-eth0
文件中配置。 - 一般來說,肯定是全局配置即可。
? /etc/hosts 文件什麼做用?
在 /etc/hosts
文中,我們可以配置指定域名和 IP 的映射關係。詳細的,可以看看 《Linux環境下 /etc/hosts 文件詳解》 文章。
? 在 Linux 下如何指定dns服務器,來解析某個域名?
使用 dig 命令:dig @DNSip http://domain.com
。例如:
dig @8.8.8.8 www.baidu.com # 使用谷歌 DNS 解析百度
安全
一臺 Linux 系統初始化環境後需要做一些什麼安全工作?
-
1、添加普通用戶登陸,禁止 root 用戶登陸,更改 SSH 端口號。
修改 SSH 端口不一定絕對哈。當然,如果要暴露在外網,建議改下。
-
2、服務器使用密鑰登陸,禁止密碼登陸。
-
3、開啓防火牆,關閉 SElinux ,根據業務需求設置相應的防火牆規則。
-
4、裝 fail2ban 這種防止 SSH 暴力破擊的軟件。
-
5、設置只允許公司辦公網出口 IP 能登陸服務器(看公司實際需要)
也可以安裝 VPN 等軟件,只允許連接 VPN 到服務器上。
-
6、修改歷史命令記錄的條數爲 10 條。
-
7、只允許有需要的服務器可以訪問外網,其它全部禁止。
-
8、做好軟件層面的防護。
- 8.1 設置 nginx_waf 模塊防止 SQL 注入。
- 8.2 把 Web 服務使用 www 用戶啓動,更改網站目錄的所有者和所屬組爲 www 。
什麼叫 CC 攻擊?什麼叫 DDOS 攻擊?
-
CC 攻擊,主要是用來攻擊頁面的,模擬多個用戶不停的對你的頁面進行訪問,從而使你的系統資源消耗殆盡。
-
DDOS 攻擊,中文名叫分佈式拒絕服務攻擊,指藉助服務器技術將多個計算機聯合起來作爲攻擊平臺,來對一個或多個目標發動 DDOS 攻擊。
攻擊,即是通過大量合法的請求佔用大量網絡資源,以達到癱瘓網絡的目的。
? 怎麼預防 CC 攻擊和 DDOS 攻擊?
防 CC、DDOS 攻擊,這些只能是用硬件防火牆做流量清洗,將攻擊流量引入黑洞。
流量清洗這一塊,主要是買 ISP 服務商的防攻擊的服務就可以,機房一般有空餘流量,我們一般是買服務,畢竟攻擊不會是持續長時間。
例如說,《阿里雲 —— DDoS 高防IP》 。
什麼是網站數據庫注入?
- 由於程序員的水平及經驗參差不齊,大部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷。
- 應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的 SQL 注入。
- SQL注入,是從正常的 WWW 端口訪問,而且表面看起來跟一般的 Web 頁面訪問沒什麼區別,如果管理員沒查看日誌的習慣,可能被入侵很長時間都不會發覺。
? 如何過濾與預防?
數據庫網頁端注入這種,可以考慮使用 nginx_waf 做過濾與預防。
Shell
艿艿:本小節爲選讀。我也不太會寫 Shell 腳本,都是寫的時候,在網絡上拼拼湊湊。。。
Shell 腳本是什麼?
一個 Shell 腳本是一個文本文件,包含一個或多個命令。作爲系統管理員,我們經常需要使用多個命令來完成一項任務,我們可以添加這些所有命令在一個文本文件(Shell 腳本)來完成這些日常工作任務。
? 什麼是默認登錄 Shell ?
在 Linux 操作系統,"/bin/bash"
是默認登錄 Shell,是在創建用戶時分配的。
使用 chsh 命令可以改變默認的 Shell 。示例如下所示:
# chsh <用戶名> -s <新shell>
# chsh linuxtechi -s /bin/sh
? 在 Shell 腳本中,如何寫入註釋?
註釋可以用來描述一個腳本可以做什麼和它是如何工作的。每一行註釋以 #
開頭。例子如下:
#!/bin/bash
# This is a command
echo “I am logged in as $USER”
語法級
可以在 Shell 腳本中使用哪些類型的變量?
在 Shell 腳本,我們可以使用兩種類型的變量:
-
系統定義變量
系統變量是由系統系統自己創建的。這些變量通常由大寫字母組成,可以通過
set
命令查看。 -
用戶定義變量
用戶變量由系統用戶來生成和定義,變量的值可以通過命令
"echo $<變量名>"
查看。
? Shell腳本中 $? 標記的用途是什麼?
在寫一個 Shell 腳本時,如果你想要檢查前一命令是否執行成功,在 if
條件中使用 $?
可以來檢查前一命令的結束狀態。
-
如果結束狀態是 0 ,說明前一個命令執行成功。例如:
root@localhost:~# ls /usr/bin/shar /usr/bin/shar root@localhost:~# echo $? 0
-
如果結束狀態不是0,說明命令執行失敗。例如:
root@localhost:~# ls /usr/bin/share ls: cannot access /usr/bin/share: No such file or directory root@localhost:~# echo $? 2
? Bourne Shell(bash) 中有哪些特殊的變量?
下面的表列出了 Bourne Shell 爲命令行設置的特殊變量。
內建變量 解釋
$0 命令行中的腳本名字
$1 第一個命令行參數
$2 第二個命令行參數
….. …….
$9 第九個命令行參數
$# 命令行參數的數量
$* 所有命令行參數,以空格隔開
? 如何取消變量或取消變量賦值?
unset
命令用於取消變量或取消變量賦值。語法如下所示:
# unset <變量名>
Shell 腳本中 if
語法如何嵌套?
if [ 條件 ]
then
命令1
命令2
…..
else
if [ 條件 ]
then
命令1
命令2
….
else
命令1
命令2
…..
fi
fi
? 在 Shell 腳本中如何比較兩個數字?
在 if-then
中使用測試命令( -gt
等)來比較兩個數字。例如:
#!/bin/bash
x=10
y=20
if [ $x -gt $y ]
then
echo “x is greater than y”
else
echo “y is greater than x”
fi
Shell 腳本中 case
語句的語法?
基礎語法如下:
case 變量 in
值1)
命令1
命令2
…..
最後命令
!!
值2)
命令1
命令2
……
最後命令
;;
esac
Shell 腳本中 for
循環語法?
基礎語法如下:
for 變量 in 循環列表
do
命令1
命令2
….
最後命令
done
Shell 腳本中 while
循環語法?
如同 for
循環,while
循環只要條件成立就重複它的命令塊。
不同於 for
循環,while
循環會不斷迭代,直到它的條件不爲真。
基礎語法:
while [ 條件 ]
do
命令…
done
? do-while 語句的基本格式?
do-while
語句類似於 while
語句,但檢查條件語句之前先執行命令(LCTT 譯註:意即至少執行一次。)。下面是用 do-while
語句的語法:
do
{
命令
} while (條件)
? Shell 腳本中 break 命令的作用?
break
命令一個簡單的用途是退出執行中的循環。我們可以在 while
和 until
循環中使用 break
命令跳出循環。
? Shell 腳本中 continue 命令的作用?
continue
命令不同於 break
命令,它只跳出當前循環的迭代,而不是整個循環。continue
命令很多時候是很有用的,例如錯誤發生,但我們依然希望繼續執行大循環的時候。
如何使腳本可執行?
使用 chmod 命令來使腳本可執行。例子如下:chmod a+x myscript.sh
。
? #!/bin/bash 的作用?
#!/bin/bash
是 Shell 腳本的第一行,稱爲釋伴(shebang)行。
- 這裏
#
符號叫做 hash ,而!
叫做 bang。 - 它的意思是命令通過
/bin/bash
來執行。
? 如何調試 Shell腳本?
- 使用
-x'
數(sh -x myscript.sh
)可以調試 Shell腳本。 - 另一個種方法是使用
-nv
參數(sh -nv myscript.sh
)。
? 如何將標準輸出和錯誤輸出同時重定向到同一位置?
- 方法一:
2>&1 (如# ls /usr/share/doc > out.txt 2>&1 )
。 - 方法二:
&> (如# ls /usr/share/doc &> out.txt )
。
? 在 Shell 腳本中,如何測試文件?
test 命令可以用來測試文件。基礎用法如下表格:
Test 用法
-d 文件名 如果文件存在並且是目錄,返回true
-e 文件名 如果文件存在,返回true
-f 文件名 如果文件存在並且是普通文件,返回true
-r 文件名 如果文件存在並可讀,返回true
-s 文件名 如果文件存在並且不爲空,返回true
-w 文件名 如果文件存在並可寫,返回true
-x 文件名 如果文件存在並可執行,返回true
在 Shell 腳本如何定義函數呢?
函數是擁有名字的代碼塊。當我們定義代碼塊,我們就可以在我們的腳本調用函數名字,該塊就會被執行。示例如下所示:
$ diskusage () { df -h ; }
譯註:下面是我給的shell函數語法,原文沒有
[ function ] 函數名 [()]
{
命令;
[return int;]
}
? 如何讓 Shell 就腳本得到來自終端的輸入?
read 命令可以讀取來自終端(使用鍵盤)的數據。read 命令得到用戶的輸入並置於你給出的變量中。例子如下:
# vi /tmp/test.sh
#!/bin/bash
echo ‘Please enter your name’
read name
echo “My Name is $name”
# ./test.sh
Please enter your name
LinuxTechi
My Name is LinuxTechi
? 如何執行算術運算?
有兩種方法來執行算術運算:
- 1、使用 expr 命令:
# expr 5 + 2
。 - 2、用一個美元符號和方括號(
$[ 表達式 ]
):test=$[16 + 4] ; test=$[16 + 4]
。
編程題
判斷一文件是不是字符設備文件,如果是將其拷貝到 /dev
目錄下?
#!/bin/bash
read -p "Input file name: " FILENAME
if [ -c "$FILENAME" ];then
cp $FILENAME /dev
fi
添加一個新組爲 class1 ,然後添加屬於這個組的 30 個用戶,用戶名的形式爲 stdxx ,其中 xx 從 01 到 30 ?
#!/bin/bash
groupadd class1
for((i=1;i<31;i++))
do
if [ $i -le 10 ];then
useradd -g class1 std0$i
else
useradd -g class1 std$i
fi
done
? 編寫 Shell 程序,實現自動刪除 50 個賬號的功能,賬號名爲stud1 至 stud50 ?
#!/bin/bash
for((i=1;i<51;i++))
do
userdel -r stud$i
done
寫一個 sed 命令,修改 /tmp/input.txt
文件的內容?
要求:
- 刪除所有空行。
- 一行中,如果包含 “11111”,則在 “11111” 前面插入 “AAA”,在 “11111” 後面插入 “BBB” 。比如:將內容爲 0000111112222 的一行改爲 0000AAA11111BBB2222 。
[root@~]# cat -n /tmp/input.txt
1 000011111222
2
3 000011111222222
4 11111000000222
5
6
7 111111111111122222222222
8 2211111111
9 112222222
10 1122
11
# 刪除所有空行命令
[root@~]# sed '/^$/d' /tmp/input.txt
000011111222
000011111222222
11111000000222
111111111111122222222222
2211111111
112222222
1122
# 插入指定的字符
[root@~]# sed 's#\(11111\)#AAA\1BBB#g' /tmp/input.txt
0000AAA11111BBB222
0000AAA11111BBB222222
AAA11111BBB000000222
AAA11111BBBAAA11111BBB11122222222222
22AAA11111BBB111
112222222
1122
實戰
如何選擇 Linux 操作系統版本?
一般來講,桌面用戶首選 Ubuntu ;服務器首選 RHEL 或 CentOS ,兩者中首選 CentOS 。
根據具體要求:
-
安全性要求較高,則選擇 Debian 或者 FreeBSD 。
-
需要使用數據庫高級服務和電子郵件網絡應用的用戶可以選擇 SUSE 。
-
想要新技術新功能可以選擇 Feddora ,Feddora 是 RHEL 和 CentOS 的一個測試版和預發佈版本。
-
【重點】根據現有狀況,絕大多數互聯網公司選擇 CentOS 。現在比較常用的是 6 系列,現在市場佔有大概一半左右。另外的原因是 CentOS 更側重服務器領域,並且無版權約束。
CentOS 7 系列,也慢慢使用的會比較多了。
如何規劃一臺 Linux 主機,步驟是怎樣?
-
1、確定機器是做什麼用的,比如是做 WEB 、DB、還是遊戲服務器。
不同的用途,機器的配置會有所不同。
-
2、確定好之後,就要定系統需要怎麼安裝,默認安裝哪些系統、分區怎麼做。
-
3、需要優化系統的哪些參數,需要創建哪些用戶等等的。
請問當用戶反饋網站訪問慢,你會如何處理?
? 有哪些方面的因素會導致網站網站訪問慢?
-
1、服務器出口帶寬不夠用
- 本身服務器購買的出口帶寬比較小。一旦併發量大的話,就會造成分給每個用戶的出口帶寬就小,訪問速度自然就會慢。
- 跨運營商網絡導致帶寬縮減。例如,公司網站放在電信的網絡上,那麼客戶這邊對接是長城寬帶或聯通,這也可能導致帶寬的縮減。
-
2、服務器負載過大,導致響應不過來
可以從兩個方面入手分析:
- 分析系統負載,使用 w 命令或者 uptime 命令查看系統負載。如果負載很高,則使用 top 命令查看 CPU ,MEM 等佔用情況,要麼是 CPU 繁忙,要麼是內存不夠。
- 如果這二者都正常,再去使用 sar 命令分析網卡流量,分析是不是遭到了攻擊。一旦分析出問題的原因,採取對應的措施解決,如決定要不要殺死一些進程,或者禁止一些訪問等。
-
3、數據庫瓶頸
- 如果慢查詢比較多。那麼就要開發人員或 DBA 協助進行 SQL 語句的優化。
- 如果數據庫響應慢,考慮可以加一個數據庫緩存,如 Redis 等。然後,也可以搭建 MySQL 主從,一臺 MySQL 服務器負責寫,其他幾臺從數據庫負責讀。
-
4、網站開發代碼沒有優化好
- 例如 SQL 語句沒有優化,導致數據庫讀寫相當耗時。
? 針對網站訪問慢,怎麼去排查?
-
1、首先要確定是用戶端還是服務端的問題。當接到用戶反饋訪問慢,那邊自己立即訪問網站看看,如果自己這邊訪問快,基本斷定是用戶端問題,就需要耐心跟客戶解釋,協助客戶解決問題。
艿艿:不要上來就看服務端的問題。一定要從源頭開始,逐步逐步往下。
-
2、如果訪問也慢,那麼可以利用瀏覽器的調試功能,看看加載那一項數據消耗時間過多,是圖片加載慢,還是某些數據加載慢。
-
3、針對服務器負載情況。查看服務器硬件(網絡、CPU、內存)的消耗情況。如果是購買的雲主機,比如阿里雲,可以登錄阿里雲平臺提供各方面的監控,比如 CPU、內存、帶寬的使用情況。
-
4、如果發現硬件資源消耗都不高,那麼就需要通過查日誌,比如看看 MySQL慢查詢的日誌,看看是不是某條 SQL 語句查詢慢,導致網站訪問慢。
? 怎麼去解決?
- 1、如果是出口帶寬問題,那麼久申請加大出口帶寬。
- 2、如果慢查詢比較多,那麼就要開發人員或 DBA 協助進行 SQL 語句的優化。
- 3、如果數據庫響應慢,考慮可以加一個數據庫緩存,如 Redis 等等。然後也可以搭建MySQL 主從,一臺 MySQL 服務器負責寫,其他幾臺從數據庫負責讀。
- 4、申請購買 CDN 服務,加載用戶的訪問。
- 5、如果訪問還比較慢,那就需要從整體架構上進行優化咯。做到專角色專用,多臺服務器提供同一個服務。
如何排查 CPU load 過高問題?
Linux 性能調優都有哪幾種方法?
- 1、Disabling daemons (關閉 daemons)。
- 2、Shutting down the GUI (關閉 GUI)。
- 3、Changing kernel parameters (改變內核參數)。
- 4、Kernel parameters (內核參數)。
- 5、Tuning the processor subsystem (處理器子系統調優)。
- 6、Tuning the memory subsystem (內存子系統調優)。
- 7、Tuning the file system (文件系統子系統調優)。
- 8、Tuning the network subsystem(網絡子系統調優)。