2021-05-12 14:32:11
關於 Linux後台執行進程
最近在搭建kafka的過程中,發現啟動相關服務後,終端介面無法再進行操作。每次都需要開啟多個終端介面,實在是特別麻煩。於是就研究了下Linux後台啟動程式的方法,並整理了如下的筆記。
1、後台執行的例子
nohup command > /dev/null 2>&1 &
解釋:
nohup:
no hangup,不結束通話地執行命令。只用nohup命令,關閉終端,進程還存在。若在終端中直接使用Ctrl+c,則會關閉進程。
command:
command是使用者輸入的命令,可自行設定。如“java -jar crm.jar”等。
&:
後台執行。當你只使用“&”時,關閉終端,進程會關閉。
建議:
所以當你要讓程式在後台不結束通話執行時,需要將nohup和&一起使用。
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 2>&1 &”。這時,標準輸出和標準錯誤都會儲存到subcrible-web.log中。
相關文章