Linux面试题
常用命令
艿艿:這一小節會非常非常非常長,當做溫故知新吧。
另外,面試官也可能會問,你熟悉 Linux 么?你平時使用哪些 Linux 命令。醬紫的連環炮~
當然,建議重點看下 「性能相關」 小節。
目錄相關
find 命令
《Linux 命令大全 —— 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 命令
《Linux 命令大全 —— ls 命令》
- 以易讀的方式顯示文件大小(顯示為 MB,GB…):ls -lh 。
- 以最后修改時間升序列出文件:ls -ltr 。
- 在文件名后面顯示文件類型:ls -F 。
pwd 命令
《Linux 命令大全 —— pwd 命令》
- 輸出當前工作目錄:pwd 。
cd 命令
《Linux 命令大全 —— cd 命令》
- cd :可以在最近工作的兩個目錄間切換。
mkdir 命令
《Linux 命令大全 —— mkdir 命令》
- 在 home 目錄下創建一個名為 temp 的目錄:mkdir ~/temp 。
- 使用 -p 選項可以創建一個路徑上所有不存在的目錄:mkdir -p dir1/dir2/dir3/dir4/ 。
df 命令
《Linux 命令大全 —— df 命令》
- 顯示文件系統的磁盤使用情況,默認情況下 df -k 將以字節為單位輸出磁盤的使用量。
- 使用 df -h 選項可以以更符合閱讀習慣的方式顯示磁盤使用量。
- 使用 df -T 選項顯示文件系統類型。
rm 命令
《Linux 命令大全 —— rm 命令》
- 刪除文件前先確認:rm -i filename.txt 。
- 在文件名中使用 shell 的元字符會非常有用。刪除文件前先打印文件名并進行確認:rm -i file* 。
- 遞歸刪除文件夾下所有文件,并刪除該文件夾:rm -r example 。
mv 命令
《Linux 命令大全 —— mv 命令》
- 將 file1 重命名為 file2 ,如果 file2 存在則提示是否覆蓋:mv -i file1 file2 。
- -v 會輸出重命名的過程,當文件名中包含通配符時,這個選項會非常方便:mv -v file1 file2 。
cp 命令
《Linux 命令大全 —— 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 root@192.168.1.100:/tmp/logs
相比來說,rsync 比 scp 的性能更好。具體可以看看 《scp 與 rsync 性能實測》 文章。
mount 命令
《Linux 命令大全 —— mount 命令》
-
如果要掛載一個文件系統,需要先創建一個目錄,然后將這個文件系統掛載到這個目錄上:
# mkdir /u01# mount /dev/sdb1 /u01 -
也可以把它添加到 fstab 中進行自動掛載,這樣任何時候系統重啟的時候,文件系統都會被加載:
/dev/sdb1 /u01 ext2 defaults 0 2
cat 命令
《Linux 命令大全 —— 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' 4tail 命令
《Linux 命令大全 —— tail 命令》
- tail 命令默認顯示文件最后的 10 行文本:tail filename.txt 。
- 你可以使用 -n 選項指定要顯示的行數:tail -n N filename.txt 。
- 你也可以使用 -f 選項進行實時查看,這個命令執行后會等待,如果有新行添加到文件尾部,它會繼續輸出新的行,在查看日志時這個選項會非常有用。你可以通過 CTRL-C 終止命令的執行:tail -f log-file 。
less 命令
《Linux 命令大全 —— less 命令》
-
這個命名可以在不加載整個文件的前提下顯示文件內容,在查看大型日志文件的時候這個命令會非常有用:less huge-log-file.log 。
-
當你用 less 命令打開某個文件時,下面兩個按鍵會給你帶來很多幫助,他們用于向前和向后滾屏:
CTRL+F – forward one window CTRL+B – backward one window
通用命令
grep 命令
《Linux 命令大全 —— grep 命令》
- 在文件中查找字符串(不區分大小寫):grep -i "the" demo_file 。
- 輸出成功匹配的行,以及該行之后的三行:grep -A 3 -i "example" demo_text 。
- 在一個文件夾中遞歸查詢包含指定字符串的文件:grep -r "ramesh" * 。
sed 命令
《Linux 命令大全 —— 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/#'? 打印 /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=targetedawk 命令
《Linux 命令大全 —— 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 命令
《Linux vi/vim》
- 打開文件并跳到第 10 行:vim +10 filename.txt 。
- 打開文件跳到第一個匹配的行:vim +/search-term filename.txt 。
- 以只讀模式打開文件:vim -R /etc/passwd 。
diff 命令
貌似不太常用,當學習下。
《Linux 命令大全 —— diff 命令》
- 比較的時候忽略空白符:diff -w name_list.txt name_list_new.txt 。
sort 命令
貌似不太常用,當學習下。
《Linux 命令大全 —— sort 命令》
- 以升序對文件內容排序:sort names.txt 。
- 以降序對文件內容排序:sort -r names.txt 。
- 以第三個字段對 /etc/passwd 的內容排序:sort -t: -k 3n /etc/passwd | more 。
? **
xargs 命令
《Linux 命令大全 —— 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 文件: tar cvf archive_name.tar dirname/ 。
- 解壓 tar 文件:tar xvf archive_name.tar 。
- 查看 tar 文件:tar tvf archive_name.tar 。
gzip 命令
《Linux 命令大全 —— gzip 命令》
- 創建一個 *.gz 的壓縮文件:gzip test.txt 。
- 解壓 *.gz 文件:gzip -d test.txt.gz 。
- 顯示壓縮的比率:gzip -l *.gz 。
bzip2 命令
《Linux 命令大全 —— bzip2 命令》
- 創建 *.bz2 壓縮文件:bzip2 test.txt 。
- 解壓 *.bz2 文件:bzip2 -d test.txt.bz2 。
unzip 命令
《Linux 命令大全 —— unzip 命令》
- 解壓 *.zip 文件:unzip test.zip 。
- 查看 *.zip 文件的內容:unzip -l jasper.zip 。
系統命令
export 命令
《Linux 命令大全 —— export 命令》
- 輸出跟字符串 oracle 匹配的環境變量:export | grep ORCALE 。
- 設置全局環境變量:export ORACLE_HOME=/u01/app/oracle/product/10.2.0 。
kill 命令
《Linux 命令大全 —— 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 7243passwd 命令
《Linux 命令大全 —— passwd 命令》
- passwd 用于在命令行修改密碼,使用這個命令會要求你先輸入舊密碼,然后輸入新密碼:passwd 。
- 超級用戶可以用這個命令修改其他用戶的密碼,這個時候不需要輸入用戶的密碼:passwd USERNAME 。
- passwd 還可以刪除某個用戶的密碼,這個命令只有 root 用戶才能操作,刪除密碼后,這個用戶不需要輸入密碼就可以登錄到系統:passwd -d USERNAME 。
su 命令
《Linux 命令大全 —— su 命令》
-
su 命令用于切換用戶賬號,超級用戶使用這個命令可以切換到任何其他用戶而不用輸入密碼:su - USERNAME 。
-
用另外一個用戶名執行一個命令下面的示例中用戶 john 使用 raj 用戶名執行 ls 命令,執行完后返回 john 的賬號:
[john@dev-server]$ su - raj -c 'ls'[john@dev-server]$ -
用指定用戶登錄,并且使用指定的 shell 程序,而不用默認的:su -s 'SHELLNAME' USERNAME 。
yum 命令
《Linux 命令大全 —— yum 命令》
- 使用 yum 安裝 apache :yum install httpd 。
- 更新 apache :yum update httpd 。
- 卸載/刪除 apache :yum remove httpd 。
rpm 命令
《Linux 命令大全 —— 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 命令
《Linux 命令大全 —— shutdown 命令》
- 關閉系統并立即關機:shutdown -h now 。
- 10 分鐘后關機:shutdown -h +10 。
- 重啟:shutdown -r now 。
- 重啟期間強制進行系統檢查:shutdown -Fr now 。
crontab 命令
《Linux 命令大全 —— crontab 命令》
- 查看某個用戶的 crontab 配置:crontab -u user -l 。
- 設置一個每十分鐘執行一次的計劃任務:*/10 * * * * /home/ramesh/check-disk-space 。【前提是,在 crontab 下】
service 命令
《Linux 命令大全 —— service 命令》
- service 命令用于運行 System V init 腳本,這些腳本一般位于 /etc/init.d 文件下,這個命令可以直接運行這個文件夾里面的腳本,而不用加上路徑。
- 查看服務狀態:service ssh status 。
- 查看所有服務狀態:service --status-all 。
- 重啟服務:service ssh restart 。
另外,使用 chkconfig 命令,可以設置服務在系統啟動時,是否自動啟動。詳細的,見 《Linux 命令大全 —— chkconfig 命令》 文章。
chmod 命令
《Linux 命令大全 —— chmod 命令》
- chmod 用于改變文件和目錄的權限。
- 給指定文件的屬主和屬組所有權限(包括讀、寫、執行):chmod ug+rwx file.txt 。
- 刪除指定文件的屬組的所有權限:chmod g-rwx file.txt 。
- 修改目錄的權限,以及遞歸修改目錄下面所有文件和子目錄的權限:chmod -R ug+rwx file.txt 。
chown 命令
《Linux 命令大全 —— chown 命令》
- chown 用于改變文件屬主和屬組。
- 同時將某個文件的屬主改為 oracle ,屬組改為 db :chown oracle:dba dbora.sh 。
- 使用 -R 選項對目錄和目錄下的文件進行遞歸修改:chown -R oracle:dba /home/oracle 。
uname 命令
《Linux 命令大全 —— uname 命令》
- uname 可以顯示一些重要的系統信息,例如內核名稱、主機名、內核版本號、處理器類型之類的信息:uname -a 。
whereis 命令
《Linux 命令大全 —— whereis 命令》
- 當你不知道某個命令的位置時可以使用 whereis 命令,下面使用 whereis 查找 ls 的位置:whereis ls 。
- 當你想查找某個可執行程序的位置,但這個程序又不在 whereis 的默認目錄下,你可以使用 -B 選項,并指定目錄作為這個選項的參數。下面的命令在 /tmp 目錄下查找 lsmk 命令:whereis -u -B /tmp -f lsmk 。
locate 命令
《Linux 命令大全 —— locate 命令》
- locate 命名可以顯示某個指定文件(或一組文件)的路徑,它會使用由 updatedb 創建的數據庫。
- 下面的命令會顯示系統中所有包含 crontab 字符串的文件:locate crontab 。
另外,胖友如果使用 CentOS 找不到 locate 命令,可以看看 《CentOS 系統找到 locate 命令及 locate 搜索不到存在的文件》 文章。
man 命令
《Linux 命令大全 —— 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 命令
《Linux 命令大全 —— 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 命令
《Linux 命令大全 —— 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 92168mscurl 命令
《Linux 命令大全 —— 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 命令
《Linux 命令大全 —— 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 命令
《Linux 命令大全 —— 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 命令
《Linux 命令大全 —— ssh 命令》
- 登錄到遠程主機:ssh username@remotehost.example.com 。
- 顯示 ssh 客戶端版本:ssh -V 。
##【重要】服務器狀態相關
通過如下命令,我們可以知道 Linux 服務器運行情況,從而可以排查性能的情況。
因為我們是每小節一個命令,胖友后面可以看看 《Linux 性能分析工具介紹(CPU,內存,磁盤 I/O,網絡)》 文章,它將本小節的命令,又做了一次歸類,和介紹。所以,可以結合著一起讀讀。
ps 命令
《Linux 命令大全 —— ps 命令》
- ps 命令用于顯示正在運行中的進程的信息。
- 查看當前正在運行的所有進程:ps -ef | more 。
- 以樹狀結構顯示當前正在運行的進程,H 選項表示顯示進程的層次結構:ps -efH | more 。
? 查看后臺所有 java 進程?
- 方式一:ps -ef |grep java 。
- 方式二:jps -m 。
uptime 命令
《Linux 命令大全 —— uptime 命令》
這個命令可以快速查看機器的負載情況。在 Linux 系統中,這些數據表示等待 CPU 資源的進程和阻塞在不可中斷 IO 進程(進程狀態為 D)的數量。這些數據可以讓我們對系統資源使用有一個宏觀的了解。
命令的輸出分別表示 1 分鐘、5 分鐘、15 分鐘的平均負載情況。通過這三個數據,可以了解服務器負載是在趨于緊張還是趨于緩解。
- 如果 1 分鐘平均負載很高,而 15 分鐘平均負載很低,說明服務器正在命令高負載情況,需要進一步排查 CPU 資源都消耗在了哪里。
- 反之,如果 15 分鐘平均負載很高,1 分鐘平均負載較低,則有可能是 CPU 資源緊張時刻已經過去。
- 上面例子中的輸出,可以看見最近 1 分鐘的平均負載非常高,且遠高于最近 15 分鐘負載,因此我們需要繼續排查當前系統中有什么進程消耗了大量的資源。可以通過下文將會介紹的 vmstat、mpstat 等命令進一步排查。
另外,還有一個 《Linux 命令大全 —— w 命令》 ,也是使用比較方便的,快速查看系統負載情況的命令。
dmesg 命令
《Linux 命令大全 —— dmesg 命令》
該命令會輸出系統日志的最后 10 行。示例中的輸出,可以看見一次內核的 oom kill 和一次 TCP 丟包。這些日志可以幫助排查性能問題。千萬不要忘了這一步。
vmstat 命令
《Linux 命令大全 —— 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 命令
《Linux 命令大全 —— 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 命令
《Linux 命令大全 —— 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 命令
《Linux 命令大全 —— top 命令》
top 命令包含了前面好幾個命令的檢查的內容。比如系統負載情況(uptime)、系統內存使用情況(free)、系統 CPU 使用情況(vmstat)等。因此通過這個命令,可以相對全面的查看系統負載的來源。同時,top 命令支持排序,可以按照不同的列排序,方便查找出諸如內存占用最多的進程、CPU占用率最高的進程等。
但是,top 命令相對于前面一些命令,輸出是一個瞬間值,如果不持續盯著,可能會錯過一些線索。這時可能需要暫停 top 命令刷新,來記錄和比對數據。
netstat 命令
《Linux 命令大全 —— 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.1221 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 內核剖析(七)》
- 《目前 Linux 進程間通信的常用方法是什么(pipe?信號量?消息隊列?)?》
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》 文章。
- 《缺頁中斷 —— FIFO、LRU、OPT 這三種置換算法》 。
? 簡述 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 命令
《Linux 命令大全 —— 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 statictcpdump 命令
《Linux 命令大全 —— 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” fiShell 腳本中 case 語句的語法?
基礎語法如下:
case 變量 in 值1) 命令1 命令2 ….. 最后命令 !! 值2) 命令1 命令2 …… 最后命令 ;; esacShell 腳本中 for 循環語法?
基礎語法如下:
for 變量 in 循環列表 do 命令1 命令2 …. 最后命令 doneShell 腳本中 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" ];thencp $FILENAME /dev fi添加一個新組為 class1 ,然后添加屬于這個組的 30 個用戶,用戶名的形式為 stdxx ,其中 xx 從 01 到 30 ?
#!/bin/bash groupadd class1 for((i=1;i<31;i++)) doif [ $i -le 10 ];thenuseradd -g class1 std0$ielseuseradd -g class1 std$ifi done? 編寫 Shell 程序,實現自動刪除 50 個賬號的功能,賬號名為stud1 至 stud50 ?
#!/bin/bash for((i=1;i<51;i++)) douserdel -r stud$i done寫一個 sed 命令,修改 /tmp/input.txt 文件的內容?
要求:
- 刪除所有空行。
- 一行中,如果包含 “11111”,則在 “11111” 前面插入 “AAA”,在 “11111” 后面插入 “BBB” 。比如:將內容為 0000111112222 的一行改為 0000AAA11111BBB2222 。
實戰
如何選擇 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 過高問題?
- 《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(網絡子系統調優)。
總結
- 上一篇: 22套精美的网页按钮图标设计推荐(包括P
- 下一篇: psftp的用法