茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1664788 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
PIMG_00121.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

小企鵝開談 : [轉貼] Linux nohup 命令詳解

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[轉貼] Linux nohup 命令詳解

Linux nohup命令詳解

  

nohup命令及其輸出文件                                                                                                                                                                                        

   今天在linux上部署wdt程序,在SSH客戶端執行./start-dishi.sh,啟動成功,在關閉SSH客戶端後,運行的程序也同時終止了,怎樣才能保證在推出SSH客戶端後程序能一直執行呢?通過網上查找資料,發現需要使用nohup命令。
完美解決方案:nohup ./start-dishi.sh >output 2>&1 &

現對上面的命令進行下解釋


用途:不掛斷地運行命令。
語法:nohup Command [ Arg ... ] [ & ]
描述:nohup 命令運行由 Command 參數和任何相關的 Arg 參數指定的命令,忽略所有掛斷(SIGHUP)信號。在註銷後使用 nohup 命令運行後台中的程序。要運行後台中的 nohup 命令,添加 & ( 表示“and”的符號)到命令的尾部。

操作系統中有三個常用的流:
  0:標準輸入流 stdin
  1:標準輸出流 stdout
  2:標準錯誤流 stderr
  一般當我們用 > console.txt,實際是 1>console.txt的省略用法;< console.txt ,實際是 0 < console.txt的省略用法。
 
 
下面步入正題:
> nohup ./start-dishi.sh  >output 2>&1 &
解釋:
 1.  帶&的命令行,即使terminal(終端)關閉,或者電腦死機程序依然運行(前提是你把程序遞交到服務器上); 
 2. 2>&1的意思 
  這個意思是把標準錯誤(2)重定向到標準輸出中(1),而標準輸出又導入文件output裡面,
所以結果是標準錯誤和標準輸出都導入文件output裡面了。  至於為什麼需要將標準錯誤重定向到標準輸出的原因,那就歸結為標準錯誤沒有緩衝區,而stdout有。 這就會導致 >output 2>output 文件output被兩次打開,而stdout和stderr將會競爭覆蓋,這肯定不是我門想要的. 
  這就是為什麼有人會寫成:  nohup ./command.sh >output 2>output出錯的原因了 
==================================================================================
最後談一下/dev/null文件的作用,這是一個無底洞,任何東西都可以定向到這裡,但是卻無法打開。 所以一般很大的stdou和stderr當你不關心的時候可以利用stdout和stderr定向到這裡>./command.sh >/dev/null 2>&1 

原文出處: Linux nohup命令详解 - zqhao - 博客园
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[轉貼]linux 的 nohup 命令的用法

linux的nohup命令的用法

在應用Unix/Linux時,我們一般想讓某個程序在後台運行,於是我們將常會用 & 在程序結尾來讓程序自動運行。比如我們要運行mysql在後台: /usr/local/mysql/bin/mysqld_safe –user=mysql &。可是有很多程序並不想mysqld一樣,這樣我們就需要nohup命令,怎樣使用nohup命令呢?這裡講解nohup命令的一些用法。

nohup /root/start.sh &

在shell中回車後提示:

[~]$ appending output to nohup.out

原程序的的標準輸出被自動改向到當前目錄下的nohup.out文件,起到了log的作用。

但是有時候在這一步會有問題,當把終端關閉後,進程會自動被關閉,察看nohup.out可以看到在關閉終端瞬間服務自動關閉。

咨詢紅旗Linux工程師後,他也不得其解,在我的終端上執行後,他啟動的進程竟然在關閉終端後依然運行。

在第二遍給我演示時,我才發現我和他操作終端時的一個細節不同:他是在當shell中提示了nohup成功後還需要按終端上鍵盤任意鍵退回到shell輸入命令窗口,然後通過在shell中輸入exit來退出終端;而我是每次在nohup執行成功後直接點關閉程序按鈕關閉終端.。所以這時候會斷掉該命令所對應的session,導致nohup對應的進程被通知需要一起shutdown。

這個細節有人和我一樣沒注意到,所以在這兒記錄一下了。

附:nohup命令參考

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就是不掛起的意思( n ohang up)。

該命令的一般形式為:nohup command &

使用nohup命令提交作業

如果使用nohup命令提交作業,那麼在缺省情況下該作業的所有輸出都被重定向到一個名為nohup.out的文件中,除非另外指定了輸出文件:

nohup command > myout.file 2>&1 &

在上面的例子中,輸出被重定向到myout.file文件中。

使用 jobs 查看任務。

使用 fg %n 關閉。

另外有兩個常用的ftp工具ncftpget和ncftpput,可以實現後台的ftp上傳和下載,這樣就可以利用這些命令在後台上傳和下載文件了。


原文出處:linux的nohup命令的用法。 - runfox545 - 博客园
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15766
[轉貼]Linux nohup和 & 的功效

Linux nohup和&的功效

nohup和&究竟有啥區別?不少同學進行了回復,但並不是所有同學都理解得全對,今天把自己挖的坑自己填了。

測試代碼如下:

是一個輸出hello與循環輪數的死循環程序,每輸出一行就休眠1秒。

使用 ./a.out 前台運行程序,會是什麼效果呢?

程序每隔一秒會在終端輸出一個字符串。

此時如果鍵入Ctrl+C ,程序會收到一個SIGINT信號,如果不做特殊處理,程序的默認行為是終止(如上圖)。

使用 ./a.out& 後台運行程序,會是什麼效果呢?

如上圖:

  • 首先會在終端顯示進程號是32389

  • 鍵入Ctrl + C,發出SIGINT信號,程序會繼續運行

ps確認一下,確認進程依然在運行,進程號是32389。


此時如果關掉session,程序會收到一個SIGHUP信號,此時會怎麼樣呢?

ps再次確認,可以看到關閉session之後,進程號是32389的a.out進程也關閉了。

使用nohup ./a.out 又會是什麼效果呢?

使用nohup 運行程序a.out,會發現:

  • 前台沒有出現進程號

  • 有一個“忽略輸入,輸出至nohup.out”的提示

  • hello的輸出也沒有出現在前台

手動ps看進程號,這次a.out的進程號是32437。

此時如果關掉session,程序會收到一個SIGHUP信號,程序會不會關閉呢?


關掉session後,再次ps看一下,ID為32437的a.out進程還在。

這些只能通過kill把程序幹掉了,killall之後,ps查看進程已經關閉。

killall之後,查看發現多了一個nohup.out文件,不過這個文件的大小是0,有點奇怪,啟動程序的時候,明明提示了“appending output to nohup.out”呀,先把問題遺留在這,測試一下Ctrl +C。

仍如上圖,使用nohup啟動a.out,如果鍵入Ctrl+C ,程序收到SIGINT信號後,直接關閉了。

最後測試一下nohup和&同時使用,即用nohup./a.out &運行程序,又會是什麼效果呢?

使用nohup ./a.out &運行程序後,可以看到:

  • 會在終端顯示進程號是32524

  • 也會有一個“忽略輸入,輸出至nohup.out”的提示

鍵入Ctrl + C,發送SIGINT信號,似乎沒反應。


關閉session,發送SIGHUP信號,再來看看。

ID為32524的進程依然存在,後續也只能用kill來關閉它。

結論

使用&後台運行程序:

  • 結果會輸出到終端

  • 使用Ctrl + C發送SIGINT信號,程序免疫

  • 關閉session發送SIGHUP信號,程序關閉

使用nohup運行程序:

  • 結果默認會輸出到nohup.out

  • 使用Ctrl + C發送SIGINT信號,程序關閉

  • 關閉session發送SIGHUP信號,程序免疫

平日線上經常使用nohup和&配合來啟動程序

  • 同時免疫SIGINT和SIGHUP信號

同時,還有一個最佳實踐:

  • 不要將信息輸出到終端標準輸出,標準錯誤輸出,而要用日誌組件將信息記錄到日誌裡

本文轉載自微信公眾號:架構師之路,因為老找不到地址,做下記錄~

 


原文出處:Linux nohup和&的功效 - 小卖铺的老爷爷 - 博客园
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|