子曰:「工欲善其事,必先利其器。「java
作一個積極的人linux
編碼、改bug、提高本身web
我有一個樂園,面向編程,春暖花開!shell
學習應該是快樂的,在這個樂園中我努力讓本身能用簡潔易懂(搞笑有趣)的表達來說解讓知識或者技術,讓學習之旅充滿樂趣,這就是寫博文的初心。apache
今天是週末,首先祝你們週末愉快了,分享一張今天早上去外面拍的照片:編程
圖書館外面的小公園的春意。vim
這周整理了Linux的命令,也被我稱爲Linux的魔法。本篇回顧一些命令(魔法),而後經過實際的應用場景,使用這些命令(魔法)。centos
故事旁白:tomcat
在哈利波特的電影中,有許多的魔法咒,好比複製成雙:複製咒、使物體消失:消隱無蹤咒、使物體歸攏一塊兒:收拾咒、移動物體:移形幻影咒、給我指路:定向咒等等。bash
在Linux的魔法世界中,一樣也存在許多命令(魔法)文件複製(cp)魔法、文件移形幻影(mv)魔法、文件歸攏一塊兒(tar)魔法、文件消隱無蹤(rm)魔法(文件消失無蹤魔法使用不當那就堪稱 阿瓦達索命)。
魔法地圖:
在linux下,「一切皆是文件」!
當服務器運行一段時間後,會有數據的堆積。此時咱們用使用df
魔法去看一下磁盤目前使用的空間狀況,以下:
[aflyun@localhost ~]$ df -h
文件系統 容量 已用 可用 已用% 掛載點
/dev/mapper/centos-root 17G 2.0G 16G 12% /
devtmpfs 485M 0 485M 0% /dev
tmpfs 496M 0 496M 0% /dev/shm
tmpfs 496M 6.8M 490M 2% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/sda1 1014M 129M 886M 13% /boot
tmpfs 100M 0 100M 0% /run/user/0
複製代碼
可是當知道了一個掛載的磁盤下面沒有空間時候,怎麼知道那個目錄下面文件佔用磁盤空間最多呢?那就使用du
魔法。以下:
# 查看 /home/aflyun 各個目錄佔用磁盤空間大小
[aflyun@localhost ~]$ du -lh --max-depth=1
193M ./tools
0 ./magic
193M
各參數說明 :
# -h或–human-readable 以K,M,G爲單位,提升信息的可讀性。
# -l或–count-links 重複計算硬件鏈接的文件。
# –max-depth=<目錄層數> 超過指定層數的目錄後,予以忽略。
複製代碼
應用場景: Linux服務器磁盤空間佔用,大文件查找。
刪除(rm)魔法,也就是相似使物體消失:消隱無蹤咒。這個魔法若是使用不當那就是 一個黑魔法(如阿瓦達索命)。
正常使用:
[aflyun@localhost rmtest]$ touch testrm1 restrm2
[aflyun@localhost rmtest]$ mkdir -p testrmdir/0317
[aflyun@localhost rmtest]$ mkdir testrmdir1
[aflyun@localhost rmtest]$ cd testrmdir/0317/
[aflyun@localhost 0317]$ touch testrm3
[aflyun@localhost rmtest]$ ll
總用量 0
-rw-rw-r--. 1 aflyun aflyun 0 3月 17 14:48 restrm2
-rw-rw-r--. 1 aflyun aflyun 0 3月 17 14:48 testrm1
drwxrwxr-x. 3 aflyun aflyun 18 3月 17 14:49 testrmdir
drwxrwxr-x. 2 aflyun aflyun 6 3月 17 14:50 testrmdir1
[aflyun@localhost rmtest]$
# 1.刪除一個文件
[aflyun@localhost rmtest]$ rm testrm1
# 2.刪除文件以前詢問
[aflyun@localhost rmtest]$ rm -i restrm2
rm:是否刪除普通空文件 "restrm2"?
# 注: Enter :刪除,ctrl +c :退出
# 3.強制遞歸刪除文件或者目錄
[aflyun@localhost rmtest]$ rm -f testrmdir
rm: 沒法刪除"testrmdir": 是一個目錄
[aflyun@localhost rmtest]$ rm -rf testrmdir
[aflyun@localhost rmtest]$ ll
總用量 0
drwxrwxr-x. 1 aflyun aflyun 6 3月 17 14:50 testrmdir1
參數說明:
-i 刪除前逐一詢問確認。
-f 即便原檔案屬性設爲惟讀,亦直接刪除,無需逐一確認。
-r 將目錄及如下之檔案亦逐一刪除。
複製代碼
使用不當,可能就要跑路嘍!:
# 1.直接敲命令刪除日誌文件
[aflyun@localhost ~]$ rm -rf / home/aflyun/logs/
# 看出什麼 端倪了沒有。提示一下:必定不要拷貝這條命令去執行!!!
# 若是你真的好奇,那建議在本身的虛擬機上試試,知足一下你的好奇心。
# 這條命令中 「多了個空格 」!
# 2.腳本中使用,刪除日誌文件
[aflyun@localhost ~]$ vim cleanlog.sh
cd ${log_path}
rm -rf *
# 進入到日誌目錄,而後把日誌都刪除。
# 乍看沒有任何問題?可是當目錄不存在時,那悲劇也就發生了。
複製代碼
注意::在生產環境上,執行rm命令的時候,必定擦亮眼睛,不然一回車,就是「千古恨」!
友情建議:
能夠在生產環境把 rm -rf 命令替換爲mv,再寫個定時shell按期清理。模擬了回收站的功能。
參考:rm -rf * 了咋辦,跑路嗎?t.cn/Exyx5f5
當你忘記文件/目錄具體在哪一個地方的時候,請使用find魔法。
# 3.1 查找/home/aflyun目錄下面的全部文件
[aflyun@localhost ~]$ find /home/aflyun/
/home/aflyun/
/home/aflyun/.bash_logout
/home/aflyun/.bash_profile
/home/aflyun/.bashrc
/home/aflyun/tools
/home/aflyun/tools/apache-tomcat-8.5.38.tar.gz
/home/aflyun/tools/jdk-8u191-linux-x64.tar.gz
/home/aflyun/magic
/home/aflyun/magic/happy.log
/home/aflyun/rmtest
/home/aflyun/rmtest/restrm2
/home/aflyun/rmtest/testrmdir1
# 3.2 查找/home/aflyun 目錄中全部大於 10M 的文件並列出來
[aflyun@localhost ~]$ find /home/aflyun -size +5M -exec ls -lh {} \;
-rw-r--r--. 1 root root 9.3M 3月 17 14:35 /home/aflyun/tools/apache-tomcat-8.5.38.tar.gz
-rw-r--r--. 1 root root 183M 3月 17 14:35 /home/aflyun/tools/jdk-8u191-linux-x64.tar.gz
參數說明:
# /home/aflyun 指的是當前目錄 你也能夠指定目錄 /home/happy
# -size 文件大小
# +10M 注意M是大寫的 意思大於10M
# -exec ls -lh {} \; 管道 列出來並標明大小
# ls -lh 以 k M G的形式列出來
注: 確保不要在你 Linux 系統的根目錄運行該命令,由於這可能致使你的機器 I/O 瓶頸。
# 3.3 查找 /home/aflyun 下面rest 的文件,忽略大小寫
[aflyun@localhost ~]$ find /home/aflyun/ -iname rest* -type f
/home/aflyun/rmtest/restrm2
/home/aflyun/rmtest/Restrm
參數說明:
# -i 忽略大小寫
# -name 文件名
# 3.4 查找文件或者目錄
[aflyun@localhost ~]$ find /home/aflyun -iname rest* -type f
/home/aflyun/rmtest/restrm2
/home/aflyun/rmtest/Restrm
[aflyun@localhost ~]$ find /home/aflyun -iname rest* -type d
/home/aflyun/rmtest/restrmdir1
# 3.5 find和它的朋友exec組合使用,3.2已經用過
# 忽略大小寫 ,查找rest開頭的文件,並刪除文件
[aflyun@localhost ~]$ ll rmtest/
總用量 0
-rw-rw-r--. 1 aflyun aflyun 0 3月 17 15:33 Restrm
-rw-rw-r--. 1 aflyun aflyun 0 3月 17 14:48 restrm2
drwxrwxr-x. 2 aflyun aflyun 6 3月 17 14:50 restrmdir1
[aflyun@localhost ~]$
[aflyun@localhost ~]$ find /home/aflyun -iname rest* -type f -exec rm -f {} \;
[aflyun@localhost ~]$
[aflyun@localhost ~]$ ll rmtest/
總用量 0
drwxrwxr-x. 2 aflyun aflyun 6 3月 17 14:50 restrmdir1
複製代碼
在服務器上咱們通常會容許不少的服務,通常公司會有服務器狀態檢測機制。那咱們經過命令怎麼查看服務是否啓動,以tomcat爲例子。
# 4.1 查看tomcat服務啓動狀態
[aflyun@localhost bin]$ ps -aux | grep tomcat
aflyun 5142 0.0 0.0 113308 688 pts/0 S 15:41 0:00 /bin/sh /home/aflyun/tools/apache-tomcat-8.5.38/bin/catalina.sh start
aflyun 5143 3.4 8.6 2296124 87748 pts/0 Sl 15:41 0:05 /usr/local/java/jdk1.8.0_191/bin/java -Djava.util.logging.config.file=/home/aflyun/tools/apache-tomcat-8.5.38/conf/logging.properties
.....省略
# 4.1.1 另外一種方式看服務狀態,輸出不是 0 ,表明服務啓動狀態
[aflyun@localhost bin]$ ps -aux | grep -P "/home/aflyun/tools/apache-tomcat-8.5.38/" | grep -v "\sgrep\s" | wc -l
2
[aflyun@localhost bin]$
注: 服務是啓動了,可是不表明服務是正常的。有時候tomcat服務查看是正常的,可是接口沒法訪問,有假死狀況等!
# 4.2 再次啓動tomcat遇到8080端口被佔用
java.net.BindException: 地址已在使用 (Bind failed)
at java.net.PlainSocketImpl.socketBind(Native Method)
java.net.BindException: Port already in use (Bind failed)
at java.net.PlainSocketImpl.socketBind(Native Method)
# 查看端口8080的使用狀況
[aflyun@localhost bin]$ netstat -alnp | grep 8080
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp6 0 0 :::8080 :::* LISTEN 5143/java
#查看端口屬於哪一個程序
lsof -i :8080
[aflyun@localhost bin]$ lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 5143 aflyun 49u IPv6 40442 0t0 TCP *:webcache (LISTEN)
[aflyun@localhost bin]
# 注: 5143 pid 就是上面查看tomat的pid。
複製代碼
在工做中,常常會遇到線上項目出現問題,須要排查! 然而在茫茫的日誌文件中,如何快速的找到報錯的地方的日誌,以及快速定位和解決問題,這是一種能力,這種能力是能夠在平時工做中鍛煉出來的。
# 5.1 查看tomcat的日誌,滾動輸出
[aflyun@localhost logs]$ tail -f catalina.out
# 5.2 查看tomcat的日誌中包含 aflyun 的字符,滾動輸出
[aflyun@localhost logs]$ tail -f catalina.out | grep "java編程技術樂園"
# 5.3 查看tomcat的日誌中包含 「地址已在使用」 內容的行數
# cat -n 文件名 | grep 搜索名稱
[aflyun@localhost logs]$ cat -n catalina.out | grep "地址已在使用"
83 Caused by: java.net.BindException: 地址已在使用
117 Caused by: java.net.BindException: 地址已在使用
145 java.net.BindException: 地址已在使用 (Bind failed)
[aflyun@localhost logs]$
# 5.4 查看tomcat的日誌中包含 「地址已在使用」 內容的83行,先後10行日誌
# cat -n 文件名|tail -n +起始行數 |head -n +查詢多少行數
[aflyun@localhost logs]$ cat -n catalina.out | tail -n +73 | head -n +20
73 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
74 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
75 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
76 at java.lang.reflect.Method.invoke(Method.java:498)
77 at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:309)
78 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
79 Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed
80 at org.apache.catalina.connector.Connector.initInternal(Connector.java:995)
81 at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
82 ... 12 more
83 Caused by: java.net.BindException: 地址已在使用
84 at sun.nio.ch.Net.bind0(Native Method)
85 at sun.nio.ch.Net.bind(Net.java:433)
86 at sun.nio.ch.Net.bind(Net.java:425)
87 at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
88 at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
89 at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:219)
90 at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1087)
91 at org.apache.tomcat.util.net.AbstractJsseEndpoint.init(AbstractJsseEndpoint.java:265)
92 at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:581)
[aflyun@localhost logs]$
複製代碼
注: 日誌相關的東西不少,這裏強調一下,關鍵的地方必定要打日誌,要不出了問題,及時你會各類Linux的魔法,日誌中沒有輸出出現問題的內容(當前的請求參數,響應參數等),你也就是一個「巧婦」,由於巧婦難爲無米之炊。日誌必定要記錄好!不然出了問題就苦惱+浪費不少時間排查!重視每一個環節!
crontab命令常見於Unix和類Unix的操做系統之中,用於設置週期性被執行的指令。該命令從標準輸入設備讀取指令,並將其存放於「crontab」文件中,以供以後讀取和執行。
crontab 命令的參數:
-e : 執行文字編輯器來設定時程表,內定的文字編輯器是 VI,若是你想用別的文字編輯器,
則請先設定 VISUAL 環境變數來指定使用那個文字編輯器(好比說 setenv VISUAL joe)
-r : 刪除目前的時程表
-l : 列出目前的時程表
複製代碼
注: linux crontab 命令,最小的執行時間是一分鐘。
# 6.一、寫一個腳本,使用crontab 執行,每2s執行一次!
[aflyun@localhost crontabtest]$ touch printlog.sh
[aflyun@localhost crontabtest]$ touch print.log
[aflyun@localhost crontabtest]$ vim printlog.sh
[aflyun@localhost crontabtest]$ cat printlog.sh
#!/bin/bash
ttime=`date +"%Y-%m-%d %H:%M:%S"`
echo "$ttime,Welcome to Java編程技術樂園" >>/home/aflyun/crontabtest/print.log
#-------------------------
# 1.覆蓋 echo "" >文件名
# 2.追加 echo "" >>文件名
[aflyun@localhost crontabtest]$ chmod 755 printlog.sh
[aflyun@localhost crontabtest]$ ll
總用量 8
-rw-rw-r--. 1 aflyun aflyun 1264 3月 17 16:36 print.log
-rwxr-xr-x. 1 aflyun aflyun 132 3月 17 16:34 printlog.sh
[aflyun@localhost crontabtest]$
# 6.二、寫一個定時的任務
# crontab -e 輸入如下語句,而後 :wq 保存退出。保存後可使用 crontab -l 查看定時任務。
* * * * * /home/aflyun/crontabtest/printlog.sh
* * * * * sleep 1 && /home/aflyun/crontabtest/printlog.sh
* * * * * sleep 2 && /home/aflyun/crontabtest/printlog.sh
...
* * * * * sleep 59 && /home/aflyun/crontabtest/printlog.sh
# 6.3 查看打印的日誌
[aflyun@localhost crontabtest]$ cat print.log
2019-03-17 16:34:01,Welcome to Java編程技術樂園
2019-03-17 16:34:02,Welcome to Java編程技術樂園
....
複製代碼
備註:crontab命令 的時程表的格式以下
# f1 f2 f3 f4 f5 program
複製代碼
Linux魔法(命令)相關的知識就暫告一段落,若是沒有看過前面的系列介紹,在推薦閱讀下面查看以前分享的內容,相信仔細學習了這個系列後,不少命令的掌握會有必定的提示,並能應用到實際的工做中!
魔法的修煉之路到這裏告一段落,之後有時間會繼續分享。歡迎一塊兒學習和積累實用的魔法技能。
Java開發人員必須掌握的Linux命令(一)
Java開發人員必須掌握的Linux命令(二)
Java開發人員必須掌握的Linux命令(三)
Java開發人員必須掌握的兩個Linux魔法工具(四)
Java開發人員必須掌握的Linux命令-學以至用(五)
謝謝你的閱讀,若是您以爲這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到!祝你天天開心愉快!