如何清除一個被佔用的tty端口

轉自:http://www.365testing.com/bbs/thread-19686-1-1.html

本文講述了一系列清除被佔用的tty端口的方法,適用於tty端口鎖死或者不能通訊的任何情況。 

一個tty端口不可用,忙,或者該tty端口一直死鎖,可能是因爲有進程佔用着該端口或者其他原因。下面我們示例如何清除一個被佔用的tty端口。以下的例子假設tty端口是tty0。需要注意的是,只有root用戶才能夠完成以下的這些工作。

1、首先查看tty正在處理什麼進程的請求:
ps -lt tty0
該命令的返回格式應該類似於下面的形式:
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
240001 S 202 22566 3608 0 60 20 781a 444 70201e44 tty0 0:00 ksh
這裏,進程ID (PID)是 22566。爲了使用這個端口,我們需要殺死這個進程:
kill 22566
完成以後,我們可以重新用ps -lt tty0 來查看一下是否還有進程佔用tty,如果剛纔的kill命令沒有殺死進程,那麼給kill命令加參數 -9。例如:kill -9 22566
請注意,如果您發現佔用tty端口的進程是一個slip連接的進程,那麼不要用帶-9參數的kill命令去殺死它,否則有可能引起slip連接進程在/etc/locks目錄中遺留下來一個鎖文件。如果真的殺死了slip進程,而且發現有這個鎖文件,那麼我們要手工刪除它。

2、其次我們需要查看什麼進程佔用或者正在試圖佔用tty端口:
ps -ef | grep tty0
如果這個命令返回的形式是:
root 19050 1 0 Mar 06 - 0:00 /usr/sbin/getty /dev/tty
請注意,這裏“-”符號位於日期和時間之間,而正常情況這裏應該是tty名稱。這個現象表明這個tty端口沒有連接正確的電纜線,系統登錄進程(getty)正在試圖打開tty端口,但是該進程無法收到正確的串口信號而掛住。解決這個問題的方法是使用正確的null modem電纜。當getty可以打開tty端口的時候,上例中“-"就會被具體的tty號碼替換。
如果您不希望通過tty0端口進行登錄,而是用這個端口做其他用途,那麼請執行命令:
pdisable tty0
如果此時與tty0相關的所有進程都清除了,但是tty0仍然不可用,那麼請執行下面的步驟。

3、執行命令:
fuser -k /dev/tty0
這個命令查詢任何在這個tty端口上運行的程序,並且殺死它們,並且顯示出PID。如果這個時候,tty0仍然不可用,那麼進行下面的步驟。

4、執行命令 strreset 來對從tty端口出去的數據進行刷新重置。這是因爲:tty鎖死有可能是因爲對遠程tty的連接已經丟失,但是有數據在當前這個端口的緩衝池中無法發出。
請注意,如果strreset命令真的可以解決問題,那麼tty端口一定有電纜的硬件故障或者配置問題。因爲在通常情況下,對遠程端口失去連接之後,數據的緩衝池會自動刷新,不需要人工的干預。strreset的具體用法是這樣的,我們首先需要知道tty設備的主設備號碼和輔設備號碼。執行命令:
ls -al /dev/tty0
返回應該是以下的格式:
crw-rw-rw- 1 root system 18, 0 Nov 7 06:19 /dev/tty0
這表明主設備號碼爲18,輔設備號碼爲0。
那麼此時,我們使用strreset命令的格式如下:
/usr/sbin/strreset -M 18 -m 0
如果此時tty仍然不可用,那麼執行以下步驟。

5、拔掉所有在這個tty上的電纜,然後再插上。AIX系統使用數據傳輸檢測信號(Data Carrier Detect ,DCD)來檢測在該端口上的設備的迴應信號。因此,重新插拔電纜在很多情況下有可能可以恢復鎖死的進程(這些進程佔用或者試圖佔用tty端口)。
如果有多個tty端口和多條串口電纜,那麼具體拔哪條電纜呢?我們需要知道這個tty被配置到哪個串口上了,執行命令:
lsdev -Cl tty0
返回結果應該類似:
tty0 Available 00-00-S1-00 Asynchronous Terminal
請注意第三列,S1表示串口1。在機器的後面板上(某些型號在前面板也有一個S1)您可以找到所有的串口,如果此時仍然不能確定是哪個串口,那麼請參考您的硬件手冊,查找物理位置代碼。
如果插拔仍然不能夠解決問題,那麼執行以下的步驟。

6、使用stty-cxms命令來刷新tty端口:
/usr/lbin/tty/stty-cxma flush tty0
其實本來這個命令是用來刷新8口或者128口的串口適配器的端口的,但是在某些情況下,這條命令對於其他的tty端口也是可以成功刷新的。
如果此時tty仍然不可用,那麼執行下面的步驟。

7、如果在鎖死的tty端口上連接有終端,此時終端的狀態也應該是鎖死的,此時在終端的鍵盤上執行Ctrl+Q,這個快捷鍵會向端口發送一個Xon字符,恢復所有暫停的輸出。如果此時tty仍然不可用,那麼執行下面的步驟。

8、如果走到了這一步,那麼原因往往是有一個程序打開了tty端口,並且修改了tty的一些屬性,然後關閉了這個端口,但是並沒有把屬性恢復回去。爲了解決這個問題,我們必須把tty從Available狀態調整到Defined狀態。輸入下面的命令:
rmdev -l tty0
此時tty在系統中就不可用了,但是tty的設備數據仍然在系統的ODM庫中。然後執行命令:mkdev -l tty0 。系統會重建設備。如果此時tty仍然不可用,那麼您可以暫時把電纜或者其他設備移動到其他的串口上以便於臨時通訊,然後安排宕機時間進行系統重啓。然後再把電纜或者設備移動到原來的tty0上。如果此時發現tty仍然不能使用,那麼非常有可能的就是您有硬件的故障了。此時檢查系統錯誤日誌:errpt和errpt -a。

請注意,您在閱讀本篇文章並想自己做測試的時候,如果您按照順序用以上的命令來檢查tty端口,很有可能返回的結果是device is busy,請不要匆忙的用下一步來解決問題。此時請確認您的任何設備(特別是有HACMP配置的客戶)都不需要使用tty端口然後再試。
發佈了89 篇原創文章 · 獲贊 18 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章