我通常在我的计算机上有许多长时间运行的zsh进程(在各种屏幕会话中展开),但是暂时没有使用的
shell往往会被换出.当我切换到这样一个换出的shell并按下回车键(在空提示符下)时,它会在shell响应并显示一个新提示之前花费很多秒(但之后它会恢复正常工作).
为了减轻我的烦恼,我想要一个命令(例如,unwap PID),我可以调用(从另一个已经响应的shell)来强制进行shell交换.
关于如何实现这一点的任何想法?
附:我开始寻找一个命令,要求系统交换任何进程 – 但我没有发现这样的事情,让我相信这是不可能的.我在这里把我的问题集中在zsh上,因为这是我真正感兴趣的情况,我希望可能有针对该特定情况的解决方案.如果你有一个更通用的方法可以适用于任何进程(而不仅仅是zsh),那也是非常受欢迎的.
P.P.S.起初我想在我的shell中使用一个陷阱函数,然后做了一些活动(任何事情)足以使shell交换.然而,尝试使用WINCH信号,我发现它不起作用. (也许信号不会传递给换出的过程?是否有信号?)
编辑:在我的典型情况下,我运行了一堆zsh进程,然后我打开浏览器(有多个Gmail,Facebook等标签)有点太长时间,导致浏览器囤积所有可用的RAM和把所有其他东西都挤进掉掉.桌面没有响应一段时间,但很快就有点清除了.但是,当重新连接到屏幕会话时,必须手动唤醒每个shell(通过它们并在每个shell中按Enter键).
最佳答案 正如在
this answer中提到的,可以使用gdb来转储进程的内存以使其无法被删除.
我还发现here有一个gcore脚本直接从命令行执行此操作(而不是首先必须启动gdb然后在其中执行其他命令),因此调用:
gcore -o /tmp/SOMETHING PID1 PID2 PID3
将导致具有PID1,PID2和PID3的程序变为未刷新,并将其内容转储到文件/tmp/SOMETHING.PID1,/tmp/SOMETHING.PID2等.
在this answer中还有一个Python脚本也可以做同样的事情.虽然 – 不可否认 – 作为对这个问题的回答 – 以更好的方式,因为这个脚本输出STDOUT上的转储,我们可以直接管道地狱(嗯,我的意思是/ dev / null,当然)因为我们只是感兴趣的是无论如何都要保持不懈的副作用.