Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1011375
  • 博文数量: 584
  • 博客积分: 2293
  • 博客等级: 大尉
  • 技术积分: 3045
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-28 11:15
文章分类

全部博文(584)

文章存档

2012年(532)

2011年(47)

2009年(5)

我的朋友

分类:

2012-05-06 13:40:55

  本文讲述了一系列清除被占用的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端口然后再试。

阅读(432) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~