Java開發人員必須掌握的Linux命令-學以至用(五)

子曰:「工欲善其事,必先利其器。「java

作一個積極的人linux

編碼、改bug、提高本身web

我有一個樂園,面向編程,春暖花開!shell

學習應該是快樂的,在這個樂園中我努力讓本身能用簡潔易懂(搞笑有趣)的表達來說解讓知識或者技術,讓學習之旅充滿樂趣,這就是寫博文的初心。apache

今天是週末,首先祝你們週末愉快了,分享一張今天早上去外面拍的照片:編程

Spring color

圖書館外面的小公園的春意。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 重複計算硬件鏈接的文件。
#&emsp;–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命令的時候,必定擦亮眼睛,不然一回車,就是「千古恨」!

友情建議:

能夠在生產環境把 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的形式列出來
注:&emsp;確保不要在你 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
複製代碼
  • f1 是表示分鐘,f2 表示小時,f3 表示一個月份中的第幾日,f4 表示月份,f5 表示一個星期中的第幾天
  • program 表示要執行的程序。
  • 當 f1 爲 * 時表示每分鐘都要執行 program,f2 爲 * 時表示每小時都要執行程序,其餘類推
  • 當 f1 爲 a-b 時表示從第 a 分鐘到第 b 分鐘這段時間內要執行,f2 爲 a-b 時表示從第 a 到第 b 小時都要執行,其餘類推
  • 當 f1 爲 */n 時表示每 n 分鐘個時間間隔執行一次,f2 爲 */n 表示每 n 小時個時間間隔執行一次,其餘類推
  • 當 f1 爲 a, b, c,... 時表示第 a, b, c,... 分鐘要執行,f2 爲 a, b, c,... 時表示第 a, b, c...個小時要執行,其餘類推

本文總結

Linux魔法(命令)相關的知識就暫告一段落,若是沒有看過前面的系列介紹,在推薦閱讀下面查看以前分享的內容,相信仔細學習了這個系列後,不少命令的掌握會有必定的提示,並能應用到實際的工做中!

魔法的修煉之路到這裏告一段落,之後有時間會繼續分享。歡迎一塊兒學習和積累實用的魔法技能。

推薦閱讀

Java開發人員必須掌握的Linux命令(一)
Java開發人員必須掌握的Linux命令(二)
Java開發人員必須掌握的Linux命令(三)
Java開發人員必須掌握的兩個Linux魔法工具(四)
Java開發人員必須掌握的Linux命令-學以至用(五)


謝謝你的閱讀,若是您以爲這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到!祝你天天開心愉快!


Java編程技術樂園:一個分享編程知識的公衆號。跟着園長老司機一塊兒學習,天天進步一點點。

掃描關注,後臺回覆【資源】,獲取珍藏乾貨! 99.9%的夥伴都很喜歡

image.png | center| 747x519

© 天天都在變得更好的阿飛雲
相關文章
相關標籤/搜索