最近在搭建kafka的過程中,發現啟動相關服務後,終端界面無法再進行操作。每次都需要開啟多個終端界面,實在是特別麻煩。於是就研究了下Linux後臺啟動程式的方法,並整理瞭如下的筆記。 1 後臺運行的例子 nohup command > /dev/null 2>&1 & 解釋: nohup: no h ...
最近在搭建kafka的過程中,發現啟動相關服務後,終端界面無法再進行操作。每次都需要開啟多個終端界面,實在是特別麻煩。於是就研究了下Linux後臺啟動程式的方法,並整理瞭如下的筆記。
1 後臺運行的例子
2 數字0,1,2的含義
linux中有三種標準輸入輸出,分別是STDIN,STDOUT,STDERR,對應的數字是0,1,2。STDIN是標準輸入,預設從鍵盤讀取信息;STDOUT是標準輸出,預設將輸出結果輸出至終端;STDERR是標準錯誤,預設將輸出結果輸出至終端。
由於STDOUT與STDERR都會預設顯示在終端上,為了區分二者的信息,就有了編號的0,1,2的定義,用1表示STDOUT,2表示STDERR。
3 command >/dev/null的含義
/dev/null表示一個空設備,就是說吧command的執行結果重定向到空設備中,說白了就是不顯示任何信息。
null是一個名叫null小桶的東西,如果命令的輸出不想要即想丟棄輸出的內容,既不想在標準輸出與不想重定向到某個文件,就可將命令的輸出重定向到/dev/null。這樣做的好處是不會因為輸出的內容過多而導致文件大小不斷的增加。
命令“command > /dev/null”是一個縮寫版,對於一個重定向命令,肯定是a > b這種形式,那麼command > /dev/null難道是command充當a的角色,/dev/null充當b的角色。這樣看起來比較合理,其實一條命令肯定是充當不了a,肯定是command執行產生的輸出來充當a,其實就是標準輸出stdout。所以command > /dev/null相當於執行了command 1 > /dev/null。執行command產生了標準輸出stdout(用1表示),重定向到/dev/null的設備文件中。
4 “2>&1”的含義
4.1 command>a 2>a 與 command>a 2>&1的區別
通過上面的分析,對於command>a 2>&1這條命令,等價於command 1>a 2>&1可以理解為執行command產生的標準輸入重定向到文件a中,標準錯誤也重定向到文件a中。那麼是否就說command 1>a 2>&1等價於command 1>a 2>a呢。其實不是,command 1>a 2>&1與command 1>a 2>a還是有區別的,區別就在於前者只打開一次文件a,後者會打開文件兩次,並導致stdout被stderr覆蓋。&1的含義就可以理解為用標準輸出的引用,引用的就是重定向標準輸出產生打開的a。從IO效率上來講,command 1>a 2>&1比command 1>a 2>a的效率更高。
4.2 “2>&1”的理解
那麼對於2>&1也就好理解了,2就是標準錯誤,1是標準輸出,那麼這條命令就是相當於把標準錯誤重定向到標準輸出。所以當程式產生錯誤的時候,相當於錯誤流向左邊,而左邊依舊是輸入到/dev/null中。
4.3 再談nohup命令
如果使用nohup命令提交作業,那麼在預設情況下該作業的所有輸出都被重定向到一個名為nohup.out的文件中(比如:nohup command & ),除非另外指定了輸出文件,比如“nohup java -jar yellowstone-web.jar > subcrible-web.log &”。這時,標準輸出和標準錯誤都會保存到subcrible-web.log中。