问题说明:
接手新业务,发现若干台主机(系统为Redhat 5.5)出现Ctrl+c失效情况,即进入一个持续的进程后(如top)无法使用Ctrl+c的方式退出该进程。
问题分析:
- Ctrl+c本质上是通过shell给当前进程发送SIGINT信号(kill -2)达到阻断进程的效果,类似信号还有SIGHUP(kill -1,后台挂起)、SIGKILL(kill -9,强制退出,不可忽略、不可处理)等,详见trap -l或kill -l。trap命令可以设置收到信号时的处理命令,如使用trap "echo I had changed SIGINT" 2可以在使用Crtl+c后打印对应文字。使用trap命令后可以查看被设置处理的命令列表,但是未发现SIGINT被修改。
- 寻找其他主机是否有类似情况,发现同业务模块的其他主机有同样情况,而监控主机(同为Redhat系统)未发现此类情况。检查跳板机相同、登录方式相同,对比sessions配置文件基本相同;修改仿真方式为linux依然无法解决。
- 使用监控主机ssh至问题主机,发现可以正常使用Ctrl+c命令;使用问题主机ssh至监控主机无法使用Ctrl+c命令。
通过以上步骤,基本可以确定是SecureCRT会话配置问题。
问题解决:
经过网上搜索,发现是会话配置中使用了windows的快捷键导致了按键冲突(即Ctrl+c为windows的粘贴按键)。
在对会话选项进行编辑,找到 终端 -> 仿真 -> 映射键,有个CUA设置,把“使用Windows复制和粘贴热键(U)”前面的勾去掉,即可解决问题。
问题反思:
- 该问题并不影响业务程序的运行或对系统产生危害,仅仅可能对维护操作产生不便,但是本次问题的解决过程帮助回忆我了linux系统中的信号概念、了解了trap命令,其中涉及的知识值得记录积累。
- 本次解决问题的思路依然是交叉验证,即一台主机的问题,可以找到相似环境的其他主机进行对比实验,再比较其中的差异。这种思路普遍适用于工作和生活中的各种问题。
- 本次问题解决主要时间花费在考虑linux信号的配置和使用上,最终才发现是仿真终端SecureCRT的配置问题,提醒今后遇到问题需要全局思考,不能只局限于眼前所见的冰山一角。
相关资料:
1) SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联.
2) SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出
3) SIGQUIT 和SIGINT类似, 但由QUIT字符(通常是Ctrl-/)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号.
4) SIGILL 执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号.
5) SIGTRAP 由断点指令或其它trap指令产生. 由debugger使用.
6) SIGABRT 程序自己发现错误并调用abort时产生.
7) SIGIOT 在PDP-11上由iot指令产生, 在其它机器上和SIGABRT一样.
8) SIGBUS 非法地址, 包括内存地址对齐(alignment)出错. eg: 访问一个四个字长的整数, 但其地址不是4的倍数.
9) SIGFPE 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误.
10) SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略.
11) SIGUSR1 留给用户使用
12) SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.
13) SIGUSR2 留给用户使用
14) SIGPIPE Broken pipe
15) SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.
16) SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号.
17) SIGCHLD 子进程结束时, 父进程会收到这个信号.
18) SIGCONT 让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符
19) SIGSTOP 停止(stopped)进程的执行. 注l意它和terminate以及interrupt的区别: 该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.
20) SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号
21) SIGTTIN 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.
22) SIGTTOU 类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.
23) SIGURG 有紧急数据或out-of-band数据到达socket时产生.
24) SIGXCPU 超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变
25) SIGXFSZ 超过文件大小资源限制.
26) SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.
27) SIGPROF 类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.
28) SIGWINCH 窗口大小改变时发出.
29) SIGIO 文件描述符准备就绪, 可以开始进行输入/输出操作.
30) SIGPWR Power failure
32.全网最详细trap讲解,trap语法格式,信号和用途,最常用的信号,trap常用的命令,ctrl + c,信号屏蔽和恢复,trap -,debug,exit,return示例,三个综合案例_数哥