注意:script
指的是script
命令,它将 stdin 和 stdout 记录到文件中。
我试图使用该 script
实用程序运行一个脚本来保存输出以供以后检查,同时保留终端上的文本颜色。
- Ctrl当我尝试使用+ Z( )暂停当前脚本时
SIGTSTP
,控制台会打印^Z
并且脚本不会停止。 - 然后我尝试了Ctrl+S
(。当前运行的脚本确实冻结(SIGSTOP
)htop
将所有进程显示为Z
模式),但它不会释放终端。 Ctrl+Q确实恢复它们。
我现在很困惑为什么
Ctrl+S有效,但SIGSTOP
SIGTSTP
( Ctrl+ Z) 无效。
我知道可能会被困住,但我看不出有任何理由这样做,并且的手册页SIGTSTP
中也没有任何相关内容。script
我尝试强制脚本解释器进入交互模式,但结果让我更加困惑。发出Ctrl+ Z( SIGTSTP
) 确实会挂起正在运行的脚本,但script
表示脚本已完成然后退出,这会杀死所有挂起的子进程。
在这种情况下有没有办法让正常挂起?另外,有人能准确解释一下发生了什么吗?
就像任何其他直通工具(
ssh
、screen
、tmux
等)一样,script
将调用终端置于原始模式,以便 Ctrl/Z 等字符不再生成中断。然后它传递这些字符,内部终端设备“正常”处理它们,生成预期的信号。任何进程都可以选择捕获SIGTSTP
但不能捕获SIGSTOP
。在这些示例中,我用来
$
指示命令行提示符:如果您向
script
自己发送SIGTSTP
信号,它似乎会感到困惑(也许是编程错误?),并且SIGCONT
不会恢复它。但是,发送SIGINT
或某些其他终止信号会恢复script
足够长的时间以操作原始信号SIGTSTP
并暂停。然后尝试恢复script
命令并fg
终止会话:此时
script
接收SIGTSTP
并停止执行其内部流程。随后发送SIGCONT
没有明显的差异。发送
SIGINT
结果如下:然后恢复命令:
在我看来,你最好发送
SIGSTOP
到进程里面script
。这是另一个例子: