项目成员





维护: (since 2008)
吴小虎  电子邮件
电话: 13438248566

贡献: (时间顺序)
吴 琨,郑明江,徐志强,吴 政, 张 凌, 刘兴旺,唐 敏, 高 强, 孙继东,刘朝阳,朱 明, 曹 磊, 连建国,兰家福,解敬胜
如有遗漏请告知

开源项目


安装部署

系统需求

伪终端

历史上演变出两种风格的伪终端接口:  BSD 和 System V。SUSv1 中伪终端规范部分基于 System V 风格的伪终端接口。在 Linux 系统中,System V 风格伪终端通常称为 UNIX98 风格伪终端,这里沿用这个称呼。

  • BSD 风格

BSD 风格的伪终端是系统预先建立的设备文件对,它们的名称为 /dev/ptyXY(主设备) 和 /dev/ttyXY(从设备),其中 X 可以是 16 个字符 [p-za-e] 中的一个,Y 可以是 16 个字符 [0-9a-f] 中的一个,这样也就限制了系统最多可用的伪终端数量为 16 x 16 = 256 个。这使用 BSD 风格伪终端的系统中,可监控的终端数量也就受到了这个限制。

不同的系统为了扩展这个限制使用了一些不同的方法,例如 SCO UNIX 就不完全遵循 BSD 风格伪终端的命名方式。关于这些系统,需要查询相应的资料。

  • UNIX98 风格

UNIX98 风格的伪终端的主设备文件为 /dev/ptmx,当打开这个设备文件时,将得到一个伪终端主设备的文件描述符,并且在 /dev/pts 目录下面建立一个相应的伪终端从设备。

每个系统对 UNIX98 风格的伪终端的数量的限制不同,以 Linux 为例,在内核版本 2.6.3 及之前,伪终端的数量是编译内核时确定的,允许的最大数量为 2048; 从 2.6.4 开始,这个限制可以通过 /proc/sys/kernel/pty/max 动态的调整。

UNIX98 风格的伪终端是未来的方向,Linux 从内核 2.6.4 开始,建议新的程序都不要再使用 BSD 风格的伪终端。

伪终端数量

为了监控一个终端,Ttyutils 至少需要一个伪终端,监控两个终端则需要两个伪终端,依此类推。如果需要触发事件,那么至少要再增加一个伪终端。所以系统需要的伪终端最小数量为:

监控终端数量 x 1 + 1

最理想的伪终端数量为:

监控终端数量 x 2

假如需要在一个主机中同时监控 100 个终端,那么最少需要 101 个伪终端,准备 200 个伪终端则最理想。

注意上面只是考虑了 Ttyutils 要使用的伪终端数量,系统中还有其它的程序会使用伪终端,典型的包括 Telnet、SSH,在配置伪终端数量时,要将它们综合考虑。

配置伪终端数量

不同的系统有不同的配置方法,下面分别描述:
  • Fedora
  • Redhat Enterprise Linux

在这些系统中,查看 /proc/sys/kernel/pty/max 文件就可以知道系统最多可用的伪终端数量,一般默认是 4096。可以 echo 一个值到这个文件来修改它,例如下面的命令可以将它改为 10240:

# echo "10240" > /proc/sys/kernel/pty/max

或者使用 sysctl 命令:

# sysctl -w kernel.pty.max=10240

象上面那样修改在重启后会消失。如果要使它在重启后能生效,需要在 /etc/sysctl.conf 加入:

kernel.pty.max = 10240

/proc/sys/kernel/pty/max 的最大值是 20 位(1,048,576),应该是足够的。

  • AIX
在 AIX 系统可用 smit 工具来调整伪终端数量。

安装手册

不同的平台安装 Ttyutils 有一定的区别,下面将分别描述。

注意下面描述的内容只是针对某个特定的平台,而没有精确到每个平台特定的版本,这可能导致所描述的内容和实际不符,但大致方向不会错,读者应该根据实际的情况自行调整。如果发现文档内容有错误,请告诉我们

安装后设置

检查安装

安装完成后,可以运行下面的命令看看是否已经安装成功:

$ ttyexec2 --version

正常情况下,将输入程序的授权相关信息后退出。

日志处理

默认情况下,Ttyutils 的日志会被记录到系统日志(syslog),如果这不符合要求,可以用两种方法将日志定位到单独的文件中。

  • 修改 /etc/syslog.conf 文件

将 facility 为 LOG_LOCAL3 的消息输出到指定的文件中,例如下面的例子:

# Save ttyutils messages to ttyutils.log
local3.* /var/log/ttyutils.log

对于不支持 LOCAL3 作为 facility 的系统,可以采用下面的语法:

# Save ttyutils messages to ttyutils.log
*.debug /var/log/ttyutils.log
修改了 syslog.conf 文件后,别忘了给 syslogd 守护进程(1) 发送 SIGHUP 信号来让它重新加载配置文件,就象这样:
# killall -HUP syslogd
关于 syslog.conf 配置文件的语法请参考 syslog.conf(5) 手册页。
  • 使用 `--logfile' 选项
它可以将所有的日志输出到指定文件中,例如下面的例子:
$ ttyexec2 --logfile /tmp/ttyexec.log
将把所有日志保存到 /tmp/ttyexec.log,但是这样就不能享受 syslog 提供的各种能力了。

通过 --logfile 来记录日志时,Ttyutils 会在文件的尾部追加新日志,这样时间长了之后,日志文件会很大。可以使用 cron 这样的工具来定期的备份和清除日志,也可以使用日志回滚工具,例如 logrotate 来防止日志文件无止境的增长

环境变量

在不同的 shell 中设置环境变量的语法有些微的区别:

  • bash、ksh
export VAR=VALUE
  • csh
setenv VAR VALUE

下面的环境变量可能会影响 Ttyutils 的行为:

  • TERM
当前的终端类型,这个环境变量会影响 Ttyutils 对于终端指令的理解和查询。
  • PATH

Ttyutils 提供了一组辅助程序,例如 ttydialog 等等。这些程序安装在 /usr/lib/ttyutils-2.0/scripts 目录中,要方便的使用这些程序,可以将 /usr/lib/ttyutils-2.0/scripts 目录添加到 PATH 环境变量中。

  • LUA_PATH

Ttyutils 在搜索 Lua 模块时会使用这个环境变量的值。当要在 Ttyutils 使用自己的 Lua 模块时,要考虑设置这个环境变量,否则不用关心它。

和环境变量 PATH 的设置方法不同,LUA_PATH 是一个模式列表。《Lua 语言程序设计》中对这个环境变量的解释如下:
Lua 提供高级的 require 函数来加载运行库。粗略的说 require 和 dofile 完成同样的功能,但有两点不同:
    1. require 会搜索目录加载文件;
    2. require 会判断是否文件已经加载避免重复加载同一文件;

由于上述特征,require 在 Lua 中是加载库的更好的函数。require 使用的路径和普通我们看到的路径还有些区别,我们一般见到的路径都是一个目录列表。require 的路径是一个模式列表,每一个模式指明一种由虚文件名(require 的参数)转成实文件名的方法。更明确地说,每一个模式是一个包含可选的问号的文件名。匹配的时候 Lua 会首先将问号用虚文件名替换,然后看是否有这样的文件存在。如果不存在继续用同样的方法用第二个模式匹配。例如,路径如下:

?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua

调用 require "lili" 时会试着打开这些文件:

  • lili
  • lili.lua
  • c:\windows\lili
  • /usr/local/lua/lili/lili.lua
require 关注的问题只有分号(模式之间的分隔符)和问号,其他的信息(目录分隔符,文件扩展名)在路径中定义。
为了确定路径,Lua 首先检查全局变量 LUA_PATH 是否为一个字符串,如果是则认为这个串就是路径; 否则 require 检查环境变量 LUA_PATH 的值,如果两个都失败 require 使用固定的路径(典型的 "?;?.lua")。
  • LANG
  • TTYUTILS_LANG

Ttyutils 支持国际化,根据区域的不同,Ttyutils 会使用不同的语言。默认情况下,Ttyutils 会使用系统当前的区域设置,但如果设置了环境变量 TTYUTILS_LANG,则优先使用它。

修改系统的区域设置会影响系统中大量的程序,而修改 TTYUTILS_LANG 只会影响 Ttyutils 软件包中的程序。TTYUTILS_LANG 的设置方法和 LANG 相同,例如:

$ export TTYUTILS_LANG=zh_CN.utf8

使用 'locale -a' 可以得到当前系统支持的全部区域。

  • TTYUTILS_LOCALEDIR
Ttyutils 支持国际化,对于每个支持的语言,Ttyutils 会提供一个相应的 .mo 的文件,这些文件默认安装在系统的标准路径(通常是 /usr/share/locale 目录),如果您将这些文件安装在非标准路径,可以使用 TTYUTILS_LOCALEDIR 环境变量来告诉 Ttyutils 在什么地方查找这些文件。
  • ENABLE_MEMPROF
如果设置了这个环境变量,并且它的值不等于 0,那么 Ttyutils 将开启内存检查功能,在程序退出时,会在程序的工作目录产生一个 ~memprof.dump 的文件,内容是程序对内存使用的报告。
这个环境变量主要是为了调试,会对性能有些微的影响,在生产环境最好不要启用。
  • TTYUTILS_PID
  • TTYUTILS_TTY
  • TTYUTILS_PTS

当用 Ttyutils 监控程序的时候,它将在被监控程序的环境中添加 TTYUTILS_PID、TTYUTILS_TTY、TTYUTILS_PTS 三个变量,分别用于记录 Ttyutils 的进程 ID、终端名称,以及建立的伪终端名称。这些变量是 Ttyutills 启动子进程时自动添加的,用户不需要干预,并且应该考虑它们是只读的。

在触发事件程序时,Ttyutils 也会在事件程序的环境中添加这些变量,这可以用来快速的定位 RPC 服务进程。

评论 (1)

吴小虎 - 2009-7-9 上午2:16

也可能是 rsyslog,syslogd 的增强版本,参考 http://www.rsyslog.com