Linux命令:nohup、df、du與/dev/null

早上開始工做時發現服務器掛掉了,重啓TongWeb時有報錯:java

上面的紅框圈錯了,第一個紅框的下一行: linux

java.io.IOException: No Space left on deviceshell

咱們用df查看發現磁盤沒有空間了。服務器

 

dfdusession

首先咱們瞭解dfdu命令。spa

  • df能夠查看一級文件夾大小、使用比例、檔案系統及其掛入點,但對文件卻無能爲力。
  • du能夠查看文件及文件夾的大小。

二者配合使用,很是有效。好比用df查看哪一個一級目錄過大,而後用df查看文件夾或文件的大小,如此即可迅速肯定癥結。繼承

 

df命令進程

df命令能夠顯示目前全部文件系統的可用空間及使用情形,上圖中咱們執行了df -h,參數 -h 表示使用「Human-readable」的輸出,也就是在檔案系統大小使用 GBMB 等易讀的格式。input

 

上面的命令輸出的第一個字段(Filesystem)及最後一個字段(Mounted on)分別是檔案系統及其掛入點。咱們能夠看到 /dev/sda1 這個分割區被掛在根目錄下。cmd

 

接下來的四個字段 SizeUsedAvail、及 Use% 分別是該分割區的容量、已使用的大小、剩下的大小、及使用的百分比。 FreeBSD下,當硬盤容量已滿時,您可能會看到已使用的百分比超過 100%,由於 FreeBSD 會留一些空間給 root,讓 root 在檔案系統滿時,仍是能夠寫東西到該檔案系統中,以進行管理。

 

du命令

du命令用於查詢文件或文件夾的磁盤使用空間。

 

若是當前目錄下文件和文件夾不少,使用不帶參數du的命令,能夠循環列出全部文件和文件夾所使用的空間。這對查看到底是那個地方過大是不利的,因此得指定深刻目錄的層數,參數:--max-depth=,這是個極爲有用的參數!注意使用"*",能夠獲得文件的使用空間大小.

 

 

提醒:一貫命令比linux複雜的FreeBSD,它的du命令指定深刻目錄的層數倒是比linux簡化,爲 -d

 

如今咱們就可以肯定問題出在nohup.out這個文件上。現場刪除這個文件後,發現:

文件還在,在/home/.Trash-0裏面又發現這個文件,說明,文件被移動到回收站中(若是是CentOS,這個路徑應該是/home/用戶名/.local/share/Trash/files),可能刪除是在可視化界面中刪除的,那麼在.Trash-0中用rm刪除就好了。

 

nohup命令

用途:不掛斷地運行命令。

 

語法:nohup Command [ Arg … ] [ & ]

 

描述:nohup 命令運行由 Command 參數和任何相關的 Arg 參數指定的命令,忽略全部掛斷(SIGHUP)信號。在註銷後使用 nohup 命令運行後臺中的程序。要運行後臺中的 nohup 命令,添加 & ( 表示"and"的符號)到命令的尾部。

 

不管是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。若是當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。若是沒有文件能建立或打開以用於追加,那麼 Command 參數指定的命令不可調用。若是標準錯誤是一個終端,那麼把指定的命令寫給標準錯誤的全部輸出做爲標準輸出重定向到相同的文件描述符。

 

退出狀態:該命令返回下列出口值:

126 能夠查找但不能調用 Command 參數指定的命令。

127 nohup 命令發生錯誤或不能查找由 Command 參數指定的命令。

不然,nohup 命令的退出狀態是 Command 參數指定命令的退出狀態。

nohup命令及其輸出文件

nohup命令:若是你正在運行一個進程,並且你以爲在退出賬戶時該進程還不會結束,那麼可使用nohup命令。該命令能夠在你退出賬戶/關閉終端以後繼續運行相應的進程。nohup就是不掛斷的意思( no hang up)。

該命令的通常形式爲:nohup command &

使用nohup命令提交做業

若是使用nohup命令提交做業,那麼在缺省狀況下該做業的全部輸出都被重定向到一個名爲nohup.out的文件中,除非另外指定了輸出文件:

nohup command > myout.file 2>&1 &

在上面的例子中,0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standard error) ;2>&1是將標準錯誤(2)重定向到標準輸出(&1),標準輸出(&1)再被重定向輸入到myout.file文件中。

 

在當shell中提示了nohup成功後還須要按終端上鍵盤任意鍵退回到shell輸入命令窗口,而後經過在shell中輸入exit來退出終端;若是在nohup執行成功後直接點關閉程序按鈕關閉終端,進程會自動被關閉,察看nohup.out能夠看到在關閉終端瞬間服務自動關閉。因此這時候會斷掉該命令所對應的session,致使nohup對應的進程被通知須要一塊兒shutdown。

 

可是此時仍是會產生nohup文件的,須要執行:

nohup ./xxxxxx & > /dev/null

"&"以後要有空格,否則就變成了linux重定向中&>,它和>&是一個意思,是"複製一個文件描述符"的意思,nohup就會找不到結束符號。

 

/dev/null

shell中可能常常能看到:echo log > /dev/null 2>&1,命令的結果能夠經過%>的形式來定義輸出:

/dev/null :表明空設備文件

> :表明重定向到哪裏,例如:echo "123" > /home/123.txt

1 :表示stdout標準輸出,系統默認值是1,因此">/dev/null"等同於"1>/dev/null"

2 :表示stderr標準錯誤

& :表示等同於的意思,2>&1,表示2的輸出重定向等同於1

 

1 > /dev/null 2>&1 語句含義:

1 > /dev/null : 首先表示標準輸出重定向到空設備文件,也就是不輸出任何信息到終端,說白了就是不顯示任何信息。

2>&1 :接着,標準錯誤輸出重定向(等同於)標準輸出,由於以前標準輸出已經重定向到了空設備文件,因此標準錯誤輸出也重定向到空設備文件。

 

實例解析:

cmd >a 2>a 和 cmd >a 2>&1 爲何不一樣?

cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件會被打開兩遍,由此致使stdout和stderr互相覆蓋。

cmd >a 2>&1 :stdout直接送往文件a ,stderr是繼承了FD1的管道以後,再被送往文件a 。a文件只被打開一遍,就是FD1將其打開。

 

二者的不一樣點在於:

cmd >a 2>a 至關於使用了FD一、FD2兩個互相競爭使用文件 a 的管道;

cmd >a 2>&1 只使用了一個管道FD1,但已經包括了stdout和stderr。

從IO效率上來說,cmd >a 2>&1的效率更高。

相關文章
相關標籤/搜索