假设在一个控制台上我运行了 tail -F,实时显示许多日志文件的输出。
然而,有时我也需要在那里运行命令,并简要检查它们的输出,而不会被尾部输出的爆发所淹没。
什么可能是一个巧妙的方法killall -STOP tail
(或者以其他方式暂时地暂停自动地)在与控制台进行一些交互时(或至少按 ENTER 键,这会调用 PROMPT 命令等),并延迟killall -CONT tail
90 秒后最新的 shell 交互?
以前,我一直手动执行:
fg # to tail process
手动按 CTRL Z
run my command,see output
bg # to tail process
答案1
在许多类 Unix 系统(包括 Linux)上,Control+z是挂起进程的键序列 (SIGTSTP) 最常见的默认键盘映射。
fg
将在前台恢复该进程。
编辑
使用blankerprg
screen 中的指令,您可以为您的终端定义一个“屏幕保护程序”程序。您可以使用以下命令从屏幕内以交互方式定义它:
Control+a : blankerprg tail -f /path/to/log
Control+a : idle 10 blanker
闲置 10 秒后,您定义的屏幕保护程序将启动,按任意按键将禁用它。
当然也可以添加这些设置~/.screenrc
。
答案2
您可以停止当前作业(上次停止或恢复的作业):
kill -STOP %%
我认为 bash 不可能在几秒钟不活动后做出反应。在 zsh 中,您可以将该TMOUT
参数设置为一个数字,这会导致 shell在不活动的ALRM
那$TMOUT
几秒后执行陷阱。 (Bash 有一个TMOUT
活动,但它导致 shell 退出。)
以下 zsh 代码片段定义了一个函数,该函数暂停当前后台作业,直到出现 90 秒不活动状态,并将该函数绑定到Ctrl+ X Ctrl+ Z。
suspend_background_job_during_activity () {
job=${1-%%}
kill -STOP $job
TMOUT=90
trap "fg $job; unset TMOUT; trap - ALRM" ALRM
}
zle -N suspend_background_job_during_activity
bindkey '^X^Z' suspend_background_job_during_activity