藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月26日 11:18


請教命令行裡出現&的問題?

在這裡,我有兩個小問題要請教大家:

1    如果在命令行裡這樣跑一個命令:
    $ command &
      是意味著把這個命令放在後台去執行,那麼在前台也就沒有任何信息輸出了
    但是,如果這個命令在默認情況下,確實要輸出大量的運行信息,包括錯誤信息,
    並且如果我在命令行裡也不使用 >/dev/null 2>&1 或者 &>/dev/null
      那麼是不是由於沒有地方輸出默認的信息和錯誤信息而導致該程序不能運行或者說
    不能長期正常運行?

2    如果一個命令我不是放在後台運行,命令我這樣寫:command  2>&1,意思是不管是
    正常信息還是錯誤信息都輸出到顯示器,但是,如果一個服務器根本就沒有顯示器,並且
    假設連一個SSH終端都沒有,那麼會不會因為信息無發輸出到指定的標準輸出而無法運行
    該命令呢?

3   我曾經在我的POP3服務器上遇到過這樣一個情況:POP3服務器運行了兩年一直沒有出現
   過什麼故障,突然有一天POP3不行了,但是POP3服務並沒有死掉,而是連接速度特別慢,
   慢的幾乎等於無用了,我看了一下POP3啟動腳本,有最關鍵的一句是這樣寫的
   /var/qmail/bin/pop3d Maiddir &
    我把這一句改成/var/qmail/bin/pop3d Maiddir 2>&1後就行了,POP3恢復正常服務,并
   在SSH屏幕上顯示了大量的正常信息。並且是不斷的。後來我我就關掉了SSH,由於服務器
   本身也是沒有顯示器的,這就意味著這個命令無法找到輸出的地方了,這時POP3服務器又回到
   以前的「半死半活」的狀況,我又只好開啟了一個SSH終端重起POP3服務器就又好了。
   於是我就想,乾脆把這些信息都重定向到一個日誌文件裡去吧,於是我把上面的命令改寫成:
   /var/qmail/bin/pop3d Maiddir >>/var/log/pop3.log 2>&1 結果呢?日誌是紀錄了,屏幕
   上也確實沒有什麼信息了,但是POP3又不行了,唉!我現在只好讓一個SSH終端老是開著。


  我想,對於這個問題的不明白,還是對於前兩個問題的不太清楚的認識,我也學習過「SHELL
   十三周」,儘管講解得很好,但對於我這個問題是沒有明確的例子解釋的,所以,我還要在這裡
  請教大家給我指點迷津

   十分感謝

怎麼沒有人回答呀?

第三個問題是因為你終結了pop3d的父進程,它也隨之終結

前兩個問題請再讀「十三周」和它鏈接的文章,仔細對比你的描述和教程描述的區別

-->

waker兄弟能否說明白一點,第三個問題中你的回答是「你終結了pop3d的父進程,它也隨之終結」,
你具體是針對我的第三個問題中哪一點?因為第三個問題裡,我提到了幾種操作呢

To xxjoyjn:
問題1:
若一個進程被送到後台運行後,當它從終端讀取時,終端驅動程序會檢測到這個情況並發送一個SIGTIN信號給後台進程,通常後台進程會暫時停止執行,等待輸入。當它被轉到前台時,shell會發送一個SIGCONT信號給它,它就可以繼續執行接受用戶在終端的輸入。
當一個後台進程試圖寫到終端時會有兩種情況,一種情況是允許後台進程寫到終端,它就會正常執行。但這常常會就終端搞得很亂,而且用戶也不一定需要時刻盯著終端上的輸出。所以我們可以選擇不讓後台進程寫到終端上。執行命令:
stty tostop
這樣當後台進程寫終端時會收到SIGTOU信號,於是會暫停運行,直到它轉到前台收到SIGCONT信號後,輸出才真正寫到終端。
如果後台進程的標準輸入、標準輸出和標準錯誤輸出被重定向到非終端設備或文件時,上面討論的都不會發生,進程正常運行。
2.沒有顯示器並不代表沒有終端,終端可以是控制台、串行終端和偽終端,終端的設備可以是本機鍵盤/顯示器,也可以是串行終端機(非本機,通過串行電纜連接的鍵盤、顯示設備),還可以是通過串行電纜連接的偽終端如minicom或windows超級終端,也可以是本級(Xwindows下)或網絡連接的偽終端。至於在用戶登錄前由init進程啟動的進程是否綁定某種終端,我就不知道了。在此小弟也要向高人請教!^_^
3.你是如何執行pop3d命令的?如果沒有用nohup的話,當你退出ssh連接時,pop3d作為ssh登錄shell的子進程自然也就會退出了。

我的POP3D命令是放在一個啟動腳本裡的
請問,如果POP3D的命令名是pop3d,我在腳本如果這樣寫
..................
/var/qmail/pop3d &
...........................

那麼我通過SSH登陸啟動這個腳本後,如果我退出SSH,那麼pop3d這個進程是不是
也跟著「死掉」了

想問,從進程的關係來看,加&結尾的命令是否就不是啟動該命令的進程的子進程了?

想問
1  如果一個命令的結尾加了一個&,那麼這個命令是不是就不會隨著SSH的退出而退出?
   如果是,就說明這個命令對應的進程就是SSH SHELL進程的子進程,如果不是,那麼
   這個命令對應的進程就不是這個SHELL的子進程,那麼以&結尾的命令對應的進程又是
   誰的子進程而存在?

-->

首先向你的鑽研精神表示敬意!^_^
然後再為樓上的一個錯誤say sorry.

對於普通的進程上面的說法沒有問題。當需要進程在你從終端登出後繼續運行時,在linux平台可以使用nohup命令:
nohup command &
command的輸出被重定向到文件nohup.out,在你退出後仍將繼續運行。
unix平台下可以試試screen。

但是對於一個daemon進程,情況就不同了。
一個daemon進程,它設計來就是用在後台運行的,通常不用加"&"來執行。那麼一個設計良好的daemon應該會自己處理好自己的輸入和輸出,通常不會對終端進行讀寫操作。
當一個進程在其父進程退出後繼續運行的情況下,它會被進程號為1的系統進程init「收養」,作為init的子進程繼續運行。所以daemon進程的父進程號一般都是1。

再回到你的問題,你的pop3d應該是一個daemon,所以我在5樓第三點中所說的並不能適用。抱歉,誤導了!^_^

如果你的pop3d需要重定向IO後才能正常工作,那他應該不是一個編寫良好的daemon。
實際的情況應該不是這樣,很可能是其它地方出了問題。建議你去mail版問問。

那麼說nohup command & 和command > nohup.out 2>&1 &是一回事了?

-->
NO! nohup後進程脫離當前shell的控制,當前shell退出後繼續運行;只是簡單地把進程放到後台去並不會產生這樣的效果。

如果在一個命令中使用&就等於把這個進程放到後台去了?
是不是放到後台去執行的程序就不是啟動該命令的進程的子進程了?
比如是在命令行裡啟動的一個command &,那麼這個在後台去
運行的命令還是不是當前SHELL的子進程?

請參考:
[url=http://www.lslnet.com/linux/#viewthread.php?tid=742295][color=blue][shell問答錄]:命令、進程、子shell...[/color]
Q3之2。

-->


你說「如果一個進程在其父進程退出後要繼續運行的話,就被INIT進程收養。。。。」
那麼怎樣才能讓一個進程在其父進程退出後讓INIT收養而保持繼續運行呢?
我們都知道,任何一個進程總是有其父進程衍生的,並且一般情況下,父進程
退出後其所有子進程都會隨之消亡的呀!

faint! 上面不是說了嗎?老兄有沒有仔細在看吶?^_^
另外還有一個disown命令。

謝謝你的耐心指點,我對SHELL懂得甚少,慚愧!
我正在研究你的那個帖子

不好意思,再問一下,/etc/init.d/下面的命令或者說程序
是不是都是init進程的子進程呀

-->
對的,init.d下的東西是由init進程執行的。

這麼說我想要一個程序在機器啟動時就可以執行,那麼我就可以把它放在
/etc/init.d/下,但是我發現好多朋友都喜歡放在/etc/rc.local下面,比如
MSYQL,APACHE,TOMCAT等的自啟動問題,
放在這兩個目錄下面有什麼區別嗎?
/etc/rc.local下面的程序又是那個進程的子進程呢?
:D

-->
/etc/rc.local好像是BSD的風格,相當於DOS的AUTOEXEC.BAT。一般的命令直接丟進去就OK。它也是由init來執行的。
/etc/init.d/下的東西與運行級密切相關,目錄的結構,運行級的具體含義,不同的系統可能不會完全一樣。「小孩沒娘,說起來話就長了」。建議你找本好書看看,系統學習一下。



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com